152 lines
5.4 KiB
JavaScript
152 lines
5.4 KiB
JavaScript
'use strict';
|
|
|
|
/* global angular, $, showdown */
|
|
|
|
// create main application module
|
|
var app = angular.module('Application', ['pascalprecht.translate', 'ngCookies']);
|
|
|
|
app.filter('markdown2html', function () {
|
|
var converter = new showdown.Converter({
|
|
simplifiedAutoLink: true,
|
|
strikethrough: true,
|
|
tables: true,
|
|
openLinksInNewWindow: true
|
|
});
|
|
|
|
return function (text) {
|
|
return converter.makeHtml(text);
|
|
};
|
|
});
|
|
|
|
// disable sce for footer https://code.angularjs.org/1.5.8/docs/api/ng/service/$sce
|
|
app.config(function ($sceProvider) {
|
|
$sceProvider.enabled(false);
|
|
});
|
|
|
|
app.config(['$translateProvider', function ($translateProvider) {
|
|
$translateProvider.useStaticFilesLoader({
|
|
prefix: 'translation/',
|
|
suffix: '.json'
|
|
});
|
|
$translateProvider.useLocalStorage();
|
|
$translateProvider.preferredLanguage('en');
|
|
$translateProvider.fallbackLanguage('en');
|
|
}]);
|
|
|
|
// Add shorthand "tr" filter to avoid having ot use "translate"
|
|
// This is a copy of the code at https://github.com/angular-translate/angular-translate/blob/master/src/filter/translate.js
|
|
// If we find out how to get that function handle somehow dynamically we can use that, otherwise the copy is required
|
|
function translateFilterFactory($parse, $translate) {
|
|
|
|
'use strict';
|
|
|
|
var translateFilter = function (translationId, interpolateParams, interpolation, forceLanguage) {
|
|
if (!angular.isObject(interpolateParams)) {
|
|
var ctx = this || {
|
|
'__SCOPE_IS_NOT_AVAILABLE': 'More info at https://github.com/angular/angular.js/commit/8863b9d04c722b278fa93c5d66ad1e578ad6eb1f'
|
|
};
|
|
interpolateParams = $parse(interpolateParams)(ctx);
|
|
}
|
|
|
|
return $translate.instant(translationId, interpolateParams, interpolation, forceLanguage);
|
|
};
|
|
|
|
if ($translate.statefulFilter()) {
|
|
translateFilter.$stateful = true;
|
|
}
|
|
|
|
return translateFilter;
|
|
}
|
|
translateFilterFactory.displayName = 'translateFilterFactory';
|
|
app.filter('tr', translateFilterFactory);
|
|
|
|
app.controller('SetupAccountController', ['$scope', '$translate', '$http', function ($scope, $translate, $http) {
|
|
// Stupid angular location provider either wants html5 location mode or not, do the query parsing on my own
|
|
const search = decodeURIComponent(window.location.search).slice(1).split('&').map(function (item) { return item.indexOf('=') === -1 ? [item, true] : [item.slice(0, item.indexOf('=')), item.slice(item.indexOf('=')+1)]; }).reduce(function (o, k) { o[k[0]] = k[1]; return o; }, {});
|
|
|
|
const API_ORIGIN = window.cloudronApiOrigin || window.location.origin;
|
|
|
|
$scope.initialized = false;
|
|
$scope.busy = false;
|
|
$scope.error = null;
|
|
$scope.view = 'setup';
|
|
$scope.branding = null;
|
|
$scope.dashboardUrl = '';
|
|
|
|
$scope.profileLocked = !!search.profileLocked;
|
|
$scope.existingUsername = !!search.username;
|
|
$scope.username = search.username || '';
|
|
$scope.displayName = search.displayName || '';
|
|
$scope.password = '';
|
|
$scope.passwordRepeat = '';
|
|
|
|
$scope.onSubmit = function () {
|
|
$scope.busy = true;
|
|
$scope.error = null;
|
|
|
|
var data = {
|
|
inviteToken: search.inviteToken,
|
|
password: $scope.password
|
|
};
|
|
|
|
if (!$scope.profileLocked) {
|
|
if (!$scope.existingUsername) data.username = $scope.username;
|
|
data.displayName = $scope.displayName;
|
|
}
|
|
|
|
function error(data, status) {
|
|
$scope.busy = false;
|
|
|
|
if (status === 401) {
|
|
$scope.view = 'invalidToken';
|
|
} else if (status === 409) {
|
|
$scope.error = {
|
|
username: true,
|
|
message: 'Username already taken'
|
|
};
|
|
$scope.setupAccountForm.username.$setPristine();
|
|
setTimeout(function () { $('#inputUsername').focus(); }, 200);
|
|
} else if (status === 400) {
|
|
$scope.error = {
|
|
message: data.message
|
|
};
|
|
if (data.message.indexOf('Username') === 0) {
|
|
$scope.setupAccountForm.username.$setPristine();
|
|
$scope.error.username = true;
|
|
}
|
|
} else {
|
|
$scope.error = { message: 'Unknown error. Please try again later.' };
|
|
console.error(status, data);
|
|
}
|
|
}
|
|
|
|
$http.post(API_ORIGIN + '/api/v1/auth/setup_account', data).success(function (data, status) {
|
|
if (status !== 201) return error(data, status);
|
|
|
|
// set token to autologin on first oidc flow
|
|
localStorage.cloudronFirstTimeToken = data.accessToken;
|
|
|
|
$scope.dashboardUrl = '/openid/auth?client_id=cid-webadmin&scope=openid email profile&response_type=code token&redirect_uri=' + window.location.origin + '/authcallback.html';
|
|
|
|
$scope.view = 'done';
|
|
}).error(error);
|
|
};
|
|
|
|
if (!$scope.existingUsername && $scope.profileLocked) {
|
|
$scope.view = 'noUsername';
|
|
$scope.initialized = true;
|
|
} else {
|
|
$http.get(API_ORIGIN + '/api/v1/auth/branding').success(function (data, status) {
|
|
$scope.initialized = true;
|
|
|
|
if (status !== 200) return;
|
|
|
|
if (data.language) $translate.use(data.language);
|
|
|
|
$scope.branding = data;
|
|
}).error(function () {
|
|
$scope.initialized = false;
|
|
});
|
|
}
|
|
}]);
|