http://git-wip-us.apache.org/repos/asf/zeppelin/blob/19b0f30f/zeppelin-web/src/app/notebook/notebook.controller.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/app/notebook/notebook.controller.js b/zeppelin-web/src/app/notebook/notebook.controller.js index 1322419..e481e9b 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.js @@ -12,25 +12,25 @@ * limitations under the License. */ -import { isParagraphRunning, } from './paragraph/paragraph.status'; +import { isParagraphRunning, } from './paragraph/paragraph.status' -angular.module('zeppelinWebApp').controller('NotebookCtrl', NotebookCtrl); +angular.module('zeppelinWebApp').controller('NotebookCtrl', NotebookCtrl) -function NotebookCtrl($scope, $route, $routeParams, $location, $rootScope, +function NotebookCtrl ($scope, $route, $routeParams, $location, $rootScope, $http, websocketMsgSrv, baseUrlSrv, $timeout, saveAsService, ngToast, noteActionSrv, noteVarShareService, TRASH_FOLDER_ID, heliumService) { - 'ngInject'; + 'ngInject' - ngToast.dismiss(); + ngToast.dismiss() - $scope.note = null; - $scope.moment = moment; - $scope.editorToggled = false; - $scope.tableToggled = false; - $scope.viewOnly = false; - $scope.showSetting = false; - $scope.looknfeelOption = ['default', 'simple', 'report']; + $scope.note = null + $scope.moment = moment + $scope.editorToggled = false + $scope.tableToggled = false + $scope.viewOnly = false + $scope.showSetting = false + $scope.looknfeelOption = ['default', 'simple', 'report'] $scope.cronOption = [ {name: 'None', value: undefined}, {name: '1m', value: '0 0/1 * * * ?'}, @@ -40,50 +40,50 @@ function NotebookCtrl($scope, $route, $routeParams, $location, $rootScope, {name: '6h', value: '0 0 0/6 * * ?'}, {name: '12h', value: '0 0 0/12 * * ?'}, {name: '1d', value: '0 0 0 * * ?'} - ]; + ] - $scope.interpreterSettings = []; - $scope.interpreterBindings = []; - $scope.isNoteDirty = null; - $scope.saveTimer = null; + $scope.interpreterSettings = [] + $scope.interpreterBindings = [] + $scope.isNoteDirty = null + $scope.saveTimer = null - var connectedOnce = false; - var isRevisionPath = function(path) { - var pattern = new RegExp('^.*\/notebook\/[a-zA-Z0-9_]*\/revision\/[a-zA-Z0-9_]*'); - return pattern.test(path); - }; + let connectedOnce = false + let isRevisionPath = function (path) { + let pattern = new RegExp('^.*\/notebook\/[a-zA-Z0-9_]*\/revision\/[a-zA-Z0-9_]*') + return pattern.test(path) + } - $scope.noteRevisions = []; - $scope.currentRevision = 'Head'; - $scope.revisionView = isRevisionPath($location.path()); + $scope.noteRevisions = [] + $scope.currentRevision = 'Head' + $scope.revisionView = isRevisionPath($location.path()) - $scope.$on('setConnectedStatus', function(event, param) { + $scope.$on('setConnectedStatus', function (event, param) { if (connectedOnce && param) { - initNotebook(); + initNotebook() } - connectedOnce = true; - }); + connectedOnce = true + }) - $scope.getCronOptionNameFromValue = function(value) { + $scope.getCronOptionNameFromValue = function (value) { if (!value) { - return ''; + return '' } - for (var o in $scope.cronOption) { + for (let o in $scope.cronOption) { if ($scope.cronOption[o].value === value) { - return $scope.cronOption[o].name; + return $scope.cronOption[o].name } } - return value; - }; + return value + } - $scope.blockAnonUsers = function() { - var zeppelinVersion = $rootScope.zeppelinVersion; - var url = 'https://zeppelin.apache.org/docs/' + zeppelinVersion + '/security/notebook_authorization.html'; - var content = 'Only authenticated user can set the permission.' + + $scope.blockAnonUsers = function () { + let zeppelinVersion = $rootScope.zeppelinVersion + let url = 'https://zeppelin.apache.org/docs/' + zeppelinVersion + '/security/notebook_authorization.html' + let content = 'Only authenticated user can set the permission.' + '<a data-toggle="tooltip" data-placement="top" title="Learn more" target="_blank" href=' + url + '>' + '<i class="icon-question" />' + - '</a>'; + '</a>' BootstrapDialog.show({ closable: false, closeByBackdrop: false, @@ -92,187 +92,189 @@ function NotebookCtrl($scope, $route, $routeParams, $location, $rootScope, message: content, buttons: [{ label: 'Close', - action: function(dialog) { - dialog.close(); + action: function (dialog) { + dialog.close() } }] - }); - }; + }) + } /** Init the new controller */ - var initNotebook = function() { - noteVarShareService.clear(); + const initNotebook = function () { + noteVarShareService.clear() if ($routeParams.revisionId) { - websocketMsgSrv.getNoteByRevision($routeParams.noteId, $routeParams.revisionId); + websocketMsgSrv.getNoteByRevision($routeParams.noteId, $routeParams.revisionId) } else { - websocketMsgSrv.getNote($routeParams.noteId); + websocketMsgSrv.getNote($routeParams.noteId) } - websocketMsgSrv.listRevisionHistory($routeParams.noteId); - var currentRoute = $route.current; + websocketMsgSrv.listRevisionHistory($routeParams.noteId) + let currentRoute = $route.current if (currentRoute) { setTimeout( - function() { - var routeParams = currentRoute.params; - var $id = angular.element('#' + routeParams.paragraph + '_container'); + function () { + let routeParams = currentRoute.params + let $id = angular.element('#' + routeParams.paragraph + '_container') if ($id.length > 0) { // adjust for navbar - var top = $id.offset().top - 103; - angular.element('html, body').scrollTo({top: top, left: 0}); + let top = $id.offset().top - 103 + angular.element('html, body').scrollTo({top: top, left: 0}) } }, 1000 - ); + ) } - }; + } - initNotebook(); + initNotebook() - $scope.focusParagraphOnClick = function(clickEvent) { + $scope.focusParagraphOnClick = function (clickEvent) { if (!$scope.note) { - return; + return } - for (var i = 0; i < $scope.note.paragraphs.length; i++) { - var paragraphId = $scope.note.paragraphs[i].id; + for (let i = 0; i < $scope.note.paragraphs.length; i++) { + let paragraphId = $scope.note.paragraphs[i].id if (jQuery.contains(angular.element('#' + paragraphId + '_container')[0], clickEvent.target)) { - $scope.$broadcast('focusParagraph', paragraphId, 0, true); - break; + $scope.$broadcast('focusParagraph', paragraphId, 0, true) + break } } - }; + } // register mouseevent handler for focus paragraph - document.addEventListener('click', $scope.focusParagraphOnClick); + document.addEventListener('click', $scope.focusParagraphOnClick) - $scope.keyboardShortcut = function(keyEvent) { + $scope.keyboardShortcut = function (keyEvent) { // handle keyevent if (!$scope.viewOnly && !$scope.revisionView) { - $scope.$broadcast('keyEvent', keyEvent); + $scope.$broadcast('keyEvent', keyEvent) } - }; + } // register mouseevent handler for focus paragraph - document.addEventListener('keydown', $scope.keyboardShortcut); + document.addEventListener('keydown', $scope.keyboardShortcut) - $scope.paragraphOnDoubleClick = function(paragraphId) { - $scope.$broadcast('doubleClickParagraph', paragraphId); - }; + $scope.paragraphOnDoubleClick = function (paragraphId) { + $scope.$broadcast('doubleClickParagraph', paragraphId) + } // Move the note to trash and go back to the main page - $scope.moveNoteToTrash = function(noteId) { - noteActionSrv.moveNoteToTrash(noteId, true); - }; + $scope.moveNoteToTrash = function (noteId) { + noteActionSrv.moveNoteToTrash(noteId, true) + } // Remove the note permanently if it's in the trash - $scope.removeNote = function(noteId) { - noteActionSrv.removeNote(noteId, true); - }; - - $scope.isTrash = function(note) { - return note ? note.name.split('/')[0] === TRASH_FOLDER_ID : false; - }; - - //Export notebook - $scope.exportNote = function() { - var jsonContent = JSON.stringify($scope.note); - saveAsService.saveAs(jsonContent, $scope.note.name, 'json'); - }; - - //Clone note - $scope.cloneNote = function(noteId) { + $scope.removeNote = function (noteId) { + noteActionSrv.removeNote(noteId, true) + } + + $scope.isTrash = function (note) { + return note ? note.name.split('/')[0] === TRASH_FOLDER_ID : false + } + + // Export notebook + $scope.exportNote = function () { + let jsonContent = JSON.stringify($scope.note) + saveAsService.saveAs(jsonContent, $scope.note.name, 'json') + } + + // Clone note + $scope.cloneNote = function (noteId) { BootstrapDialog.confirm({ closable: true, title: '', message: 'Do you want to clone this note?', - callback: function(result) { + callback: function (result) { if (result) { - websocketMsgSrv.cloneNote(noteId); - $location.path('/'); + websocketMsgSrv.cloneNote(noteId) + $location.path('/') } } - }); - }; + }) + } // checkpoint/commit notebook - $scope.checkpointNote = function(commitMessage) { + $scope.checkpointNote = function (commitMessage) { BootstrapDialog.confirm({ closable: true, title: '', message: 'Commit note to current repository?', - callback: function(result) { + callback: function (result) { if (result) { - websocketMsgSrv.checkpointNote($routeParams.noteId, commitMessage); + websocketMsgSrv.checkpointNote($routeParams.noteId, commitMessage) } } - }); - document.getElementById('note.checkpoint.message').value = ''; - }; + }) + document.getElementById('note.checkpoint.message').value = '' + } // set notebook head to given revision - $scope.setNoteRevision = function() { + $scope.setNoteRevision = function () { BootstrapDialog.confirm({ closable: true, title: '', message: 'Set notebook head to current revision?', - callback: function(result) { + callback: function (result) { if (result) { - websocketMsgSrv.setNoteRevision($routeParams.noteId, $routeParams.revisionId); + websocketMsgSrv.setNoteRevision($routeParams.noteId, $routeParams.revisionId) } } - }); - }; + }) + } - $scope.$on('listRevisionHistory', function(event, data) { - console.log('received list of revisions %o', data); - $scope.noteRevisions = data.revisionList; + $scope.$on('listRevisionHistory', function (event, data) { + console.log('received list of revisions %o', data) + $scope.noteRevisions = data.revisionList $scope.noteRevisions.splice(0, 0, { id: 'Head', message: 'Head' - }); + }) if ($routeParams.revisionId) { - var index = _.findIndex($scope.noteRevisions, {'id': $routeParams.revisionId}); + let index = _.findIndex($scope.noteRevisions, {'id': $routeParams.revisionId}) if (index > -1) { - $scope.currentRevision = $scope.noteRevisions[index].message; + $scope.currentRevision = $scope.noteRevisions[index].message } } - }); + }) - $scope.$on('noteRevision', function(event, data) { - console.log('received note revision %o', data); + $scope.$on('noteRevision', function (event, data) { + console.log('received note revision %o', data) if (data.note) { - $scope.note = data.note; - initializeLookAndFeel(); + $scope.note = data.note + initializeLookAndFeel() } else { - $location.path('/'); + $location.path('/') } - }); + }) - $scope.$on('setNoteRevisionResult', function(event, data) { - console.log('received set note revision result %o', data); + $scope.$on('setNoteRevisionResult', function (event, data) { + console.log('received set note revision result %o', data) if (data.status) { - $location.path('/notebook/' + $routeParams.noteId); + $location.path('/notebook/' + $routeParams.noteId) } - }); + }) - $scope.visitRevision = function(revision) { + $scope.visitRevision = function (revision) { if (revision.id) { if (revision.id === 'Head') { - $location.path('/notebook/' + $routeParams.noteId); + $location.path('/notebook/' + $routeParams.noteId) } else { - $location.path('/notebook/' + $routeParams.noteId + '/revision/' + revision.id); + $location.path('/notebook/' + $routeParams.noteId + '/revision/' + revision.id) } } else { ngToast.danger({content: 'There is a problem with this Revision', - verticalPosition: 'top', dismissOnTimeout: false}); + verticalPosition: 'top', + dismissOnTimeout: false + }) } - }; + } - $scope.runAllParagraphs = function(noteId) { + $scope.runAllParagraphs = function (noteId) { BootstrapDialog.confirm({ closable: true, title: '', message: 'Run all paragraphs?', - callback: function(result) { + callback: function (result) { if (result) { const paragraphs = $scope.note.paragraphs.map(p => { return { @@ -281,439 +283,439 @@ function NotebookCtrl($scope, $route, $routeParams, $location, $rootScope, paragraph: p.text, config: p.config, params: p.settings.params - }; - }); - websocketMsgSrv.runAllParagraphs(noteId, paragraphs); + } + }) + websocketMsgSrv.runAllParagraphs(noteId, paragraphs) } } - }); - }; + }) + } - $scope.saveNote = function() { + $scope.saveNote = function () { if ($scope.note && $scope.note.paragraphs) { - _.forEach($scope.note.paragraphs, function(par) { + _.forEach($scope.note.paragraphs, function (par) { angular .element('#' + par.id + '_paragraphColumn_main') .scope() - .saveParagraph(par); - }); - $scope.isNoteDirty = null; + .saveParagraph(par) + }) + $scope.isNoteDirty = null } - }; + } - $scope.clearAllParagraphOutput = function(noteId) { - noteActionSrv.clearAllParagraphOutput(noteId); - }; + $scope.clearAllParagraphOutput = function (noteId) { + noteActionSrv.clearAllParagraphOutput(noteId) + } - $scope.toggleAllEditor = function() { + $scope.toggleAllEditor = function () { if ($scope.editorToggled) { - $scope.$broadcast('openEditor'); + $scope.$broadcast('openEditor') } else { - $scope.$broadcast('closeEditor'); + $scope.$broadcast('closeEditor') } - $scope.editorToggled = !$scope.editorToggled; - }; + $scope.editorToggled = !$scope.editorToggled + } - $scope.showAllEditor = function() { - $scope.$broadcast('openEditor'); - }; + $scope.showAllEditor = function () { + $scope.$broadcast('openEditor') + } - $scope.hideAllEditor = function() { - $scope.$broadcast('closeEditor'); - }; + $scope.hideAllEditor = function () { + $scope.$broadcast('closeEditor') + } - $scope.toggleAllTable = function() { + $scope.toggleAllTable = function () { if ($scope.tableToggled) { - $scope.$broadcast('openTable'); + $scope.$broadcast('openTable') } else { - $scope.$broadcast('closeTable'); + $scope.$broadcast('closeTable') } - $scope.tableToggled = !$scope.tableToggled; - }; + $scope.tableToggled = !$scope.tableToggled + } - $scope.showAllTable = function() { - $scope.$broadcast('openTable'); - }; + $scope.showAllTable = function () { + $scope.$broadcast('openTable') + } - $scope.hideAllTable = function() { - $scope.$broadcast('closeTable'); - }; + $scope.hideAllTable = function () { + $scope.$broadcast('closeTable') + } /** * @returns {boolean} true if one more paragraphs are running. otherwise return false. */ - $scope.isNoteRunning = function() { - if (!$scope.note) { return false; } + $scope.isNoteRunning = function () { + if (!$scope.note) { return false } for (let i = 0; i < $scope.note.paragraphs.length; i++) { if (isParagraphRunning($scope.note.paragraphs[i])) { - return true; + return true } } - return false; - }; + return false + } - $scope.killSaveTimer = function() { + $scope.killSaveTimer = function () { if ($scope.saveTimer) { - $timeout.cancel($scope.saveTimer); - $scope.saveTimer = null; - } - }; - - $scope.startSaveTimer = function() { - $scope.killSaveTimer(); - $scope.isNoteDirty = true; - //console.log('startSaveTimer called ' + $scope.note.id); - $scope.saveTimer = $timeout(function() { - $scope.saveNote(); - }, 10000); - }; - - angular.element(window).on('beforeunload', function(e) { - $scope.killSaveTimer(); - $scope.saveNote(); - }); - - $scope.setLookAndFeel = function(looknfeel) { - $scope.note.config.looknfeel = looknfeel; + $timeout.cancel($scope.saveTimer) + $scope.saveTimer = null + } + } + + $scope.startSaveTimer = function () { + $scope.killSaveTimer() + $scope.isNoteDirty = true + // console.log('startSaveTimer called ' + $scope.note.id); + $scope.saveTimer = $timeout(function () { + $scope.saveNote() + }, 10000) + } + + angular.element(window).on('beforeunload', function (e) { + $scope.killSaveTimer() + $scope.saveNote() + }) + + $scope.setLookAndFeel = function (looknfeel) { + $scope.note.config.looknfeel = looknfeel if ($scope.revisionView === true) { - $rootScope.$broadcast('setLookAndFeel', $scope.note.config.looknfeel); + $rootScope.$broadcast('setLookAndFeel', $scope.note.config.looknfeel) } else { - $scope.setConfig(); + $scope.setConfig() } - }; + } /** Set cron expression for this note **/ - $scope.setCronScheduler = function(cronExpr) { + $scope.setCronScheduler = function (cronExpr) { if (cronExpr) { if (!$scope.note.config.cronExecutingUser) { - $scope.note.config.cronExecutingUser = $rootScope.ticket.principal; + $scope.note.config.cronExecutingUser = $rootScope.ticket.principal } } else { - $scope.note.config.cronExecutingUser = ''; + $scope.note.config.cronExecutingUser = '' } - $scope.note.config.cron = cronExpr; - $scope.setConfig(); - }; + $scope.note.config.cron = cronExpr + $scope.setConfig() + } /** Set the username of the user to be used to execute all notes in notebook **/ - $scope.setCronExecutingUser = function(cronExecutingUser) { - $scope.note.config.cronExecutingUser = cronExecutingUser; - $scope.setConfig(); - }; + $scope.setCronExecutingUser = function (cronExecutingUser) { + $scope.note.config.cronExecutingUser = cronExecutingUser + $scope.setConfig() + } /** Set release resource for this note **/ - $scope.setReleaseResource = function(value) { - $scope.note.config.releaseresource = value; - $scope.setConfig(); - }; + $scope.setReleaseResource = function (value) { + $scope.note.config.releaseresource = value + $scope.setConfig() + } /** Update note config **/ - $scope.setConfig = function(config) { + $scope.setConfig = function (config) { if (config) { - $scope.note.config = config; + $scope.note.config = config } - websocketMsgSrv.updateNote($scope.note.id, $scope.note.name, $scope.note.config); - }; + websocketMsgSrv.updateNote($scope.note.id, $scope.note.name, $scope.note.config) + } /** Update the note name */ - $scope.updateNoteName = function(newName) { - const trimmedNewName = newName.trim(); + $scope.updateNoteName = function (newName) { + const trimmedNewName = newName.trim() if (trimmedNewName.length > 0 && $scope.note.name !== trimmedNewName) { - $scope.note.name = trimmedNewName; - websocketMsgSrv.renameNote($scope.note.id, $scope.note.name); + $scope.note.name = trimmedNewName + websocketMsgSrv.renameNote($scope.note.id, $scope.note.name) } - }; + } - var initializeLookAndFeel = function() { + const initializeLookAndFeel = function () { if (!$scope.note.config.looknfeel) { - $scope.note.config.looknfeel = 'default'; + $scope.note.config.looknfeel = 'default' } else { - $scope.viewOnly = $scope.note.config.looknfeel === 'report' ? true : false; + $scope.viewOnly = $scope.note.config.looknfeel === 'report' ? true : false } if ($scope.note.paragraphs && $scope.note.paragraphs[0]) { - $scope.note.paragraphs[0].focus = true; - } - $rootScope.$broadcast('setLookAndFeel', $scope.note.config.looknfeel); - }; - - var cleanParagraphExcept = function(paragraphId, note) { - var noteCopy = {}; - noteCopy.id = note.id; - noteCopy.name = note.name; - noteCopy.config = note.config; - noteCopy.info = note.info; - noteCopy.paragraphs = []; - for (var i = 0; i < note.paragraphs.length; i++) { + $scope.note.paragraphs[0].focus = true + } + $rootScope.$broadcast('setLookAndFeel', $scope.note.config.looknfeel) + } + + let cleanParagraphExcept = function (paragraphId, note) { + let noteCopy = {} + noteCopy.id = note.id + noteCopy.name = note.name + noteCopy.config = note.config + noteCopy.info = note.info + noteCopy.paragraphs = [] + for (let i = 0; i < note.paragraphs.length; i++) { if (note.paragraphs[i].id === paragraphId) { - noteCopy.paragraphs[0] = note.paragraphs[i]; + noteCopy.paragraphs[0] = note.paragraphs[i] if (!noteCopy.paragraphs[0].config) { - noteCopy.paragraphs[0].config = {}; + noteCopy.paragraphs[0].config = {} } - noteCopy.paragraphs[0].config.editorHide = true; - noteCopy.paragraphs[0].config.tableHide = false; - break; + noteCopy.paragraphs[0].config.editorHide = true + noteCopy.paragraphs[0].config.tableHide = false + break } } - return noteCopy; - }; + return noteCopy + } - var addPara = function(paragraph, index) { - $scope.note.paragraphs.splice(index, 0, paragraph); - _.each($scope.note.paragraphs, function(para) { + let addPara = function (paragraph, index) { + $scope.note.paragraphs.splice(index, 0, paragraph) + _.each($scope.note.paragraphs, function (para) { if (para.id === paragraph.id) { - para.focus = true; - $scope.$broadcast('focusParagraph', para.id, 0, false); + para.focus = true + $scope.$broadcast('focusParagraph', para.id, 0, false) } - }); - }; + }) + } - var removePara = function(paragraphId) { - var removeIdx; - _.each($scope.note.paragraphs, function(para, idx) { + let removePara = function (paragraphId) { + let removeIdx + _.each($scope.note.paragraphs, function (para, idx) { if (para.id === paragraphId) { - removeIdx = idx; + removeIdx = idx } - }); - return $scope.note.paragraphs.splice(removeIdx, 1); - }; + }) + return $scope.note.paragraphs.splice(removeIdx, 1) + } - $scope.$on('addParagraph', function(event, paragraph, index) { + $scope.$on('addParagraph', function (event, paragraph, index) { if ($scope.paragraphUrl) { - return; + return } - addPara(paragraph, index); - }); + addPara(paragraph, index) + }) - $scope.$on('removeParagraph', function(event, paragraphId) { + $scope.$on('removeParagraph', function (event, paragraphId) { if ($scope.paragraphUrl) { - return; + return } - removePara(paragraphId); - }); + removePara(paragraphId) + }) - $scope.$on('moveParagraph', function(event, paragraphId, newIdx) { - var removedPara = removePara(paragraphId); + $scope.$on('moveParagraph', function (event, paragraphId, newIdx) { + let removedPara = removePara(paragraphId) if (removedPara && removedPara.length === 1) { - addPara(removedPara[0], newIdx); + addPara(removedPara[0], newIdx) } - }); + }) - $scope.$on('updateNote', function(event, name, config, info) { + $scope.$on('updateNote', function (event, name, config, info) { /** update Note name */ if (name !== $scope.note.name) { - console.log('change note name to : %o', $scope.note.name); - $scope.note.name = name; + console.log('change note name to : %o', $scope.note.name) + $scope.note.name = name } - $scope.note.config = config; - $scope.note.info = info; - initializeLookAndFeel(); - }); + $scope.note.config = config + $scope.note.info = info + initializeLookAndFeel() + }) - var getInterpreterBindings = function() { - websocketMsgSrv.getInterpreterBindings($scope.note.id); - }; + let getInterpreterBindings = function () { + websocketMsgSrv.getInterpreterBindings($scope.note.id) + } - $scope.$on('interpreterBindings', function(event, data) { - $scope.interpreterBindings = data.interpreterBindings; - $scope.interpreterBindingsOrig = angular.copy($scope.interpreterBindings); // to check dirty + $scope.$on('interpreterBindings', function (event, data) { + $scope.interpreterBindings = data.interpreterBindings + $scope.interpreterBindingsOrig = angular.copy($scope.interpreterBindings) // to check dirty - var selected = false; - var key; - var setting; + let selected = false + let key + let setting for (key in $scope.interpreterBindings) { - setting = $scope.interpreterBindings[key]; + setting = $scope.interpreterBindings[key] if (setting.selected) { - selected = true; - break; + selected = true + break } } if (!selected) { // make default selection - var selectedIntp = {}; + let selectedIntp = {} for (key in $scope.interpreterBindings) { - setting = $scope.interpreterBindings[key]; + setting = $scope.interpreterBindings[key] if (!selectedIntp[setting.name]) { - setting.selected = true; - selectedIntp[setting.name] = true; + setting.selected = true + selectedIntp[setting.name] = true } } - $scope.showSetting = true; + $scope.showSetting = true } - }); + }) $scope.interpreterSelectionListeners = { - accept: function(sourceItemHandleScope, destSortableScope) {return true;}, - itemMoved: function(event) {}, - orderChanged: function(event) {} - }; + accept: function (sourceItemHandleScope, destSortableScope) { return true }, + itemMoved: function (event) {}, + orderChanged: function (event) {} + } - $scope.openSetting = function() { - $scope.showSetting = true; - getInterpreterBindings(); - }; + $scope.openSetting = function () { + $scope.showSetting = true + getInterpreterBindings() + } - $scope.closeSetting = function() { + $scope.closeSetting = function () { if (isSettingDirty()) { BootstrapDialog.confirm({ closable: true, title: '', message: 'Interpreter setting changes will be discarded.', - callback: function(result) { + callback: function (result) { if (result) { - $scope.$apply(function() { - $scope.showSetting = false; - }); + $scope.$apply(function () { + $scope.showSetting = false + }) } } - }); + }) } else { - $scope.showSetting = false; + $scope.showSetting = false } - }; + } - $scope.saveSetting = function() { - var selectedSettingIds = []; - for (var no in $scope.interpreterBindings) { - var setting = $scope.interpreterBindings[no]; + $scope.saveSetting = function () { + let selectedSettingIds = [] + for (let no in $scope.interpreterBindings) { + let setting = $scope.interpreterBindings[no] if (setting.selected) { - selectedSettingIds.push(setting.id); + selectedSettingIds.push(setting.id) } } - websocketMsgSrv.saveInterpreterBindings($scope.note.id, selectedSettingIds); - console.log('Interpreter bindings %o saved', selectedSettingIds); + websocketMsgSrv.saveInterpreterBindings($scope.note.id, selectedSettingIds) + console.log('Interpreter bindings %o saved', selectedSettingIds) - _.forEach($scope.note.paragraphs, function(n, key) { - var regExp = /^\s*%/g; + _.forEach($scope.note.paragraphs, function (n, key) { + let regExp = /^\s*%/g if (n.text && !regExp.exec(n.text)) { - $scope.$broadcast('saveInterpreterBindings', n.id); + $scope.$broadcast('saveInterpreterBindings', n.id) } - }); + }) - $scope.showSetting = false; - }; + $scope.showSetting = false + } - $scope.toggleSetting = function() { + $scope.toggleSetting = function () { if ($scope.showSetting) { - $scope.closeSetting(); + $scope.closeSetting() } else { - $scope.openSetting(); - $scope.closePermissions(); - angular.element('html, body').animate({ scrollTop: 0 }, 'slow'); + $scope.openSetting() + $scope.closePermissions() + angular.element('html, body').animate({ scrollTop: 0 }, 'slow') } - }; + } - var getPermissions = function(callback) { - $http.get(baseUrlSrv.getRestApiBase() + '/notebook/' + $scope.note.id + '/permissions'). - success(function(data, status, headers, config) { - $scope.permissions = data.body; - $scope.permissionsOrig = angular.copy($scope.permissions); // to check dirty + let getPermissions = function (callback) { + $http.get(baseUrlSrv.getRestApiBase() + '/notebook/' + $scope.note.id + '/permissions') + .success(function (data, status, headers, config) { + $scope.permissions = data.body + $scope.permissionsOrig = angular.copy($scope.permissions) // to check dirty - var selectJson = { + let selectJson = { tokenSeparators: [',', ' '], ajax: { - url: function(params) { + url: function (params) { if (!params.term) { - return false; + return false } - return baseUrlSrv.getRestApiBase() + '/security/userlist/' + params.term; + return baseUrlSrv.getRestApiBase() + '/security/userlist/' + params.term }, delay: 250, - processResults: function(data, params) { - var results = []; + processResults: function (data, params) { + let results = [] if (data.body.users.length !== 0) { - var users = []; - for (var len = 0; len < data.body.users.length; len++) { + let users = [] + for (let len = 0; len < data.body.users.length; len++) { users.push({ 'id': data.body.users[len], 'text': data.body.users[len] - }); + }) } results.push({ 'text': 'Users :', 'children': users - }); + }) } if (data.body.roles.length !== 0) { - var roles = []; - for (var len = 0; len < data.body.roles.length; len++) { + let roles = [] + for (let len = 0; len < data.body.roles.length; len++) { roles.push({ 'id': data.body.roles[len], 'text': data.body.roles[len] - }); + }) } results.push({ 'text': 'Roles :', 'children': roles - }); + }) } return { results: results, pagination: { more: false } - }; + } }, cache: false }, width: ' ', tags: true, minimumInputLength: 3 - }; + } - $scope.setIamOwner(); - angular.element('#selectOwners').select2(selectJson); - angular.element('#selectReaders').select2(selectJson); - angular.element('#selectWriters').select2(selectJson); + $scope.setIamOwner() + angular.element('#selectOwners').select2(selectJson) + angular.element('#selectReaders').select2(selectJson) + angular.element('#selectWriters').select2(selectJson) if (callback) { - callback(); + callback() } - }). - error(function(data, status, headers, config) { + }) + .error(function (data, status, headers, config) { if (status !== 0) { - console.log('Error %o %o', status, data.message); + console.log('Error %o %o', status, data.message) } - }); - }; + }) + } - $scope.openPermissions = function() { - $scope.showPermissions = true; - getPermissions(); - }; + $scope.openPermissions = function () { + $scope.showPermissions = true + getPermissions() + } - $scope.closePermissions = function() { + $scope.closePermissions = function () { if (isPermissionsDirty()) { BootstrapDialog.confirm({ closable: true, title: '', message: 'Changes will be discarded.', - callback: function(result) { + callback: function (result) { if (result) { - $scope.$apply(function() { - $scope.showPermissions = false; - }); + $scope.$apply(function () { + $scope.showPermissions = false + }) } } - }); + }) } else { - $scope.showPermissions = false; + $scope.showPermissions = false } - }; + } - function convertPermissionsToArray() { - $scope.permissions.owners = angular.element('#selectOwners').val(); - $scope.permissions.readers = angular.element('#selectReaders').val(); - $scope.permissions.writers = angular.element('#selectWriters').val(); - angular.element('.permissionsForm select').find('option:not([is-select2="false"])').remove(); + function convertPermissionsToArray () { + $scope.permissions.owners = angular.element('#selectOwners').val() + $scope.permissions.readers = angular.element('#selectReaders').val() + $scope.permissions.writers = angular.element('#selectWriters').val() + angular.element('.permissionsForm select').find('option:not([is-select2="false"])').remove() } $scope.restartInterpreter = function(interpreter) { - var thisConfirm = BootstrapDialog.confirm({ + const thisConfirm = BootstrapDialog.confirm({ closable: false, closeByBackdrop: false, closeByKeyboard: false, @@ -721,51 +723,51 @@ function NotebookCtrl($scope, $route, $routeParams, $location, $rootScope, message: 'Do you want to restart ' + interpreter.name + ' interpreter?', callback: function(result) { if (result) { - var payload = { + let payload = { 'noteId': $scope.note.id - }; + } - thisConfirm.$modalFooter.find('button').addClass('disabled'); + thisConfirm.$modalFooter.find('button').addClass('disabled') thisConfirm.$modalFooter.find('button:contains("OK")') - .html('<i class="fa fa-circle-o-notch fa-spin"></i> Saving Setting'); + .html('<i class="fa fa-circle-o-notch fa-spin"></i> Saving Setting') $http.put(baseUrlSrv.getRestApiBase() + '/interpreter/setting/restart/' + interpreter.id, payload) .success(function(data, status, headers, config) { - var index = _.findIndex($scope.interpreterSettings, {'id': interpreter.id}); - $scope.interpreterSettings[index] = data.body; - thisConfirm.close(); - }).error(function(data, status, headers, config) { - thisConfirm.close(); - console.log('Error %o %o', status, data.message); - BootstrapDialog.show({ - title: 'Error restart interpreter.', - message: data.message - }); - }); - return false; + let index = _.findIndex($scope.interpreterSettings, {'id': interpreter.id}) + $scope.interpreterSettings[index] = data.body + thisConfirm.close() + }).error(function (data, status, headers, config) { + thisConfirm.close() + console.log('Error %o %o', status, data.message) + BootstrapDialog.show({ + title: 'Error restart interpreter.', + message: data.message + }) + }) + return false } } - }); - }; + }) + } - $scope.savePermissions = function() { - convertPermissionsToArray(); + $scope.savePermissions = function () { + convertPermissionsToArray() $http.put(baseUrlSrv.getRestApiBase() + '/notebook/' + $scope.note.id + '/permissions', - $scope.permissions, {withCredentials: true}). - success(function(data, status, headers, config) { - getPermissions(function() { - console.log('Note permissions %o saved', $scope.permissions); + $scope.permissions, {withCredentials: true}) + .success(function (data, status, headers, config) { + getPermissions(function () { + console.log('Note permissions %o saved', $scope.permissions) BootstrapDialog.alert({ closable: true, title: 'Permissions Saved Successfully!!!', message: 'Owners : ' + $scope.permissions.owners + '\n\n' + 'Readers : ' + $scope.permissions.readers + '\n\n' + 'Writers : ' + $scope.permissions.writers - }); - $scope.showPermissions = false; - }); - }). - error(function(data, status, headers, config) { - console.log('Error %o %o', status, data.message); + }) + $scope.showPermissions = false + }) + }) + .error(function (data, status, headers, config) { + console.log('Error %o %o', status, data.message) BootstrapDialog.show({ closable: false, closeByBackdrop: false, @@ -775,249 +777,249 @@ function NotebookCtrl($scope, $route, $routeParams, $location, $rootScope, buttons: [ { label: 'Login', - action: function(dialog) { - dialog.close(); + action: function (dialog) { + dialog.close() angular.element('#loginModal').modal({ show: 'true' - }); + }) } }, { label: 'Cancel', - action: function(dialog) { - dialog.close(); - $location.path('/'); + action: function (dialog) { + dialog.close() + $location.path('/') } } ] - }); - }); - }; + }) + }) + } - $scope.togglePermissions = function() { - var principal = $rootScope.ticket.principal; - $scope.isAnonymous = principal === 'anonymous' ? true : false; + $scope.togglePermissions = function () { + let principal = $rootScope.ticket.principal + $scope.isAnonymous = principal === 'anonymous' ? true : false if (!!principal && $scope.isAnonymous) { - $scope.blockAnonUsers(); + $scope.blockAnonUsers() } else { if ($scope.showPermissions) { - $scope.closePermissions(); - angular.element('#selectOwners').select2({}); - angular.element('#selectReaders').select2({}); - angular.element('#selectWriters').select2({}); + $scope.closePermissions() + angular.element('#selectOwners').select2({}) + angular.element('#selectReaders').select2({}) + angular.element('#selectWriters').select2({}) } else { - $scope.openPermissions(); - $scope.closeSetting(); + $scope.openPermissions() + $scope.closeSetting() } } - }; + } - $scope.setIamOwner = function() { + $scope.setIamOwner = function () { if ($scope.permissions.owners.length > 0 && _.indexOf($scope.permissions.owners, $rootScope.ticket.principal) < 0) { - $scope.isOwner = false; - return false; + $scope.isOwner = false + return false } - $scope.isOwner = true; - return true; - }; + $scope.isOwner = true + return true + } - $scope.toggleNotePersonalizedMode = function() { - var personalizedMode = $scope.note.config.personalizedMode; + $scope.toggleNotePersonalizedMode = function () { + let personalizedMode = $scope.note.config.personalizedMode if ($scope.isOwner) { BootstrapDialog.confirm({ closable: true, title: 'Setting the result display', - message: function(dialog) { - var modeText = $scope.note.config.personalizedMode === 'true' ? 'collaborate' : 'personalize'; - return 'Do you want to <span class="text-info">' + modeText + '</span> your analysis?'; + message: function (dialog) { + let modeText = $scope.note.config.personalizedMode === 'true' ? 'collaborate' : 'personalize' + return 'Do you want to <span class="text-info">' + modeText + '</span> your analysis?' }, - callback: function(result) { + callback: function (result) { if (result) { if ($scope.note.config.personalizedMode === undefined) { - $scope.note.config.personalizedMode = 'false'; + $scope.note.config.personalizedMode = 'false' } - $scope.note.config.personalizedMode = personalizedMode === 'true' ? 'false' : 'true'; - websocketMsgSrv.updatePersonalizedMode($scope.note.id, $scope.note.config.personalizedMode); + $scope.note.config.personalizedMode = personalizedMode === 'true' ? 'false' : 'true' + websocketMsgSrv.updatePersonalizedMode($scope.note.id, $scope.note.config.personalizedMode) } } - }); + }) } - }; + } - var isSettingDirty = function() { + const isSettingDirty = function () { if (angular.equals($scope.interpreterBindings, $scope.interpreterBindingsOrig)) { - return false; + return false } else { - return true; + return true } - }; + } - var isPermissionsDirty = function() { + const isPermissionsDirty = function () { if (angular.equals($scope.permissions, $scope.permissionsOrig)) { - return false; + return false } else { - return true; + return true } - }; + } - angular.element(document).click(function() { - angular.element('.ace_autocomplete').hide(); - }); + angular.element(document).click(function () { + angular.element('.ace_autocomplete').hide() + }) /* ** $scope.$on functions below */ - $scope.$on('setConnectedStatus', function(event, param) { + $scope.$on('setConnectedStatus', function (event, param) { if (connectedOnce && param) { - initNotebook(); + initNotebook() } - connectedOnce = true; - }); + connectedOnce = true + }) - $scope.$on('moveParagraphUp', function(event, paragraph) { - var newIndex = -1; - for (var i = 0; i < $scope.note.paragraphs.length; i++) { + $scope.$on('moveParagraphUp', function (event, paragraph) { + let newIndex = -1 + for (let i = 0; i < $scope.note.paragraphs.length; i++) { if ($scope.note.paragraphs[i].id === paragraph.id) { - newIndex = i - 1; - break; + newIndex = i - 1 + break } } if (newIndex < 0 || newIndex >= $scope.note.paragraphs.length) { - return; + return } // save dirtyText of moving paragraphs. - var prevParagraph = $scope.note.paragraphs[newIndex]; + let prevParagraph = $scope.note.paragraphs[newIndex] angular .element('#' + paragraph.id + '_paragraphColumn_main') .scope() - .saveParagraph(paragraph); + .saveParagraph(paragraph) angular .element('#' + prevParagraph.id + '_paragraphColumn_main') .scope() - .saveParagraph(prevParagraph); - websocketMsgSrv.moveParagraph(paragraph.id, newIndex); - }); + .saveParagraph(prevParagraph) + websocketMsgSrv.moveParagraph(paragraph.id, newIndex) + }) - $scope.$on('moveParagraphDown', function(event, paragraph) { - var newIndex = -1; - for (var i = 0; i < $scope.note.paragraphs.length; i++) { + $scope.$on('moveParagraphDown', function (event, paragraph) { + let newIndex = -1 + for (let i = 0; i < $scope.note.paragraphs.length; i++) { if ($scope.note.paragraphs[i].id === paragraph.id) { - newIndex = i + 1; - break; + newIndex = i + 1 + break } } if (newIndex < 0 || newIndex >= $scope.note.paragraphs.length) { - return; + return } // save dirtyText of moving paragraphs. - var nextParagraph = $scope.note.paragraphs[newIndex]; + let nextParagraph = $scope.note.paragraphs[newIndex] angular .element('#' + paragraph.id + '_paragraphColumn_main') .scope() - .saveParagraph(paragraph); + .saveParagraph(paragraph) angular .element('#' + nextParagraph.id + '_paragraphColumn_main') .scope() - .saveParagraph(nextParagraph); - websocketMsgSrv.moveParagraph(paragraph.id, newIndex); - }); + .saveParagraph(nextParagraph) + websocketMsgSrv.moveParagraph(paragraph.id, newIndex) + }) - $scope.$on('moveFocusToPreviousParagraph', function(event, currentParagraphId) { - var focus = false; - for (var i = $scope.note.paragraphs.length - 1; i >= 0; i--) { + $scope.$on('moveFocusToPreviousParagraph', function (event, currentParagraphId) { + let focus = false + for (let i = $scope.note.paragraphs.length - 1; i >= 0; i--) { if (focus === false) { if ($scope.note.paragraphs[i].id === currentParagraphId) { - focus = true; - continue; + focus = true + continue } } else { - $scope.$broadcast('focusParagraph', $scope.note.paragraphs[i].id, -1); - break; + $scope.$broadcast('focusParagraph', $scope.note.paragraphs[i].id, -1) + break } } - }); + }) - $scope.$on('moveFocusToNextParagraph', function(event, currentParagraphId) { - var focus = false; - for (var i = 0; i < $scope.note.paragraphs.length; i++) { + $scope.$on('moveFocusToNextParagraph', function (event, currentParagraphId) { + let focus = false + for (let i = 0; i < $scope.note.paragraphs.length; i++) { if (focus === false) { if ($scope.note.paragraphs[i].id === currentParagraphId) { - focus = true; - continue; + focus = true + continue } } else { - $scope.$broadcast('focusParagraph', $scope.note.paragraphs[i].id, 0); - break; + $scope.$broadcast('focusParagraph', $scope.note.paragraphs[i].id, 0) + break } } - }); + }) - $scope.$on('insertParagraph', function(event, paragraphId, position) { - var newIndex = -1; - for (var i = 0; i < $scope.note.paragraphs.length; i++) { + $scope.$on('insertParagraph', function (event, paragraphId, position) { + let newIndex = -1 + for (let i = 0; i < $scope.note.paragraphs.length; i++) { if ($scope.note.paragraphs[i].id === paragraphId) { - //determine position of where to add new paragraph; default is below + // determine position of where to add new paragraph; default is below if (position === 'above') { - newIndex = i; + newIndex = i } else { - newIndex = i + 1; + newIndex = i + 1 } - break; + break } } if (newIndex < 0 || newIndex > $scope.note.paragraphs.length) { - return; + return } - websocketMsgSrv.insertParagraph(newIndex); - }); + websocketMsgSrv.insertParagraph(newIndex) + }) - $scope.$on('setNoteContent', function(event, note) { + $scope.$on('setNoteContent', function (event, note) { if (note === undefined) { - $location.path('/'); + $location.path('/') } - $scope.note = note; + $scope.note = note - $scope.paragraphUrl = $routeParams.paragraphId; - $scope.asIframe = $routeParams.asIframe; + $scope.paragraphUrl = $routeParams.paragraphId + $scope.asIframe = $routeParams.asIframe if ($scope.paragraphUrl) { - $scope.note = cleanParagraphExcept($scope.paragraphUrl, $scope.note); - $scope.$broadcast('$unBindKeyEvent', $scope.$unBindKeyEvent); - $rootScope.$broadcast('setIframe', $scope.asIframe); - initializeLookAndFeel(); - return; - } - - initializeLookAndFeel(); - - //open interpreter binding setting when there're none selected - getInterpreterBindings(); - getPermissions(); - var isPersonalized = $scope.note.config.personalizedMode; - isPersonalized = isPersonalized === undefined ? 'false' : isPersonalized; - $scope.note.config.personalizedMode = isPersonalized; - }); - - $scope.$on('$destroy', function() { - angular.element(window).off('beforeunload'); - $scope.killSaveTimer(); - $scope.saveNote(); - - document.removeEventListener('click', $scope.focusParagraphOnClick); - document.removeEventListener('keydown', $scope.keyboardShortcut); - }); - - $scope.$on('$unBindKeyEvent', function() { - document.removeEventListener('click', $scope.focusParagraphOnClick); - document.removeEventListener('keydown', $scope.keyboardShortcut); - }); - - angular.element(window).bind('resize', function() { - const actionbarHeight = document.getElementById('actionbar').lastElementChild.clientHeight; - angular.element(document.getElementById('content')).css('padding-top', actionbarHeight - 20); - }); + $scope.note = cleanParagraphExcept($scope.paragraphUrl, $scope.note) + $scope.$broadcast('$unBindKeyEvent', $scope.$unBindKeyEvent) + $rootScope.$broadcast('setIframe', $scope.asIframe) + initializeLookAndFeel() + return + } + + initializeLookAndFeel() + + // open interpreter binding setting when there're none selected + getInterpreterBindings() + getPermissions() + let isPersonalized = $scope.note.config.personalizedMode + isPersonalized = isPersonalized === undefined ? 'false' : isPersonalized + $scope.note.config.personalizedMode = isPersonalized + }) + + $scope.$on('$destroy', function () { + angular.element(window).off('beforeunload') + $scope.killSaveTimer() + $scope.saveNote() + + document.removeEventListener('click', $scope.focusParagraphOnClick) + document.removeEventListener('keydown', $scope.keyboardShortcut) + }) + + $scope.$on('$unBindKeyEvent', function () { + document.removeEventListener('click', $scope.focusParagraphOnClick) + document.removeEventListener('keydown', $scope.keyboardShortcut) + }) + + angular.element(window).bind('resize', function () { + const actionbarHeight = document.getElementById('actionbar').lastElementChild.clientHeight + angular.element(document.getElementById('content')).css('padding-top', actionbarHeight - 20) + }) }
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/19b0f30f/zeppelin-web/src/app/notebook/notebook.controller.test.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/app/notebook/notebook.controller.test.js b/zeppelin-web/src/app/notebook/notebook.controller.test.js index 6df6893..f393d2c 100644 --- a/zeppelin-web/src/app/notebook/notebook.controller.test.js +++ b/zeppelin-web/src/app/notebook/notebook.controller.test.js @@ -1,139 +1,139 @@ -describe('Controller: NotebookCtrl', function() { - beforeEach(angular.mock.module('zeppelinWebApp')); - - var scope; - - var websocketMsgSrvMock = { - getNote: function() {}, - listRevisionHistory: function() {}, - getInterpreterBindings: function() {}, - updateNote: function() {}, - renameNote: function() {} - }; - - var baseUrlSrvMock = { - getRestApiBase: function() { - return 'http://localhost:8080'; +describe('Controller: NotebookCtrl', function () { + beforeEach(angular.mock.module('zeppelinWebApp')) + + let scope + + let websocketMsgSrvMock = { + getNote: function () {}, + listRevisionHistory: function () {}, + getInterpreterBindings: function () {}, + updateNote: function () {}, + renameNote: function () {} + } + + let baseUrlSrvMock = { + getRestApiBase: function () { + return 'http://localhost:8080' } - }; + } - var noteMock = { + let noteMock = { id: 1, name: 'my note', config: {}, - }; + } - beforeEach(inject(function($controller, $rootScope) { - scope = $rootScope.$new(); + beforeEach(inject(function ($controller, $rootScope) { + scope = $rootScope.$new() $controller('NotebookCtrl', { $scope: scope, websocketMsgSrv: websocketMsgSrvMock, baseUrlSrv: baseUrlSrvMock - }); - })); + }) + })) - beforeEach(function() { - scope.note = noteMock; - }); + beforeEach(function () { + scope.note = noteMock + }) - var functions = ['getCronOptionNameFromValue', 'removeNote', 'runAllParagraphs', 'saveNote', 'toggleAllEditor', + let functions = ['getCronOptionNameFromValue', 'removeNote', 'runAllParagraphs', 'saveNote', 'toggleAllEditor', 'showAllEditor', 'hideAllEditor', 'toggleAllTable', 'hideAllTable', 'showAllTable', 'isNoteRunning', 'killSaveTimer', 'startSaveTimer', 'setLookAndFeel', 'setCronScheduler', 'setConfig', 'updateNoteName', - 'openSetting', 'closeSetting', 'saveSetting', 'toggleSetting']; - - functions.forEach(function(fn) { - it('check for scope functions to be defined : ' + fn, function() { - expect(scope[fn]).toBeDefined(); - }); - }); - - it('should set default value of "editorToggled" to false', function() { - expect(scope.editorToggled).toEqual(false); - }); - - it('should set "showSetting" to true when openSetting() is called', function() { - scope.openSetting(); - expect(scope.showSetting).toEqual(true); - }); - - it('should set "showSetting" to false when closeSetting() is called', function() { - scope.closeSetting(); - expect(scope.showSetting).toEqual(false); - }); - - it('should return the correct value for getCronOptionNameFromValue()', function() { - var none = scope.getCronOptionNameFromValue(); - var oneMin = scope.getCronOptionNameFromValue('0 0/1 * * * ?'); - var fiveMin = scope.getCronOptionNameFromValue('0 0/5 * * * ?'); - var oneHour = scope.getCronOptionNameFromValue('0 0 0/1 * * ?'); - var threeHours = scope.getCronOptionNameFromValue('0 0 0/3 * * ?'); - var sixHours = scope.getCronOptionNameFromValue('0 0 0/6 * * ?'); - var twelveHours = scope.getCronOptionNameFromValue('0 0 0/12 * * ?'); - var oneDay = scope.getCronOptionNameFromValue('0 0 0 * * ?'); - - expect(none).toEqual(''); - expect(oneMin).toEqual('1m'); - expect(fiveMin).toEqual('5m'); - expect(oneHour).toEqual('1h'); - expect(threeHours).toEqual('3h'); - expect(sixHours).toEqual('6h'); - expect(twelveHours).toEqual('12h'); - expect(oneDay).toEqual('1d'); - }); - - it('should have "isNoteDirty" as null by default', function() { - expect(scope.isNoteDirty).toEqual(null); - }); - - it('should first call killSaveTimer() when calling startSaveTimer()', function() { - expect(scope.saveTimer).toEqual(null); - spyOn(scope, 'killSaveTimer'); - scope.startSaveTimer(); - expect(scope.killSaveTimer).toHaveBeenCalled(); - }); - - it('should set "saveTimer" when saveTimer() and killSaveTimer() are called', function() { - expect(scope.saveTimer).toEqual(null); - scope.startSaveTimer(); - expect(scope.saveTimer).toBeTruthy(); - scope.killSaveTimer(); - expect(scope.saveTimer).toEqual(null); - }); - - it('should NOT update note name when updateNoteName() is called with an invalid name', function() { - spyOn(websocketMsgSrvMock, 'renameNote'); - scope.updateNoteName(''); - expect(scope.note.name).toEqual(noteMock.name); - expect(websocketMsgSrvMock.renameNote).not.toHaveBeenCalled(); - scope.updateNoteName(' '); - expect(scope.note.name).toEqual(noteMock.name); - expect(websocketMsgSrvMock.renameNote).not.toHaveBeenCalled(); - scope.updateNoteName(scope.note.name); - expect(scope.note.name).toEqual(noteMock.name); - expect(websocketMsgSrvMock.renameNote).not.toHaveBeenCalled(); - }); - - it('should update note name when updateNoteName() is called with a valid name', function() { - spyOn(websocketMsgSrvMock, 'renameNote'); - var newName = 'Your Note'; - scope.updateNoteName(newName); - expect(scope.note.name).toEqual(newName); - expect(websocketMsgSrvMock.renameNote).toHaveBeenCalled(); - }); - - it('should reload note info once per one "setNoteMenu" event', function() { - spyOn(websocketMsgSrvMock, 'getNote'); - spyOn(websocketMsgSrvMock, 'listRevisionHistory'); - - scope.$broadcast('setNoteMenu'); - expect(websocketMsgSrvMock.getNote.calls.count()).toEqual(0); - expect(websocketMsgSrvMock.listRevisionHistory.calls.count()).toEqual(0); - - websocketMsgSrvMock.getNote.calls.reset(); - websocketMsgSrvMock.listRevisionHistory.calls.reset(); - - scope.$broadcast('setNoteMenu'); - expect(websocketMsgSrvMock.getNote.calls.count()).toEqual(0); - expect(websocketMsgSrvMock.listRevisionHistory.calls.count()).toEqual(0); - }); -}); + 'openSetting', 'closeSetting', 'saveSetting', 'toggleSetting'] + + functions.forEach(function (fn) { + it('check for scope functions to be defined : ' + fn, function () { + expect(scope[fn]).toBeDefined() + }) + }) + + it('should set default value of "editorToggled" to false', function () { + expect(scope.editorToggled).toEqual(false) + }) + + it('should set "showSetting" to true when openSetting() is called', function () { + scope.openSetting() + expect(scope.showSetting).toEqual(true) + }) + + it('should set "showSetting" to false when closeSetting() is called', function () { + scope.closeSetting() + expect(scope.showSetting).toEqual(false) + }) + + it('should return the correct value for getCronOptionNameFromValue()', function () { + let none = scope.getCronOptionNameFromValue() + let oneMin = scope.getCronOptionNameFromValue('0 0/1 * * * ?') + let fiveMin = scope.getCronOptionNameFromValue('0 0/5 * * * ?') + let oneHour = scope.getCronOptionNameFromValue('0 0 0/1 * * ?') + let threeHours = scope.getCronOptionNameFromValue('0 0 0/3 * * ?') + let sixHours = scope.getCronOptionNameFromValue('0 0 0/6 * * ?') + let twelveHours = scope.getCronOptionNameFromValue('0 0 0/12 * * ?') + let oneDay = scope.getCronOptionNameFromValue('0 0 0 * * ?') + + expect(none).toEqual('') + expect(oneMin).toEqual('1m') + expect(fiveMin).toEqual('5m') + expect(oneHour).toEqual('1h') + expect(threeHours).toEqual('3h') + expect(sixHours).toEqual('6h') + expect(twelveHours).toEqual('12h') + expect(oneDay).toEqual('1d') + }) + + it('should have "isNoteDirty" as null by default', function () { + expect(scope.isNoteDirty).toEqual(null) + }) + + it('should first call killSaveTimer() when calling startSaveTimer()', function () { + expect(scope.saveTimer).toEqual(null) + spyOn(scope, 'killSaveTimer') + scope.startSaveTimer() + expect(scope.killSaveTimer).toHaveBeenCalled() + }) + + it('should set "saveTimer" when saveTimer() and killSaveTimer() are called', function () { + expect(scope.saveTimer).toEqual(null) + scope.startSaveTimer() + expect(scope.saveTimer).toBeTruthy() + scope.killSaveTimer() + expect(scope.saveTimer).toEqual(null) + }) + + it('should NOT update note name when updateNoteName() is called with an invalid name', function () { + spyOn(websocketMsgSrvMock, 'renameNote') + scope.updateNoteName('') + expect(scope.note.name).toEqual(noteMock.name) + expect(websocketMsgSrvMock.renameNote).not.toHaveBeenCalled() + scope.updateNoteName(' ') + expect(scope.note.name).toEqual(noteMock.name) + expect(websocketMsgSrvMock.renameNote).not.toHaveBeenCalled() + scope.updateNoteName(scope.note.name) + expect(scope.note.name).toEqual(noteMock.name) + expect(websocketMsgSrvMock.renameNote).not.toHaveBeenCalled() + }) + + it('should update note name when updateNoteName() is called with a valid name', function () { + spyOn(websocketMsgSrvMock, 'renameNote') + let newName = 'Your Note' + scope.updateNoteName(newName) + expect(scope.note.name).toEqual(newName) + expect(websocketMsgSrvMock.renameNote).toHaveBeenCalled() + }) + + it('should reload note info once per one "setNoteMenu" event', function () { + spyOn(websocketMsgSrvMock, 'getNote') + spyOn(websocketMsgSrvMock, 'listRevisionHistory') + + scope.$broadcast('setNoteMenu') + expect(websocketMsgSrvMock.getNote.calls.count()).toEqual(0) + expect(websocketMsgSrvMock.listRevisionHistory.calls.count()).toEqual(0) + + websocketMsgSrvMock.getNote.calls.reset() + websocketMsgSrvMock.listRevisionHistory.calls.reset() + + scope.$broadcast('setNoteMenu') + expect(websocketMsgSrvMock.getNote.calls.count()).toEqual(0) + expect(websocketMsgSrvMock.listRevisionHistory.calls.count()).toEqual(0) + }) +})