blob: d6b66fa58d0862ec9063a49369157eb659aa1cb9 [file] [log] [blame]
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
angular.module('zeppelinWebApp').controller('NavCtrl', NavCtrl);
function NavCtrl($scope, $rootScope, $http, $routeParams, $location,
noteListFactory, baseUrlSrv, websocketMsgSrv,
arrayOrderingSrv, searchService, TRASH_FOLDER_ID) {
'ngInject';
let vm = this;
vm.arrayOrderingSrv = arrayOrderingSrv;
vm.connected = websocketMsgSrv.isConnected();
vm.isActive = isActive;
vm.logout = logout;
vm.notes = noteListFactory;
vm.search = search;
vm.searchForm = searchService;
vm.showLoginWindow = showLoginWindow;
vm.TRASH_FOLDER_ID = TRASH_FOLDER_ID;
vm.isFilterNote = isFilterNote;
vm.numberOfNotesDisplayed = 10;
let revisionSupported = false;
$scope.query = {q: ''};
initController();
function getZeppelinVersion() {
$http.get(baseUrlSrv.getRestApiBase() + '/version').success(
function(data, status, headers, config) {
$rootScope.zeppelinVersion = data.body.version;
}).error(
function(data, status, headers, config) {
console.log('Error %o %o', status, data.message);
});
}
function getClusterAddr() {
$http.get(baseUrlSrv.getRestApiBase() + '/cluster/address').success(
function(data, status, headers, config) {
$rootScope.clusterAddr = data.body.clusterAddr;
}).error(
function(data, status, headers, config) {
console.log('Error %o %o', status, data.message);
});
}
function initController() {
$scope.isDrawNavbarNoteList = false;
angular.element('#notebook-list').perfectScrollbar({suppressScrollX: true});
angular.element(document).click(function() {
$scope.query.q = '';
});
getZeppelinVersion();
getClusterAddr();
loadNotes();
}
function isFilterNote(note) {
if (!$scope.query.q) {
return true;
}
let noteName = note.name;
if (noteName.toLowerCase().indexOf($scope.query.q.toLowerCase()) > -1) {
return true;
}
return false;
}
function isActive(noteId) {
return ($routeParams.noteId === noteId);
}
function listConfigurations() {
websocketMsgSrv.listConfigurations();
}
function loadNotes() {
websocketMsgSrv.getNoteList();
}
function getHomeNote() {
websocketMsgSrv.getHomeNote();
}
function logout() {
let logoutURL = baseUrlSrv.getRestApiBase() + '/login/logout';
$http.post(logoutURL).then(function() {}, function(response) {
let clearAuthorizationHeader = 'true';
if (response.data) {
let res = angular.fromJson(response.data).body;
if (res['redirectURL']) {
if (res['isLogoutAPI'] === 'true') {
$http.get(res['redirectURL']).then(function() {
}, function() {
window.location = baseUrlSrv.getBase();
});
} else {
window.location.href = res['redirectURL'] + window.location.href;
}
return undefined;
}
if (res['clearAuthorizationHeader']) {
clearAuthorizationHeader = res['clearAuthorizationHeader'];
}
}
// force authcBasic (if configured) to logout
if (clearAuthorizationHeader === 'true') {
if (detectIE()) {
let outcome;
try {
outcome = document.execCommand('ClearAuthenticationCache');
} catch (e) {
console.log(e);
}
if (!outcome) {
// Let's create an xmlhttp object
outcome = (function(x) {
if (x) {
// the reason we use "random" value for password is
// that browsers cache requests. changing
// password effectively behaves like cache-busing.
x.open('HEAD', location.href, true, 'logout',
(new Date()).getTime().toString());
x.send('');
// x.abort()
return 1; // this is **speculative** "We are done."
} else {
// eslint-disable-next-line no-useless-return
return;
}
})(window.XMLHttpRequest ? new window.XMLHttpRequest()
// eslint-disable-next-line no-undef
: (window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : u));
}
if (!outcome) {
let m = 'Your browser is too old or too weird to support log out functionality. Close all windows and ' +
'restart the browser.';
alert(m);
}
} else {
// for firefox and safari
logoutURL = logoutURL.replace('//', '//false:false@');
}
}
$http.post(logoutURL).error(function() {
$rootScope.userName = '';
$rootScope.ticket.principal = '';
$rootScope.ticket.screenUsername = '';
$rootScope.ticket.ticket = '';
$rootScope.ticket.roles = '';
BootstrapDialog.show({
message: 'Logout Success',
});
setTimeout(function() {
window.location = baseUrlSrv.getBase();
}, 1000);
});
});
}
function detectIE() {
let ua = window.navigator.userAgent;
let msie = ua.indexOf('MSIE ');
if (msie > 0) {
// IE 10 or older => return version number
return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
}
let trident = ua.indexOf('Trident/');
if (trident > 0) {
// IE 11 => return version number
let rv = ua.indexOf('rv:');
return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
}
let edge = ua.indexOf('Edge/');
if (edge > 0) {
// Edge (IE 12+) => return version number
return parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
}
// other browser
return false;
}
function search(searchTerm) {
$location.path('/search/' + searchTerm);
}
function showLoginWindow() {
setTimeout(function() {
angular.element('#userName').focus();
}, 500);
}
/*
** $scope.$on functions below
*/
$scope.$on('setNoteMenu', function(event, notes) {
noteListFactory.setNotes(notes);
initNotebookListEventListener();
});
$scope.$on('setConnectedStatus', function(event, param) {
vm.connected = param;
});
$scope.$on('loginSuccess', function(event, param) {
$rootScope.ticket.screenUsername = $rootScope.ticket.principal;
listConfigurations();
loadNotes();
getHomeNote();
});
/*
** Performance optimization for Browser Render.
*/
function initNotebookListEventListener() {
angular.element(document).ready(function() {
angular.element('.notebook-list-dropdown').on('show.bs.dropdown', function() {
$scope.isDrawNavbarNoteList = true;
});
angular.element('.notebook-list-dropdown').on('hide.bs.dropdown', function() {
$scope.isDrawNavbarNoteList = false;
});
});
}
$scope.loadMoreNotes = function() {
vm.numberOfNotesDisplayed += 10;
};
$scope.calculateTooltipPlacement = function(note) {
if (note !== undefined && note.name !== undefined) {
let length = note.name.length;
if (length < 2) {
return 'top-left';
} else if (length > 7) {
return 'top-right';
}
}
return 'top';
};
$scope.$on('configurationsInfo', function(scope, event) {
// Server send this parameter is String
if(event.configurations['isRevisionSupported']==='true') {
revisionSupported = true;
}
});
$rootScope.isRevisionSupported = function() {
return revisionSupported;
};
}