http://git-wip-us.apache.org/repos/asf/zeppelin/blob/19b0f30f/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js index a453f16..1a92176 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.js @@ -12,168 +12,180 @@ * limitations under the License. */ -import { SpellResult, } from '../../spell'; +import { SpellResult, } from '../../spell' import { ParagraphStatus, isParagraphRunning, -} from './paragraph.status'; +} from './paragraph.status' const ParagraphExecutor = { SPELL: 'SPELL', INTERPRETER: 'INTERPRETER', NONE: '', /** meaning `DONE` */ -}; +} -angular.module('zeppelinWebApp').controller('ParagraphCtrl', ParagraphCtrl); +angular.module('zeppelinWebApp').controller('ParagraphCtrl', ParagraphCtrl) -function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $location, +function ParagraphCtrl ($scope, $rootScope, $route, $window, $routeParams, $location, $timeout, $compile, $http, $q, websocketMsgSrv, baseUrlSrv, ngToast, saveAsService, noteVarShareService, heliumService) { - 'ngInject'; + 'ngInject' - var ANGULAR_FUNCTION_OBJECT_NAME_PREFIX = '_Z_ANGULAR_FUNC_'; - $rootScope.keys = Object.keys; - $scope.parentNote = null; - $scope.paragraph = {}; - $scope.paragraph.results = {}; - $scope.paragraph.results.msg = []; - $scope.originalText = ''; - $scope.editor = null; + let ANGULAR_FUNCTION_OBJECT_NAME_PREFIX = '_Z_ANGULAR_FUNC_' + $rootScope.keys = Object.keys + $scope.parentNote = null + $scope.paragraph = {} + $scope.paragraph.results = {} + $scope.paragraph.results.msg = [] + $scope.originalText = '' + $scope.editor = null // transactional info for spell execution $scope.spellTransaction = { - totalResultCount: 0, renderedResultCount: 0, - propagated: false, resultsMsg: [], paragraphText: '', - }; + totalResultCount: 0, + renderedResultCount: 0, + propagated: false, + resultsMsg: [], + paragraphText: '', + } - var editorSetting = {}; + let editorSetting = {} // flag that is used to set editor setting on paste percent sign - var pastePercentSign = false; + let pastePercentSign = false // flag that is used to set editor setting on save interpreter bindings - var setInterpreterBindings = false; - var paragraphScope = $rootScope.$new(true, $rootScope); + let setInterpreterBindings = false + let paragraphScope = $rootScope.$new(true, $rootScope) // to keep backward compatibility - $scope.compiledScope = paragraphScope; + $scope.compiledScope = paragraphScope paragraphScope.z = { // z.runParagraph('20150213-231621_168813393') - runParagraph: function(paragraphId) { + runParagraph: function (paragraphId) { if (paragraphId) { - var filtered = $scope.parentNote.paragraphs.filter(function(x) { - return x.id === paragraphId;}); + let filtered = $scope.parentNote.paragraphs.filter(function (x) { + return x.id === paragraphId + }) if (filtered.length === 1) { - var paragraph = filtered[0]; + let paragraph = filtered[0] websocketMsgSrv.runParagraph(paragraph.id, paragraph.title, paragraph.text, - paragraph.config, paragraph.settings.params); + paragraph.config, paragraph.settings.params) } else { - ngToast.danger({content: 'Cannot find a paragraph with id \'' + paragraphId + '\'', - verticalPosition: 'top', dismissOnTimeout: false}); + ngToast.danger({ + content: 'Cannot find a paragraph with id \'' + paragraphId + '\'', + verticalPosition: 'top', + dismissOnTimeout: false + }) } } else { ngToast.danger({ content: 'Please provide a \'paragraphId\' when calling z.runParagraph(paragraphId)', - verticalPosition: 'top', dismissOnTimeout: false}); + verticalPosition: 'top', + dismissOnTimeout: false + }) } }, // Example: z.angularBind('my_var', 'Test Value', '20150213-231621_168813393') - angularBind: function(varName, value, paragraphId) { + angularBind: function (varName, value, paragraphId) { // Only push to server if there paragraphId is defined if (paragraphId) { - websocketMsgSrv.clientBindAngularObject($routeParams.noteId, varName, value, paragraphId); + websocketMsgSrv.clientBindAngularObject($routeParams.noteId, varName, value, paragraphId) } else { ngToast.danger({ content: 'Please provide a \'paragraphId\' when calling ' + 'z.angularBind(varName, value, \'PUT_HERE_PARAGRAPH_ID\')', - verticalPosition: 'top', dismissOnTimeout: false}); + verticalPosition: 'top', + dismissOnTimeout: false + }) } }, // Example: z.angularUnBind('my_var', '20150213-231621_168813393') - angularUnbind: function(varName, paragraphId) { + angularUnbind: function (varName, paragraphId) { // Only push to server if paragraphId is defined if (paragraphId) { - websocketMsgSrv.clientUnbindAngularObject($routeParams.noteId, varName, paragraphId); + websocketMsgSrv.clientUnbindAngularObject($routeParams.noteId, varName, paragraphId) } else { ngToast.danger({ content: 'Please provide a \'paragraphId\' when calling ' + 'z.angularUnbind(varName, \'PUT_HERE_PARAGRAPH_ID\')', - verticalPosition: 'top', dismissOnTimeout: false}); + verticalPosition: 'top', + dismissOnTimeout: false}) } } - }; + } - var angularObjectRegistry = {}; + let angularObjectRegistry = {} // Controller init - $scope.init = function(newParagraph, note) { - $scope.paragraph = newParagraph; - $scope.parentNote = note; - $scope.originalText = angular.copy(newParagraph.text); - $scope.chart = {}; - $scope.baseMapOption = ['Streets', 'Satellite', 'Hybrid', 'Topo', 'Gray', 'Oceans', 'Terrain']; - $scope.colWidthOption = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]; - $scope.paragraphFocused = false; + $scope.init = function (newParagraph, note) { + $scope.paragraph = newParagraph + $scope.parentNote = note + $scope.originalText = angular.copy(newParagraph.text) + $scope.chart = {} + $scope.baseMapOption = ['Streets', 'Satellite', 'Hybrid', 'Topo', 'Gray', 'Oceans', 'Terrain'] + $scope.colWidthOption = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] + $scope.paragraphFocused = false if (newParagraph.focus) { - $scope.paragraphFocused = true; + $scope.paragraphFocused = true } if (!$scope.paragraph.config) { - $scope.paragraph.config = {}; + $scope.paragraph.config = {} } - noteVarShareService.put($scope.paragraph.id + '_paragraphScope', paragraphScope); + noteVarShareService.put($scope.paragraph.id + '_paragraphScope', paragraphScope) - initializeDefault($scope.paragraph.config); - }; + initializeDefault($scope.paragraph.config) + } - var initializeDefault = function(config) { - var forms = $scope.paragraph.settings.forms; + const initializeDefault = function (config) { + let forms = $scope.paragraph.settings.forms if (!config.colWidth) { - config.colWidth = 12; + config.colWidth = 12 } if (config.enabled === undefined) { - config.enabled = true; + config.enabled = true } - for (var idx in forms) { + for (let idx in forms) { if (forms[idx]) { if (forms[idx].options) { if (config.runOnSelectionChange === undefined) { - config.runOnSelectionChange = true; + config.runOnSelectionChange = true } } } } if (!config.results) { - config.results = {}; + config.results = {} } if (!config.editorSetting) { - config.editorSetting = {}; + config.editorSetting = {} } else if (config.editorSetting.editOnDblClick) { - editorSetting.isOutputHidden = config.editorSetting.editOnDblClick; + editorSetting.isOutputHidden = config.editorSetting.editOnDblClick } - }; + } - $scope.$on('updateParagraphOutput', function(event, data) { + $scope.$on('updateParagraphOutput', function (event, data) { if ($scope.paragraph.id === data.paragraphId) { if (!$scope.paragraph.results) { - $scope.paragraph.results = {}; + $scope.paragraph.results = {} } if (!$scope.paragraph.results.msg) { - $scope.paragraph.results.msg = []; + $scope.paragraph.results.msg = [] } - var update = ($scope.paragraph.results.msg[data.index]) ? true : false; + let update = ($scope.paragraph.results.msg[data.index]) ? true : false $scope.paragraph.results.msg[data.index] = { data: data.data, type: data.type - }; + } if (update) { $rootScope.$broadcast( @@ -181,62 +193,62 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat $scope.paragraph.results.msg[data.index], $scope.paragraph.config.results[data.index], $scope.paragraph, - data.index); + data.index) } } - }); + }) - $scope.getIframeDimensions = function() { + $scope.getIframeDimensions = function () { if ($scope.asIframe) { - var paragraphid = '#' + $routeParams.paragraphId + '_container'; - var height = angular.element(paragraphid).height(); - return height; + let paragraphid = '#' + $routeParams.paragraphId + '_container' + let height = angular.element(paragraphid).height() + return height } - return 0; - }; + return 0 + } - $scope.$watch($scope.getIframeDimensions, function(newValue, oldValue) { + $scope.$watch($scope.getIframeDimensions, function (newValue, oldValue) { if ($scope.asIframe && newValue) { - var message = {}; - message.height = newValue; - message.url = $location.$$absUrl; - $window.parent.postMessage(angular.toJson(message), '*'); + let message = {} + message.height = newValue + message.url = $location.$$absUrl + $window.parent.postMessage(angular.toJson(message), '*') } - }); + }) - $scope.getEditor = function() { - return $scope.editor; - }; + $scope.getEditor = function () { + return $scope.editor + } - $scope.$watch($scope.getEditor, function(newValue, oldValue) { + $scope.$watch($scope.getEditor, function (newValue, oldValue) { if (!$scope.editor) { - return; + return } if (newValue === null || newValue === undefined) { - console.log('editor isnt loaded yet, returning'); - return; + console.log('editor isnt loaded yet, returning') + return } if ($scope.revisionView === true) { - $scope.editor.setReadOnly(true); + $scope.editor.setReadOnly(true) } else { - $scope.editor.setReadOnly(false); + $scope.editor.setReadOnly(false) } - }); + }) - var isEmpty = function(object) { - return !object; - }; + let isEmpty = function (object) { + return !object + } - $scope.isRunning = function(paragraph) { - return isParagraphRunning(paragraph); - }; + $scope.isRunning = function (paragraph) { + return isParagraphRunning(paragraph) + } - $scope.cancelParagraph = function(paragraph) { - console.log('Cancel %o', paragraph.id); - websocketMsgSrv.cancelParagraphRun(paragraph.id); - }; + $scope.cancelParagraph = function (paragraph) { + console.log('Cancel %o', paragraph.id) + websocketMsgSrv.cancelParagraphRun(paragraph.id) + } - $scope.propagateSpellResult = function(paragraphId, paragraphTitle, + $scope.propagateSpellResult = function (paragraphId, paragraphTitle, paragraphText, paragraphResults, paragraphStatus, paragraphErrorMessage, paragraphConfig, paragraphSettingsParam) { @@ -244,442 +256,443 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat paragraphId, paragraphTitle, paragraphText, paragraphResults, paragraphStatus, paragraphErrorMessage, - paragraphConfig, paragraphSettingsParam); - }; + paragraphConfig, paragraphSettingsParam) + } - $scope.handleSpellError = function(paragraphText, error, + $scope.handleSpellError = function (paragraphText, error, digestRequired, propagated) { - const errorMessage = error.stack; - $scope.paragraph.status = ParagraphStatus.ERROR; - $scope.paragraph.errorMessage = errorMessage; - console.error('Failed to execute interpret() in spell\n', error); + const errorMessage = error.stack + $scope.paragraph.status = ParagraphStatus.ERROR + $scope.paragraph.errorMessage = errorMessage + console.error('Failed to execute interpret() in spell\n', error) if (!propagated) { $scope.propagateSpellResult( $scope.paragraph.id, $scope.paragraph.title, paragraphText, [], $scope.paragraph.status, errorMessage, - $scope.paragraph.config, $scope.paragraph.settings.params); + $scope.paragraph.config, $scope.paragraph.settings.params) } - }; + } - $scope.prepareSpellTransaction = function(resultsMsg, propagated, paragraphText) { - $scope.spellTransaction.totalResultCount = resultsMsg.length; - $scope.spellTransaction.renderedResultCount = 0; - $scope.spellTransaction.propagated = propagated; - $scope.spellTransaction.resultsMsg = resultsMsg; - $scope.spellTransaction.paragraphText = paragraphText; - }; + $scope.prepareSpellTransaction = function (resultsMsg, propagated, paragraphText) { + $scope.spellTransaction.totalResultCount = resultsMsg.length + $scope.spellTransaction.renderedResultCount = 0 + $scope.spellTransaction.propagated = propagated + $scope.spellTransaction.resultsMsg = resultsMsg + $scope.spellTransaction.paragraphText = paragraphText + } /** * - update spell transaction count and * - check transaction is finished based on the result count * @returns {boolean} */ - $scope.increaseSpellTransactionResultCount = function() { - $scope.spellTransaction.renderedResultCount += 1; + $scope.increaseSpellTransactionResultCount = function () { + $scope.spellTransaction.renderedResultCount += 1 - const total = $scope.spellTransaction.totalResultCount; - const current = $scope.spellTransaction.renderedResultCount; - return total === current; - }; + const total = $scope.spellTransaction.totalResultCount + const current = $scope.spellTransaction.renderedResultCount + return total === current + } - $scope.cleanupSpellTransaction = function() { - const status = ParagraphStatus.FINISHED; - $scope.paragraph.executor = ParagraphExecutor.NONE; - $scope.paragraph.status = status; - $scope.paragraph.results.code = status; + $scope.cleanupSpellTransaction = function () { + const status = ParagraphStatus.FINISHED + $scope.paragraph.executor = ParagraphExecutor.NONE + $scope.paragraph.status = status + $scope.paragraph.results.code = status - const propagated = $scope.spellTransaction.propagated; - const resultsMsg = $scope.spellTransaction.resultsMsg; - const paragraphText = $scope.spellTransaction.paragraphText; + const propagated = $scope.spellTransaction.propagated + const resultsMsg = $scope.spellTransaction.resultsMsg + const paragraphText = $scope.spellTransaction.paragraphText if (!propagated) { - const propagable = SpellResult.createPropagable(resultsMsg); + const propagable = SpellResult.createPropagable(resultsMsg) $scope.propagateSpellResult( $scope.paragraph.id, $scope.paragraph.title, paragraphText, propagable, status, '', - $scope.paragraph.config, $scope.paragraph.settings.params); + $scope.paragraph.config, $scope.paragraph.settings.params) } - }; + } - $scope.runParagraphUsingSpell = function(paragraphText, + $scope.runParagraphUsingSpell = function (paragraphText, magic, digestRequired, propagated) { - $scope.paragraph.status = 'RUNNING'; - $scope.paragraph.executor = ParagraphExecutor.SPELL; - $scope.paragraph.results = {}; - $scope.paragraph.errorMessage = ''; - if (digestRequired) { $scope.$digest(); } + $scope.paragraph.status = 'RUNNING' + $scope.paragraph.executor = ParagraphExecutor.SPELL + $scope.paragraph.results = {} + $scope.paragraph.errorMessage = '' + if (digestRequired) { $scope.$digest() } try { // remove magic from paragraphText - const splited = paragraphText.split(magic); + const splited = paragraphText.split(magic) // remove leading spaces - const textWithoutMagic = splited[1].replace(/^\s+/g, ''); + const textWithoutMagic = splited[1].replace(/^\s+/g, '') // handle actual result message in promise heliumService.executeSpell(magic, textWithoutMagic) .then(resultsMsg => { - $scope.prepareSpellTransaction(resultsMsg, propagated, paragraphText); - - $scope.paragraph.results.msg = resultsMsg; - $scope.paragraph.config.tableHide = false; + $scope.prepareSpellTransaction(resultsMsg, propagated, paragraphText) + $scope.paragraph.results.msg = resultsMsg + $scope.paragraph.config.tableHide = false }) .catch(error => { $scope.handleSpellError(paragraphText, error, - digestRequired, propagated); - }); + digestRequired, propagated) + }) } catch (error) { $scope.handleSpellError(paragraphText, error, - digestRequired, propagated); + digestRequired, propagated) } - }; + } - $scope.runParagraphUsingBackendInterpreter = function(paragraphText) { + $scope.runParagraphUsingBackendInterpreter = function (paragraphText) { websocketMsgSrv.runParagraph($scope.paragraph.id, $scope.paragraph.title, - paragraphText, $scope.paragraph.config, $scope.paragraph.settings.params); - }; + paragraphText, $scope.paragraph.config, $scope.paragraph.settings.params) + } - $scope.saveParagraph = function(paragraph) { - const dirtyText = paragraph.text; + $scope.saveParagraph = function (paragraph) { + const dirtyText = paragraph.text if (dirtyText === undefined || dirtyText === $scope.originalText) { - return; + return } - commitParagraph(paragraph); - $scope.originalText = dirtyText; - $scope.dirtyText = undefined; - }; + commitParagraph(paragraph) + $scope.originalText = dirtyText + $scope.dirtyText = undefined + } - $scope.toggleEnableDisable = function(paragraph) { - paragraph.config.enabled = !paragraph.config.enabled; - commitParagraph(paragraph); - }; + $scope.toggleEnableDisable = function (paragraph) { + paragraph.config.enabled = !paragraph.config.enabled + commitParagraph(paragraph) + } /** * @param paragraphText to be parsed * @param digestRequired true if calling `$digest` is required * @param propagated true if update request is sent from other client */ - $scope.runParagraph = function(paragraphText, digestRequired, propagated) { + $scope.runParagraph = function (paragraphText, digestRequired, propagated) { if (!paragraphText || $scope.isRunning($scope.paragraph)) { - return; + return } - const magic = SpellResult.extractMagic(paragraphText); + const magic = SpellResult.extractMagic(paragraphText) if (heliumService.getSpellByMagic(magic)) { - $scope.runParagraphUsingSpell(paragraphText, magic, digestRequired, propagated); + $scope.runParagraphUsingSpell(paragraphText, magic, digestRequired, propagated) } else { - $scope.runParagraphUsingBackendInterpreter(paragraphText); + $scope.runParagraphUsingBackendInterpreter(paragraphText) } - $scope.originalText = angular.copy(paragraphText); - $scope.dirtyText = undefined; + $scope.originalText = angular.copy(paragraphText) + $scope.dirtyText = undefined if ($scope.paragraph.config.editorSetting.editOnDblClick) { - closeEditorAndOpenTable($scope.paragraph); + closeEditorAndOpenTable($scope.paragraph) } else if (editorSetting.isOutputHidden && !$scope.paragraph.config.editorSetting.editOnDblClick) { // %md/%angular repl make output to be hidden by default after running // so should open output if repl changed from %md/%angular to another - openEditorAndOpenTable($scope.paragraph); + openEditorAndOpenTable($scope.paragraph) } - editorSetting.isOutputHidden = $scope.paragraph.config.editorSetting.editOnDblClick; - }; + editorSetting.isOutputHidden = $scope.paragraph.config.editorSetting.editOnDblClick + } - $scope.runParagraphFromShortcut = function(paragraphText) { + $scope.runParagraphFromShortcut = function (paragraphText) { // passing `digestRequired` as true to update view immediately // without this, results cannot be rendered in view more than once - $scope.runParagraph(paragraphText, true, false); - }; + $scope.runParagraph(paragraphText, true, false) + } - $scope.runParagraphFromButton = function(paragraphText) { + $scope.runParagraphFromButton = function (paragraphText) { // we come here from the view, so we don't need to call `$digest()` $scope.runParagraph(paragraphText, false, false) - }; + } $scope.turnOnAutoRun = function (paragraph) { - paragraph.config.runOnSelectionChange = !paragraph.config.runOnSelectionChange; - commitParagraph(paragraph); - }; + paragraph.config.runOnSelectionChange = !paragraph.config.runOnSelectionChange + commitParagraph(paragraph) + } - $scope.moveUp = function(paragraph) { - $scope.$emit('moveParagraphUp', paragraph); - }; + $scope.moveUp = function (paragraph) { + $scope.$emit('moveParagraphUp', paragraph) + } - $scope.moveDown = function(paragraph) { - $scope.$emit('moveParagraphDown', paragraph); - }; + $scope.moveDown = function (paragraph) { + $scope.$emit('moveParagraphDown', paragraph) + } - $scope.insertNew = function(position) { - $scope.$emit('insertParagraph', $scope.paragraph.id, position); - }; + $scope.insertNew = function (position) { + $scope.$emit('insertParagraph', $scope.paragraph.id, position) + } - $scope.copyPara = function(position) { - var editorValue = $scope.getEditorValue(); + $scope.copyPara = function (position) { + let editorValue = $scope.getEditorValue() if (editorValue) { - $scope.copyParagraph(editorValue, position); + $scope.copyParagraph(editorValue, position) } - }; + } - $scope.copyParagraph = function(data, position) { - var newIndex = -1; - for (var i = 0; i < $scope.note.paragraphs.length; i++) { + $scope.copyParagraph = function (data, position) { + let newIndex = -1 + for (let i = 0; i < $scope.note.paragraphs.length; i++) { if ($scope.note.paragraphs[i].id === $scope.paragraph.id) { - //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 } - var config = angular.copy($scope.paragraph.config); - config.editorHide = false; + let config = angular.copy($scope.paragraph.config) + config.editorHide = false websocketMsgSrv.copyParagraph(newIndex, $scope.paragraph.title, data, - config, $scope.paragraph.settings.params); - }; + config, $scope.paragraph.settings.params) + } - $scope.removeParagraph = function(paragraph) { - var paragraphs = angular.element('div[id$="_paragraphColumn_main"]'); + $scope.removeParagraph = function (paragraph) { + let paragraphs = angular.element('div[id$="_paragraphColumn_main"]') if (paragraphs[paragraphs.length - 1].id.indexOf(paragraph.id) === 0) { BootstrapDialog.alert({ closable: true, message: 'The last paragraph can\'t be deleted.', - callback: function(result) { + callback: function (result) { if (result) { - $scope.editor.focus(); + $scope.editor.focus() } } - }); + }) } else { BootstrapDialog.confirm({ closable: true, title: '', message: 'Do you want to delete this paragraph?', - callback: function(result) { + callback: function (result) { if (result) { - console.log('Remove paragraph'); - websocketMsgSrv.removeParagraph(paragraph.id); - $scope.$emit('moveFocusToNextParagraph', $scope.paragraph.id); + console.log('Remove paragraph') + websocketMsgSrv.removeParagraph(paragraph.id) + $scope.$emit('moveFocusToNextParagraph', $scope.paragraph.id) } } - }); + }) } - }; + } - $scope.clearParagraphOutput = function(paragraph) { - websocketMsgSrv.clearParagraphOutput(paragraph.id); - }; + $scope.clearParagraphOutput = function (paragraph) { + websocketMsgSrv.clearParagraphOutput(paragraph.id) + } - $scope.toggleEditor = function(paragraph) { + $scope.toggleEditor = function (paragraph) { if (paragraph.config.editorHide) { - $scope.openEditor(paragraph); + $scope.openEditor(paragraph) } else { - $scope.closeEditor(paragraph); - } - }; - - $scope.closeEditor = function(paragraph) { - console.log('close the note'); - paragraph.config.editorHide = true; - commitParagraph(paragraph); - }; - - $scope.openEditor = function(paragraph) { - console.log('open the note'); - paragraph.config.editorHide = false; - commitParagraph(paragraph); - }; - - $scope.closeTable = function(paragraph) { - console.log('close the output'); - paragraph.config.tableHide = true; - commitParagraph(paragraph); - }; - - $scope.openTable = function(paragraph) { - console.log('open the output'); - paragraph.config.tableHide = false; - commitParagraph(paragraph); - }; - - var openEditorAndCloseTable = function(paragraph) { - manageEditorAndTableState(paragraph, false, true); - }; - - var closeEditorAndOpenTable = function(paragraph) { - manageEditorAndTableState(paragraph, true, false); - }; - - var openEditorAndOpenTable = function(paragraph) { - manageEditorAndTableState(paragraph, false, false); - }; - - var manageEditorAndTableState = function(paragraph, hideEditor, hideTable) { - paragraph.config.editorHide = hideEditor; - paragraph.config.tableHide = hideTable; - commitParagraph(paragraph); - }; - - $scope.showTitle = function(paragraph) { - paragraph.config.title = true; - commitParagraph(paragraph); - }; - - $scope.hideTitle = function(paragraph) { - paragraph.config.title = false; - commitParagraph(paragraph); - }; - - $scope.setTitle = function(paragraph) { - commitParagraph(paragraph); - }; - - $scope.showLineNumbers = function(paragraph) { + $scope.closeEditor(paragraph) + } + } + + $scope.closeEditor = function (paragraph) { + console.log('close the note') + paragraph.config.editorHide = true + commitParagraph(paragraph) + } + + $scope.openEditor = function (paragraph) { + console.log('open the note') + paragraph.config.editorHide = false + commitParagraph(paragraph) + } + + $scope.closeTable = function (paragraph) { + console.log('close the output') + paragraph.config.tableHide = true + commitParagraph(paragraph) + } + + $scope.openTable = function (paragraph) { + console.log('open the output') + paragraph.config.tableHide = false + commitParagraph(paragraph) + } + + let openEditorAndCloseTable = function (paragraph) { + manageEditorAndTableState(paragraph, false, true) + } + + const closeEditorAndOpenTable = function (paragraph) { + manageEditorAndTableState(paragraph, true, false) + } + + const openEditorAndOpenTable = function (paragraph) { + manageEditorAndTableState(paragraph, false, false) + } + + const manageEditorAndTableState = function (paragraph, hideEditor, hideTable) { + paragraph.config.editorHide = hideEditor + paragraph.config.tableHide = hideTable + commitParagraph(paragraph) + } + + $scope.showTitle = function (paragraph) { + paragraph.config.title = true + commitParagraph(paragraph) + } + + $scope.hideTitle = function (paragraph) { + paragraph.config.title = false + commitParagraph(paragraph) + } + + $scope.setTitle = function (paragraph) { + commitParagraph(paragraph) + } + + $scope.showLineNumbers = function (paragraph) { if ($scope.editor) { - paragraph.config.lineNumbers = true; - $scope.editor.renderer.setShowGutter(true); - commitParagraph(paragraph); + paragraph.config.lineNumbers = true + $scope.editor.renderer.setShowGutter(true) + commitParagraph(paragraph) } - }; + } - $scope.hideLineNumbers = function(paragraph) { + $scope.hideLineNumbers = function (paragraph) { if ($scope.editor) { - paragraph.config.lineNumbers = false; - $scope.editor.renderer.setShowGutter(false); - commitParagraph(paragraph); + paragraph.config.lineNumbers = false + $scope.editor.renderer.setShowGutter(false) + commitParagraph(paragraph) } - }; + } - $scope.columnWidthClass = function(n) { + $scope.columnWidthClass = function (n) { if ($scope.asIframe) { - return 'col-md-12'; + return 'col-md-12' } else { - return 'paragraph-col col-md-' + n; + return 'paragraph-col col-md-' + n } - }; + } - $scope.changeColWidth = function(paragraph, width) { - angular.element('.navbar-right.open').removeClass('open'); - paragraph.config.colWidth = width; - commitParagraph(paragraph); - }; + $scope.changeColWidth = function (paragraph, width) { + angular.element('.navbar-right.open').removeClass('open') + paragraph.config.colWidth = width + commitParagraph(paragraph) + } - $scope.toggleOutput = function(paragraph) { - paragraph.config.tableHide = !paragraph.config.tableHide; - commitParagraph(paragraph); - }; + $scope.toggleOutput = function (paragraph) { + paragraph.config.tableHide = !paragraph.config.tableHide + commitParagraph(paragraph) + } - $scope.loadForm = function(formulaire, params) { - var value = formulaire.defaultValue; + $scope.loadForm = function (formulaire, params) { + let value = formulaire.defaultValue if (params[formulaire.name]) { - value = params[formulaire.name]; + value = params[formulaire.name] } - $scope.paragraph.settings.params[formulaire.name] = value; - }; + $scope.paragraph.settings.params[formulaire.name] = value + } - $scope.toggleCheckbox = function(formulaire, option) { - var idx = $scope.paragraph.settings.params[formulaire.name].indexOf(option.value); + $scope.toggleCheckbox = function (formulaire, option) { + let idx = $scope.paragraph.settings.params[formulaire.name].indexOf(option.value) if (idx > -1) { - $scope.paragraph.settings.params[formulaire.name].splice(idx, 1); + $scope.paragraph.settings.params[formulaire.name].splice(idx, 1) } else { - $scope.paragraph.settings.params[formulaire.name].push(option.value); + $scope.paragraph.settings.params[formulaire.name].push(option.value) } - }; + } - $scope.aceChanged = function(_, editor) { - var session = editor.getSession(); - var dirtyText = session.getValue(); - $scope.dirtyText = dirtyText; - $scope.startSaveTimer(); - setParagraphMode(session, dirtyText, editor.getCursorPosition()); - }; + $scope.aceChanged = function (_, editor) { + let session = editor.getSession() + let dirtyText = session.getValue() + $scope.dirtyText = dirtyText + $scope.startSaveTimer() + setParagraphMode(session, dirtyText, editor.getCursorPosition()) + } - $scope.aceLoaded = function(_editor) { - var langTools = ace.require('ace/ext/language_tools'); - var Range = ace.require('ace/range').Range; + $scope.aceLoaded = function (_editor) { + let langTools = ace.require('ace/ext/language_tools') + let Range = ace.require('ace/range').Range - _editor.$blockScrolling = Infinity; - $scope.editor = _editor; - $scope.editor.on('input', $scope.aceChanged); + _editor.$blockScrolling = Infinity + $scope.editor = _editor + $scope.editor.on('input', $scope.aceChanged) if (_editor.container.id !== '{{paragraph.id}}_editor') { - $scope.editor.renderer.setShowGutter($scope.paragraph.config.lineNumbers); - $scope.editor.setShowFoldWidgets(false); - $scope.editor.setHighlightActiveLine(false); - $scope.editor.setHighlightGutterLine(false); - $scope.editor.getSession().setUseWrapMode(true); - $scope.editor.setTheme('ace/theme/chrome'); - $scope.editor.setReadOnly($scope.isRunning($scope.paragraph)); + $scope.editor.renderer.setShowGutter($scope.paragraph.config.lineNumbers) + $scope.editor.setShowFoldWidgets(false) + $scope.editor.setHighlightActiveLine(false) + $scope.editor.setHighlightGutterLine(false) + $scope.editor.getSession().setUseWrapMode(true) + $scope.editor.setTheme('ace/theme/chrome') + $scope.editor.setReadOnly($scope.isRunning($scope.paragraph)) if ($scope.paragraphFocused) { - $scope.editor.focus(); - $scope.goToEnd($scope.editor); + $scope.editor.focus() + $scope.goToEnd($scope.editor) } - autoAdjustEditorHeight(_editor); - angular.element(window).resize(function() { - autoAdjustEditorHeight(_editor); - }); + autoAdjustEditorHeight(_editor) + angular.element(window).resize(function () { + autoAdjustEditorHeight(_editor) + }) if (navigator.appVersion.indexOf('Mac') !== -1) { - $scope.editor.setKeyboardHandler('ace/keyboard/emacs'); - $rootScope.isMac = true; + $scope.editor.setKeyboardHandler('ace/keyboard/emacs') + $rootScope.isMac = true } else if (navigator.appVersion.indexOf('Win') !== -1 || navigator.appVersion.indexOf('X11') !== -1 || navigator.appVersion.indexOf('Linux') !== -1) { - $rootScope.isMac = false; + $rootScope.isMac = false // not applying emacs key binding while the binding override Ctrl-v. default behavior of paste text on windows. } - var remoteCompleter = { + let remoteCompleter = { getCompletions: function(editor, session, pos, prefix, callback) { - var langTools = ace.require('ace/ext/language_tools'); - var defaultKeywords = new Set(); - var getDefaultKeywords = function(err, completions) { - if (completions !== undefined) { - completions.forEach(function(c) { - defaultKeywords.add(c.value); - }); - } + let langTools = ace.require('ace/ext/language_tools') + let defaultKeywords = new Set() + + // eslint-disable-next-line handle-callback-err + let getDefaultKeywords = function(err, completions) { + if (completions !== undefined) { + completions.forEach(function(c) { + defaultKeywords.add(c.value) + }) + } } if (langTools.keyWordCompleter !== undefined) { - langTools.keyWordCompleter.getCompletions(editor, session, pos, prefix, getDefaultKeywords); + langTools.keyWordCompleter.getCompletions(editor, session, pos, prefix, getDefaultKeywords) } if (!editor.isFocused()) { - return; + return } - pos = session.getTextRange(new Range(0, 0, pos.row, pos.column)).length; - var buf = session.getValue(); + pos = session.getTextRange(new Range(0, 0, pos.row, pos.column)).length + let buf = session.getValue() - websocketMsgSrv.completion($scope.paragraph.id, buf, pos); + websocketMsgSrv.completion($scope.paragraph.id, buf, pos) $scope.$on('completionList', function(event, data) { - var computeCaption = function(value, meta) { - var metaLength = meta !== undefined ? meta.length : 0; - var length = 42; - var whitespaceLength = 3; - var ellipses = '...'; - var maxLengthCaption = length - metaLength - whitespaceLength - ellipses.length; + let computeCaption = function(value, meta) { + let metaLength = meta !== undefined ? meta.length : 0 + let length = 42 + let whitespaceLength = 3 + let ellipses = '...' + let maxLengthCaption = length - metaLength - whitespaceLength - ellipses.length if (value !== undefined && value.length > maxLengthCaption) { - return value.substr(0, maxLengthCaption) + ellipses; + return value.substr(0, maxLengthCaption) + ellipses } - return value; + return value } if (data.completions) { - var completions = []; - for (var c in data.completions) { - var v = data.completions[c]; + let completions = [] + for (let c in data.completions) { + let v = data.completions[c] if (v.meta !== undefined && v.meta === 'keyword' && defaultKeywords.has(v.value.trim())) { - continue; + continue } completions.push({ name: v.name, @@ -687,43 +700,43 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat meta: v.meta, caption: computeCaption(v.value, v.meta), score: 300 - }); + }) } - callback(null, completions); + callback(null, completions) } - }); + }) } - }; + } langTools.setCompleters([remoteCompleter, langTools.keyWordCompleter, langTools.snippetCompleter, - langTools.textCompleter]); + langTools.textCompleter]) $scope.editor.setOptions({ enableBasicAutocompletion: true, enableSnippets: false, enableLiveAutocompletion: false - }); + }) - $scope.editor.on('focus', function() { - handleFocus(true); - }); + $scope.editor.on('focus', function () { + handleFocus(true) + }) - $scope.editor.on('blur', function() { - handleFocus(false); - $scope.saveParagraph($scope.paragraph); - }); + $scope.editor.on('blur', function () { + handleFocus(false) + $scope.saveParagraph($scope.paragraph) + }) - $scope.editor.on('paste', function(e) { + $scope.editor.on('paste', function (e) { if (e.text.indexOf('%') === 0) { - pastePercentSign = true; + pastePercentSign = true } - }); + }) - $scope.editor.getSession().on('change', function(e, editSession) { - autoAdjustEditorHeight(_editor); - }); + $scope.editor.getSession().on('change', function (e, editSession) { + autoAdjustEditorHeight(_editor) + }) - setParagraphMode($scope.editor.getSession(), $scope.editor.getSession().getValue()); + setParagraphMode($scope.editor.getSession(), $scope.editor.getSession().getValue()) // autocomplete on '.' /* @@ -738,113 +751,113 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat */ // remove binding - $scope.editor.commands.removeCommand('showSettingsMenu'); + $scope.editor.commands.removeCommand('showSettingsMenu') - var isOption = $rootScope.isMac? 'option' : 'alt'; + let isOption = $rootScope.isMac ? 'option' : 'alt' - $scope.editor.commands.bindKey('ctrl-' + isOption + '-n.', null); - $scope.editor.commands.bindKey('ctrl-' + isOption + '-l', null); - $scope.editor.commands.bindKey('ctrl-' + isOption + '-w', null); - $scope.editor.commands.bindKey('ctrl-' + isOption + '-a', null); - $scope.editor.commands.bindKey('ctrl-' + isOption + '-k', null); - $scope.editor.commands.bindKey('ctrl-' + isOption + '-e', null); - $scope.editor.commands.bindKey('ctrl-' + isOption + '-t', null); - $scope.editor.commands.bindKey('ctrl-space', null); + $scope.editor.commands.bindKey('ctrl-' + isOption + '-n.', null) + $scope.editor.commands.bindKey('ctrl-' + isOption + '-l', null) + $scope.editor.commands.bindKey('ctrl-' + isOption + '-w', null) + $scope.editor.commands.bindKey('ctrl-' + isOption + '-a', null) + $scope.editor.commands.bindKey('ctrl-' + isOption + '-k', null) + $scope.editor.commands.bindKey('ctrl-' + isOption + '-e', null) + $scope.editor.commands.bindKey('ctrl-' + isOption + '-t', null) + $scope.editor.commands.bindKey('ctrl-space', null) if ($rootScope.isMac) { - $scope.editor.commands.bindKey('command-l', null); + $scope.editor.commands.bindKey('command-l', null) } else { - $scope.editor.commands.bindKey('ctrl-l', null); + $scope.editor.commands.bindKey('ctrl-l', null) } // autocomplete on 'ctrl+.' - $scope.editor.commands.bindKey('ctrl-.', 'startAutocomplete'); + $scope.editor.commands.bindKey('ctrl-.', 'startAutocomplete') - var keyBindingEditorFocusAction = function(scrollValue) { - var numRows = $scope.editor.getSession().getLength(); - var currentRow = $scope.editor.getCursorPosition().row; + let keyBindingEditorFocusAction = function (scrollValue) { + let numRows = $scope.editor.getSession().getLength() + let currentRow = $scope.editor.getCursorPosition().row if (currentRow === 0 && scrollValue <= 0) { // move focus to previous paragraph - $scope.$emit('moveFocusToPreviousParagraph', $scope.paragraph.id); + $scope.$emit('moveFocusToPreviousParagraph', $scope.paragraph.id) } else if (currentRow === numRows - 1 && scrollValue >= 0) { - $scope.$emit('moveFocusToNextParagraph', $scope.paragraph.id); + $scope.$emit('moveFocusToNextParagraph', $scope.paragraph.id) } else { - $scope.scrollToCursor($scope.paragraph.id, scrollValue); + $scope.scrollToCursor($scope.paragraph.id, scrollValue) } - }; + } // handle cursor moves - $scope.editor.keyBinding.origOnCommandKey = $scope.editor.keyBinding.onCommandKey; - $scope.editor.keyBinding.onCommandKey = function(e, hashId, keyCode) { + $scope.editor.keyBinding.origOnCommandKey = $scope.editor.keyBinding.onCommandKey + $scope.editor.keyBinding.onCommandKey = function (e, hashId, keyCode) { if ($scope.editor.completer && $scope.editor.completer.activated) { // if autocompleter is active } else { // fix ace editor focus issue in chrome (textarea element goes to top: -1000px after focused by cursor move) if (parseInt(angular.element('#' + $scope.paragraph.id + '_editor > textarea') .css('top').replace('px', '')) < 0) { - var position = $scope.editor.getCursorPosition(); - var cursorPos = $scope.editor.renderer.$cursorLayer.getPixelPosition(position, true); - angular.element('#' + $scope.paragraph.id + '_editor > textarea').css('top', cursorPos.top); + let position = $scope.editor.getCursorPosition() + let cursorPos = $scope.editor.renderer.$cursorLayer.getPixelPosition(position, true) + angular.element('#' + $scope.paragraph.id + '_editor > textarea').css('top', cursorPos.top) } - var ROW_UP = -1; - var ROW_DOWN = 1; + let ROW_UP = -1 + let ROW_DOWN = 1 switch (keyCode) { case 38: - keyBindingEditorFocusAction(ROW_UP); - break; + keyBindingEditorFocusAction(ROW_UP) + break case 80: if (e.ctrlKey && !e.altKey) { - keyBindingEditorFocusAction(ROW_UP); + keyBindingEditorFocusAction(ROW_UP) } - break; + break case 40: - keyBindingEditorFocusAction(ROW_DOWN); - break; + keyBindingEditorFocusAction(ROW_DOWN) + break case 78: if (e.ctrlKey && !e.altKey) { - keyBindingEditorFocusAction(ROW_DOWN); + keyBindingEditorFocusAction(ROW_DOWN) } - break; + break } } - this.origOnCommandKey(e, hashId, keyCode); - }; + this.origOnCommandKey(e, hashId, keyCode) + } } - }; + } - var handleFocus = function(value, isDigestPass) { - $scope.paragraphFocused = value; + const handleFocus = function (value, isDigestPass) { + $scope.paragraphFocused = value if (isDigestPass === false || isDigestPass === undefined) { // Protect against error in case digest is already running - $timeout(function() { + $timeout(function () { // Apply changes since they come from 3rd party library - $scope.$digest(); - }); + $scope.$digest() + }) } - }; + } - var getEditorSetting = function(paragraph, interpreterName) { - var deferred = $q.defer(); - websocketMsgSrv.getEditorSetting(paragraph.id, interpreterName); + let getEditorSetting = function (paragraph, interpreterName) { + let deferred = $q.defer() + websocketMsgSrv.getEditorSetting(paragraph.id, interpreterName) $timeout( - $scope.$on('editorSetting', function(event, data) { - if (paragraph.id === data.paragraphId) { - deferred.resolve(data); - } + $scope.$on('editorSetting', function (event, data) { + if (paragraph.id === data.paragraphId) { + deferred.resolve(data) } - ), 1000); - return deferred.promise; - }; - - var setEditorLanguage = function(session, language) { - var mode = 'ace/mode/'; - mode += language; - $scope.paragraph.config.editorMode = mode; - session.setMode(mode); - }; - - var setParagraphMode = function(session, paragraphText, pos) { + } + ), 1000) + return deferred.promise + } + + let setEditorLanguage = function (session, language) { + let mode = 'ace/mode/' + mode += language + $scope.paragraph.config.editorMode = mode + session.setMode(mode) + } + + const setParagraphMode = function (session, paragraphText, pos) { // Evaluate the mode only if the the position is undefined // or the first 30 characters of the paragraph have been modified // or cursor position is at beginning of second line.(in case user hit enter after typing %magic) @@ -853,221 +866,220 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat // If paragraph loading, use config value if exists if ((typeof pos === 'undefined') && $scope.paragraph.config.editorMode && !setInterpreterBindings) { - session.setMode($scope.paragraph.config.editorMode); + session.setMode($scope.paragraph.config.editorMode) } else { - var magic = getInterpreterName(paragraphText); + let magic = getInterpreterName(paragraphText) if (editorSetting.magic !== magic) { - editorSetting.magic = magic; + editorSetting.magic = magic getEditorSetting($scope.paragraph, magic) - .then(function(setting) { - setEditorLanguage(session, setting.editor.language); - _.merge($scope.paragraph.config.editorSetting, setting.editor); - }); + .then(function (setting) { + setEditorLanguage(session, setting.editor.language) + _.merge($scope.paragraph.config.editorSetting, setting.editor) + }) } } } - pastePercentSign = false; - setInterpreterBindings = false; - }; + pastePercentSign = false + setInterpreterBindings = false + } - var getInterpreterName = function(paragraphText) { - var intpNameRegexp = /^\s*%(.+?)(\s|\()/g; - var match = intpNameRegexp.exec(paragraphText); + const getInterpreterName = function(paragraphText) { + let intpNameRegexp = /^\s*%(.+?)(\s|\()/g + let match = intpNameRegexp.exec(paragraphText) if (match) { - return match[1].trim(); + return match[1].trim() // get default interpreter name if paragraph text doesn't start with '%' // TODO(mina): dig into the cause what makes interpreterBindings to have no element } else if ($scope.$parent.interpreterBindings && $scope.$parent.interpreterBindings.length !== 0) { - return $scope.$parent.interpreterBindings[0].name; + return $scope.$parent.interpreterBindings[0].name } - return ''; - }; + return '' + } - var autoAdjustEditorHeight = function(editor) { - var height = + const autoAdjustEditorHeight = function (editor) { + let height = editor.getSession().getScreenLength() * editor.renderer.lineHeight + - editor.renderer.scrollBar.getWidth(); + editor.renderer.scrollBar.getWidth() - angular.element('#' + editor.container.id).height(height.toString() + 'px'); - editor.resize(); - }; + angular.element('#' + editor.container.id).height(height.toString() + 'px') + editor.resize() + } - $rootScope.$on('scrollToCursor', function(event) { + $rootScope.$on('scrollToCursor', function (event) { // scroll on 'scrollToCursor' event only when cursor is in the last paragraph - var paragraphs = angular.element('div[id$="_paragraphColumn_main"]'); + let paragraphs = angular.element('div[id$="_paragraphColumn_main"]') if (paragraphs[paragraphs.length - 1].id.indexOf($scope.paragraph.id) === 0) { - $scope.scrollToCursor($scope.paragraph.id, 0); + $scope.scrollToCursor($scope.paragraph.id, 0) } - }); + }) /** scrollToCursor if it is necessary * when cursor touches scrollTriggerEdgeMargin from the top (or bottom) of the screen, it autoscroll to place cursor around 1/3 of screen height from the top (or bottom) * paragraphId : paragraph that has active cursor * lastCursorMove : 1(down), 0, -1(up) last cursor move event **/ - $scope.scrollToCursor = function(paragraphId, lastCursorMove) { + $scope.scrollToCursor = function (paragraphId, lastCursorMove) { if (!$scope.editor || !$scope.editor.isFocused()) { // only make sense when editor is focused - return; + return } - var lineHeight = $scope.editor.renderer.lineHeight; - var headerHeight = 103; // menubar, notebook titlebar - var scrollTriggerEdgeMargin = 50; + let lineHeight = $scope.editor.renderer.lineHeight + let headerHeight = 103 // menubar, notebook titlebar + let scrollTriggerEdgeMargin = 50 - var documentHeight = angular.element(document).height(); - var windowHeight = angular.element(window).height(); // actual viewport height + let documentHeight = angular.element(document).height() + let windowHeight = angular.element(window).height() // actual viewport height - var scrollPosition = angular.element(document).scrollTop(); - var editorPosition = angular.element('#' + paragraphId + '_editor').offset(); - var position = $scope.editor.getCursorPosition(); - var lastCursorPosition = $scope.editor.renderer.$cursorLayer.getPixelPosition(position, true); + let scrollPosition = angular.element(document).scrollTop() + let editorPosition = angular.element('#' + paragraphId + '_editor').offset() + let position = $scope.editor.getCursorPosition() + let lastCursorPosition = $scope.editor.renderer.$cursorLayer.getPixelPosition(position, true) - var calculatedCursorPosition = editorPosition.top + lastCursorPosition.top + lineHeight * lastCursorMove; + let calculatedCursorPosition = editorPosition.top + lastCursorPosition.top + lineHeight * lastCursorMove - var scrollTargetPos; + let scrollTargetPos if (calculatedCursorPosition < scrollPosition + headerHeight + scrollTriggerEdgeMargin) { - scrollTargetPos = calculatedCursorPosition - headerHeight - ((windowHeight - headerHeight) / 3); + scrollTargetPos = calculatedCursorPosition - headerHeight - ((windowHeight - headerHeight) / 3) if (scrollTargetPos < 0) { - scrollTargetPos = 0; + scrollTargetPos = 0 } } else if (calculatedCursorPosition > scrollPosition + scrollTriggerEdgeMargin + windowHeight - headerHeight) { - scrollTargetPos = calculatedCursorPosition - headerHeight - ((windowHeight - headerHeight) * 2 / 3); + scrollTargetPos = calculatedCursorPosition - headerHeight - ((windowHeight - headerHeight) * 2 / 3) if (scrollTargetPos > documentHeight) { - scrollTargetPos = documentHeight; + scrollTargetPos = documentHeight } } // cancel previous scroll animation - var bodyEl = angular.element('body'); - bodyEl.stop(); - bodyEl.finish(); + let bodyEl = angular.element('body') + bodyEl.stop() + bodyEl.finish() // scroll to scrollTargetPos - bodyEl.scrollTo(scrollTargetPos, {axis: 'y', interrupt: true, duration: 100}); - }; + bodyEl.scrollTo(scrollTargetPos, {axis: 'y', interrupt: true, duration: 100}) + } - $scope.getEditorValue = function() { - return !$scope.editor ? $scope.paragraph.text : $scope.editor.getValue(); - }; + $scope.getEditorValue = function () { + return !$scope.editor ? $scope.paragraph.text : $scope.editor.getValue() + } - $scope.getProgress = function() { - return $scope.currentProgress || 0; - }; + $scope.getProgress = function () { + return $scope.currentProgress || 0 + } - $scope.getExecutionTime = function(pdata) { - var timeMs = Date.parse(pdata.dateFinished) - Date.parse(pdata.dateStarted); + $scope.getExecutionTime = function (pdata) { + let timeMs = Date.parse(pdata.dateFinished) - Date.parse(pdata.dateStarted) if (isNaN(timeMs) || timeMs < 0) { if ($scope.isResultOutdated(pdata)) { - return 'outdated'; + return 'outdated' } - return ''; + return '' } - var user = (pdata.user === undefined || pdata.user === null) ? 'anonymous' : pdata.user; - var desc = 'Took ' + moment.duration((timeMs / 1000), 'seconds').format('h [hrs] m [min] s [sec]') + - '. Last updated by ' + user + ' at ' + moment(pdata.dateFinished).format('MMMM DD YYYY, h:mm:ss A') + '.'; + let user = (pdata.user === undefined || pdata.user === null) ? 'anonymous' : pdata.user + let desc = 'Took ' + moment.duration((timeMs / 1000), 'seconds').format('h [hrs] m [min] s [sec]') + + '. Last updated by ' + user + ' at ' + moment(pdata.dateFinished).format('MMMM DD YYYY, h:mm:ss A') + '.' if ($scope.isResultOutdated(pdata)) { - desc += ' (outdated)'; + desc += ' (outdated)' } - return desc; - }; + return desc + } - $scope.getElapsedTime = function(paragraph) { - return 'Started ' + moment(paragraph.dateStarted).fromNow() + '.'; - }; + $scope.getElapsedTime = function (paragraph) { + return 'Started ' + moment(paragraph.dateStarted).fromNow() + '.' + } - $scope.isResultOutdated = function(pdata) { + $scope.isResultOutdated = function (pdata) { if (pdata.dateUpdated !== undefined && Date.parse(pdata.dateUpdated) > Date.parse(pdata.dateStarted)) { - return true; + return true } - return false; - }; + return false + } - $scope.goToEnd = function(editor) { - editor.navigateFileEnd(); - }; + $scope.goToEnd = function (editor) { + editor.navigateFileEnd() + } - $scope.parseTableCell = function(cell) { + $scope.parseTableCell = function (cell) { if (!isNaN(cell)) { if (cell.length === 0 || Number(cell) > Number.MAX_SAFE_INTEGER || Number(cell) < Number.MIN_SAFE_INTEGER) { - return cell; + return cell } else { - return Number(cell); + return Number(cell) } } - var d = moment(cell); + let d = moment(cell) if (d.isValid()) { - return d; + return d } - return cell; - }; + return cell + } - var commitParagraph = function(paragraph) { + const commitParagraph = function (paragraph) { const { id, title, text, config, settings: {params}, - } = paragraph; + } = paragraph - websocketMsgSrv.commitParagraph(id, title, text, config, params); - }; + websocketMsgSrv.commitParagraph(id, title, text, config, params) + } /** Utility function */ - $scope.goToSingleParagraph = function() { - var noteId = $route.current.pathParams.noteId; - var redirectToUrl = location.protocol + '//' + location.host + location.pathname + '#/notebook/' + noteId + - '/paragraph/' + $scope.paragraph.id + '?asIframe'; - $window.open(redirectToUrl); - }; - - $scope.showScrollDownIcon = function(id) { - var doc = angular.element('#p' + id + '_text'); + $scope.goToSingleParagraph = function () { + let noteId = $route.current.pathParams.noteId + let redirectToUrl = location.protocol + '//' + location.host + location.pathname + '#/notebook/' + noteId + + '/paragraph/' + $scope.paragraph.id + '?asIframe' + $window.open(redirectToUrl) + } + + $scope.showScrollDownIcon = function (id) { + let doc = angular.element('#p' + id + '_text') if (doc[0]) { - return doc[0].scrollHeight > doc.innerHeight(); + return doc[0].scrollHeight > doc.innerHeight() } - return false; - }; + return false + } - $scope.scrollParagraphDown = function(id) { - var doc = angular.element('#p' + id + '_text'); - doc.animate({scrollTop: doc[0].scrollHeight}, 500); - $scope.keepScrollDown = true; - }; + $scope.scrollParagraphDown = function (id) { + let doc = angular.element('#p' + id + '_text') + doc.animate({scrollTop: doc[0].scrollHeight}, 500) + $scope.keepScrollDown = true + } - $scope.showScrollUpIcon = function(id) { + $scope.showScrollUpIcon = function (id) { if (angular.element('#p' + id + '_text')[0]) { - return angular.element('#p' + id + '_text')[0].scrollTop !== 0; + return angular.element('#p' + id + '_text')[0].scrollTop !== 0 } - return false; - - }; + return false + } - $scope.scrollParagraphUp = function(id) { - var doc = angular.element('#p' + id + '_text'); - doc.animate({scrollTop: 0}, 500); - $scope.keepScrollDown = false; - }; + $scope.scrollParagraphUp = function (id) { + let doc = angular.element('#p' + id + '_text') + doc.animate({scrollTop: 0}, 500) + $scope.keepScrollDown = false + } - $scope.$on('angularObjectUpdate', function(event, data) { - var noteId = $route.current.pathParams.noteId; + $scope.$on('angularObjectUpdate', function (event, data) { + let noteId = $route.current.pathParams.noteId if (!data.noteId || data.noteId === noteId) { - var scope; - var registry; + let scope + let registry if (!data.paragraphId || data.paragraphId === $scope.paragraph.id) { - scope = paragraphScope; - registry = angularObjectRegistry; + scope = paragraphScope + registry = angularObjectRegistry } else { - return; + return } - var varName = data.angularObject.name; + let varName = data.angularObject.name if (angular.equals(data.angularObject.object, scope[varName])) { // return when update has no change - return; + return } if (!registry[varName]) { @@ -1075,87 +1087,89 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat interpreterGroupId: data.interpreterGroupId, noteId: data.noteId, paragraphId: data.paragraphId - }; + } } else { - registry[varName].noteId = registry[varName].noteId || data.noteId; - registry[varName].paragraphId = registry[varName].paragraphId || data.paragraphId; + registry[varName].noteId = registry[varName].noteId || data.noteId + registry[varName].paragraphId = registry[varName].paragraphId || data.paragraphId } - registry[varName].skipEmit = true; + registry[varName].skipEmit = true if (!registry[varName].clearWatcher) { - registry[varName].clearWatcher = scope.$watch(varName, function(newValue, oldValue) { - console.log('angular object (paragraph) updated %o %o', varName, registry[varName]); + registry[varName].clearWatcher = scope.$watch(varName, function (newValue, oldValue) { + console.log('angular object (paragraph) updated %o %o', varName, registry[varName]) if (registry[varName].skipEmit) { - registry[varName].skipEmit = false; - return; + registry[varName].skipEmit = false + return } websocketMsgSrv.updateAngularObject( registry[varName].noteId, registry[varName].paragraphId, varName, newValue, - registry[varName].interpreterGroupId); - }); + registry[varName].interpreterGroupId) + }) } - console.log('angular object (paragraph) created %o', varName); - scope[varName] = data.angularObject.object; + console.log('angular object (paragraph) created %o', varName) + scope[varName] = data.angularObject.object // create proxy for AngularFunction if (varName.indexOf(ANGULAR_FUNCTION_OBJECT_NAME_PREFIX) === 0) { - var funcName = varName.substring((ANGULAR_FUNCTION_OBJECT_NAME_PREFIX).length); - scope[funcName] = function() { - scope[varName] = arguments; - console.log('angular function (paragraph) invoked %o', arguments); - }; + let funcName = varName.substring((ANGULAR_FUNCTION_OBJECT_NAME_PREFIX).length) + scope[funcName] = function () { + // eslint-disable-next-line prefer-rest-params + scope[varName] = arguments + // eslint-disable-next-line prefer-rest-params + console.log('angular function (paragraph) invoked %o', arguments) + } - console.log('angular function (paragraph) created %o', scope[funcName]); + console.log('angular function (paragraph) created %o', scope[funcName]) } } - }); + }) - $scope.$on('updateParaInfos', function(event, data) { + $scope.$on('updateParaInfos', function (event, data) { if (data.id === $scope.paragraph.id) { - $scope.paragraph.runtimeInfos = data.infos; + $scope.paragraph.runtimeInfos = data.infos } - }); + }) - $scope.$on('angularObjectRemove', function(event, data) { - var noteId = $route.current.pathParams.noteId; + $scope.$on('angularObjectRemove', function (event, data) { + let noteId = $route.current.pathParams.noteId if (!data.noteId || data.noteId === noteId) { - var scope; - var registry; + let scope + let registry if (!data.paragraphId || data.paragraphId === $scope.paragraph.id) { - scope = paragraphScope; - registry = angularObjectRegistry; + scope = paragraphScope + registry = angularObjectRegistry } else { - return; + return } - var varName = data.name; + let varName = data.name // clear watcher if (registry[varName]) { - registry[varName].clearWatcher(); - registry[varName] = undefined; + registry[varName].clearWatcher() + registry[varName] = undefined } // remove scope variable - scope[varName] = undefined; + scope[varName] = undefined // remove proxy for AngularFunction if (varName.indexOf(ANGULAR_FUNCTION_OBJECT_NAME_PREFIX) === 0) { - var funcName = varName.substring((ANGULAR_FUNCTION_OBJECT_NAME_PREFIX).length); - scope[funcName] = undefined; + let funcName = varName.substring((ANGULAR_FUNCTION_OBJECT_NAME_PREFIX).length) + scope[funcName] = undefined } } - }); + }) /** * @returns {boolean} true if updated is needed */ - function isUpdateRequired(oldPara, newPara) { + function isUpdateRequired (oldPara, newPara) { return (newPara.id === oldPara.id && (newPara.dateCreated !== oldPara.dateCreated || newPara.text !== oldPara.text || @@ -1172,287 +1186,285 @@ function ParagraphCtrl($scope, $rootScope, $route, $window, $routeParams, $locat !angular.equals(newPara.runtimeInfos, oldPara.runtimeInfos))) } - $scope.updateAllScopeTexts = function(oldPara, newPara) { + $scope.updateAllScopeTexts = function (oldPara, newPara) { if (oldPara.text !== newPara.text) { if ($scope.dirtyText) { // check if editor has local update if ($scope.dirtyText === newPara.text) { // when local update is the same from remote, clear local update - $scope.paragraph.text = newPara.text; - $scope.dirtyText = undefined; - $scope.originalText = angular.copy(newPara.text); - + $scope.paragraph.text = newPara.text + $scope.dirtyText = undefined + $scope.originalText = angular.copy(newPara.text) } else { // if there're local update, keep it. - $scope.paragraph.text = newPara.text; + $scope.paragraph.text = newPara.text } } else { - $scope.paragraph.text = newPara.text; - $scope.originalText = angular.copy(newPara.text); + $scope.paragraph.text = newPara.text + $scope.originalText = angular.copy(newPara.text) } } - }; + } - $scope.updateParagraphObjectWhenUpdated = function(newPara) { + $scope.updateParagraphObjectWhenUpdated = function (newPara) { // resize col width if ($scope.paragraph.config.colWidth !== newPara.colWidth) { - $rootScope.$broadcast('paragraphResized', $scope.paragraph.id); + $rootScope.$broadcast('paragraphResized', $scope.paragraph.id) } /** push the rest */ - $scope.paragraph.aborted = newPara.aborted; - $scope.paragraph.user = newPara.user; - $scope.paragraph.dateUpdated = newPara.dateUpdated; - $scope.paragraph.dateCreated = newPara.dateCreated; - $scope.paragraph.dateFinished = newPara.dateFinished; - $scope.paragraph.dateStarted = newPara.dateStarted; - $scope.paragraph.errorMessage = newPara.errorMessage; - $scope.paragraph.jobName = newPara.jobName; - $scope.paragraph.title = newPara.title; - $scope.paragraph.lineNumbers = newPara.lineNumbers; - $scope.paragraph.status = newPara.status; + $scope.paragraph.aborted = newPara.aborted + $scope.paragraph.user = newPara.user + $scope.paragraph.dateUpdated = newPara.dateUpdated + $scope.paragraph.dateCreated = newPara.dateCreated + $scope.paragraph.dateFinished = newPara.dateFinished + $scope.paragraph.dateStarted = newPara.dateStarted + $scope.paragraph.errorMessage = newPara.errorMessage + $scope.paragraph.jobName = newPara.jobName + $scope.paragraph.title = newPara.title + $scope.paragraph.lineNumbers = newPara.lineNumbers + $scope.paragraph.status = newPara.status if (newPara.status !== ParagraphStatus.RUNNING) { - $scope.paragraph.results = newPara.results; + $scope.paragraph.results = newPara.results } - $scope.paragraph.settings = newPara.settings; - $scope.paragraph.runtimeInfos = newPara.runtimeInfos; + $scope.paragraph.settings = newPara.settings + $scope.paragraph.runtimeInfos = newPara.runtimeInfos if ($scope.editor) { - $scope.editor.setReadOnly($scope.isRunning(newPara)); + $scope.editor.setReadOnly($scope.isRunning(newPara)) } if (!$scope.asIframe) { - $scope.paragraph.config = newPara.config; - initializeDefault(newPara.config); - } else { - newPara.config.editorHide = true; - newPara.config.tableHide = false; - $scope.paragraph.config = newPara.config; - } - }; - - $scope.updateParagraph = function(oldPara, newPara, updateCallback) { + $scope.paragraph.config = newPara.config + initializeDefault(newPara.config) + } else { + newPara.config.editorHide = true + newPara.config.tableHide = false + $scope.paragraph.config = newPara.config + } + } + + $scope.updateParagraph = function (oldPara, newPara, updateCallback) { // 1. get status, refreshed - const statusChanged = (newPara.status !== oldPara.status); - const resultRefreshed = (newPara.dateFinished !== oldPara.dateFinished) || + const statusChanged = (newPara.status !== oldPara.status) + const resultRefreshed = (newPara.dateFinished !== oldPara.dateFinished) || isEmpty(newPara.results) !== isEmpty(oldPara.results) || newPara.status === ParagraphStatus.ERROR || - (newPara.status === ParagraphStatus.FINISHED && statusChanged); + (newPara.status === ParagraphStatus.FINISHED && statusChanged) // 2. update texts managed by $scope - $scope.updateAllScopeTexts(oldPara, newPara); + $scope.updateAllScopeTexts(oldPara, newPara) // 3. execute callback to update result - updateCallback(); + updateCallback() // 4. update remaining paragraph objects - $scope.updateParagraphObjectWhenUpdated(newPara); + $scope.updateParagraphObjectWhenUpdated(newPara) // 5. handle scroll down by key properly if new paragraph is added - if (statusChanged || resultRefreshed) { + if (statusChanged || resultRefreshed) { // when last paragraph runs, zeppelin automatically appends new paragraph. // this broadcast will focus to the newly inserted paragraph - const paragraphs = angular.element('div[id$="_paragraphColumn_main"]'); - if (paragraphs.length >= 2 && paragraphs[paragraphs.length - 2].id.indexOf($scope.paragraph.id) === 0) { + const paragraphs = angular.element('div[id$="_paragraphColumn_main"]') + if (paragraphs.length >= 2 && paragraphs[paragraphs.length - 2].id.indexOf($scope.paragraph.id) === 0) { // rendering output can took some time. So delay scrolling event firing for sometime. - setTimeout(() => { $rootScope.$broadcast('scrollToCursor'); }, 500); - } - } - }; + setTimeout(() => { $rootScope.$broadcast('scrollToCursor') }, 500) + } + } + } /** $scope.$on */ - $scope.$on('runParagraphUsingSpell', function(event, data) { - const oldPara = $scope.paragraph; - let newPara = data.paragraph; + $scope.$on('runParagraphUsingSpell', function (event, data) { + const oldPara = $scope.paragraph + let newPara = data.paragraph const updateCallback = () => { - $scope.runParagraph(newPara.text, true, true); - }; + $scope.runParagraph(newPara.text, true, true) + } if (!isUpdateRequired(oldPara, newPara)) { - return; + return } $scope.updateParagraph(oldPara, newPara, updateCallback) - }); + }) - $scope.$on('updateParagraph', function(event, data) { - const oldPara = $scope.paragraph; - const newPara = data.paragraph; + $scope.$on('updateParagraph', function (event, data) { + const oldPara = $scope.paragraph + const newPara = data.paragraph if (!isUpdateRequired(oldPara, newPara)) { - return; + return } const updateCallback = () => { // broadcast `updateResult` message to trigger result update if (newPara.results && newPara.results.msg) { for (let i in newPara.results.msg) { - const newResult = newPara.results.msg ? newPara.results.msg[i] : {}; - const oldResult = (oldPara.results && oldPara.results.msg) ? - oldPara.results.msg[i] : {}; - const newConfig = newPara.config.results ? newPara.config.results[i] : {}; - const oldConfig = oldPara.config.results ? oldPara.config.results[i] : {}; + const newResult = newPara.results.msg ? newPara.results.msg[i] : {} + const oldResult = (oldPara.results && oldPara.results.msg) + ? oldPara.results.msg[i] : {} + const newConfig = newPara.config.results ? newPara.config.results[i] : {} + const oldConfig = oldPara.config.results ? oldPara.config.results[i] : {} if (!angular.equals(newResult, oldResult) || !angular.equals(newConfig, oldConfig)) { - $rootScope.$broadcast('updateResult', newResult, newConfig, newPara, parseInt(i)); + $rootScope.$broadcast('updateResult', newResult, newConfig, newPara, parseInt(i)) } } } - }; + } $scope.updateParagraph(oldPara, newPara, updateCallback) - }); + }) - $scope.$on('updateProgress', function(event, data) { + $scope.$on('updateProgress', function (event, data) { if (data.id === $scope.paragraph.id) { - $scope.currentProgress = data.progress; + $scope.currentProgress = data.progress } - }); + }) - $scope.$on('keyEvent', function(event, keyEvent) { + $scope.$on('keyEvent', function (event, keyEvent) { if ($scope.paragraphFocused) { - - var paragraphId = $scope.paragraph.id; - var keyCode = keyEvent.keyCode; - var noShortcutDefined = false; - var editorHide = $scope.paragraph.config.editorHide; + let paragraphId = $scope.paragraph.id + let keyCode = keyEvent.keyCode + let noShortcutDefined = false + let editorHide = $scope.paragraph.config.editorHide if (editorHide && (keyCode === 38 || (keyCode === 80 && keyEvent.ctrlKey && !keyEvent.altKey))) { // up // move focus to previous paragraph - $scope.$emit('moveFocusToPreviousParagraph', paragraphId); + $scope.$emit('moveFocusToPreviousParagraph', paragraphId) } else if (editorHide && (keyCode === 40 || (keyCode === 78 && keyEvent.ctrlKey && !keyEvent.altKey))) { // down // move focus to next paragraph - $scope.$emit('moveFocusToNextParagraph', paragraphId); + $scope.$emit('moveFocusToNextParagraph', paragraphId) } else if (keyEvent.shiftKey && keyCode === 13) { // Shift + Enter - $scope.runParagraphFromShortcut($scope.getEditorValue()); + $scope.runParagraphFromShortcut($scope.getEditorValue()) } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 67) { // Ctrl + Alt + c - $scope.cancelParagraph($scope.paragraph); + $scope.cancelParagraph($scope.paragraph) } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 68) { // Ctrl + Alt + d - $scope.removeParagraph($scope.paragraph); + $scope.removeParagraph($scope.paragraph) } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 75) { // Ctrl + Alt + k - $scope.moveUp($scope.paragraph); + $scope.moveUp($scope.paragraph) } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 74) { // Ctrl + Alt + j - $scope.moveDown($scope.paragraph); + $scope.moveDown($scope.paragraph) } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 65) { // Ctrl + Alt + a - $scope.insertNew('above'); + $scope.insertNew('above') } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 66) { // Ctrl + Alt + b - $scope.insertNew('below'); + $scope.insertNew('below') } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 79) { // Ctrl + Alt + o - $scope.toggleOutput($scope.paragraph); + $scope.toggleOutput($scope.paragraph) } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 82) { // Ctrl + Alt + r - $scope.toggleEnableDisable($scope.paragraph); + $scope.toggleEnableDisable($scope.paragraph) } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 69) { // Ctrl + Alt + e - $scope.toggleEditor($scope.paragraph); + $scope.toggleEditor($scope.paragraph) } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 77) { // Ctrl + Alt + m if ($scope.paragraph.config.lineNumbers) { - $scope.hideLineNumbers($scope.paragraph); + $scope.hideLineNumbers($scope.paragraph) } else { - $scope.showLineNumbers($scope.paragraph); + $scope.showLineNumbers($scope.paragraph) } } else if (keyEvent.ctrlKey && keyEvent.shiftKey && keyCode === 189) { // Ctrl + Shift + - - $scope.changeColWidth($scope.paragraph, Math.max(1, $scope.paragraph.config.colWidth - 1)); + $scope.changeColWidth($scope.paragraph, Math.max(1, $scope.paragraph.config.colWidth - 1)) } else if (keyEvent.ctrlKey && keyEvent.shiftKey && keyCode === 187) { // Ctrl + Shift + = - $scope.changeColWidth($scope.paragraph, Math.min(12, $scope.paragraph.config.colWidth + 1)); + $scope.changeColWidth($scope.paragraph, Math.min(12, $scope.paragraph.config.colWidth + 1)) } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 84) { // Ctrl + Alt + t if ($scope.paragraph.config.title) { - $scope.hideTitle($scope.paragraph); + $scope.hideTitle($scope.paragraph) } else { - $scope.showTitle($scope.paragraph); + $scope.showTitle($scope.paragraph) } } else if (keyEvent.ctrlKey && keyEvent.shiftKey && keyCode === 67) { // Ctrl + Alt + c - $scope.copyPara('below'); + $scope.copyPara('below') } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 76) { // Ctrl + Alt + l - $scope.clearParagraphOutput($scope.paragraph); + $scope.clearParagraphOutput($scope.paragraph) } else if (keyEvent.ctrlKey && keyEvent.altKey && keyCode === 87) { // Ctrl + Alt + w - $scope.goToSingleParagraph(); + $scope.goToSingleParagraph() } else { - noShortcutDefined = true; + noShortcutDefined = true } if (!noShortcutDefined) { - keyEvent.preventDefault(); + keyEvent.preventDefault() } } - }); + }) - $scope.$on('focusParagraph', function(event, paragraphId, cursorPos, mouseEvent) { + $scope.$on('focusParagraph', function (event, paragraphId, cursorPos, mouseEvent) { if ($scope.paragraph.id === paragraphId) { // focus editor if (!$scope.paragraph.config.editorHide) { if (!mouseEvent) { - $scope.editor.focus(); + $scope.editor.focus() // move cursor to the first row (or the last row) - var row; + let row if (cursorPos >= 0) { - row = cursorPos; - $scope.editor.gotoLine(row, 0); + row = cursorPos + $scope.editor.gotoLine(row, 0) } else { - row = $scope.editor.session.getLength(); - $scope.editor.gotoLine(row, 0); + row = $scope.editor.session.getLength() + $scope.editor.gotoLine(row, 0) } - $scope.scrollToCursor($scope.paragraph.id, 0); + $scope.scrollToCursor($scope.paragraph.id, 0) } } - handleFocus(true); + handleFocus(true) } else { if ($scope.editor !== undefined && $scope.editor !== null) { - $scope.editor.blur(); + $scope.editor.blur() } - var isDigestPass = true; - handleFocus(false, isDigestPass); + let isDigestPass = true + handleFocus(false, isDigestPass) } - }); + }) - $scope.$on('saveInterpreterBindings', function(event, paragraphId) { + $scope.$on('saveInterpreterBindings', function (event, paragraphId) { if ($scope.paragraph.id === paragraphId && $scope.editor) { - setInterpreterBindings = true; - setParagraphMode($scope.editor.getSession(), $scope.editor.getSession().getValue()); + setInterpreterBindings = true + setParagraphMode($scope.editor.getSession(), $scope.editor.getSession().getValue()) } - }); + }) - $scope.$on('doubleClickParagraph', function(event, paragraphId) { + $scope.$on('doubleClickParagraph', function (event, paragraphId) { if ($scope.paragraph.id === paragraphId && $scope.paragraph.config.editorHide && $scope.paragraph.config.editorSetting.editOnDblClick && $scope.revisionView !== true) { - var deferred = $q.defer(); - openEditorAndCloseTable($scope.paragraph); + let deferred = $q.defer() + openEditorAndCloseTable($scope.paragraph) $timeout( - $scope.$on('updateParagraph', function(event, data) { - deferred.resolve(data); - } - ), 1000); + $scope.$on('updateParagraph', function (event, data) { + deferred.resolve(data) + } + ), 1000) - deferred.promise.then(function(data) { + deferred.promise.then(function (data) { if ($scope.editor) { - $scope.editor.focus(); - $scope.goToEnd($scope.editor); + $scope.editor.focus() + $scope.goToEnd($scope.editor) } - }); + }) } - }); + }) - $scope.$on('openEditor', function(event) { - $scope.openEditor($scope.paragraph); - }); + $scope.$on('openEditor', function (event) { + $scope.openEditor($scope.paragraph) + }) - $scope.$on('closeEditor', function(event) { - $scope.closeEditor($scope.paragraph); - }); + $scope.$on('closeEditor', function (event) { + $scope.closeEditor($scope.paragraph) + }) - $scope.$on('openTable', function(event) { - $scope.openTable($scope.paragraph); - }); + $scope.$on('openTable', function (event) { + $scope.openTable($scope.paragraph) + }) - $scope.$on('closeTable', function(event) { - $scope.closeTable($scope.paragraph); - }); + $scope.$on('closeTable', function (event) { + $scope.closeTable($scope.paragraph) + }) - $scope.$on('resultRendered', function(event, paragraphId) { + $scope.$on('resultRendered', function (event, paragraphId) { if ($scope.paragraph.id !== paragraphId) { - return; + return } /** increase spell result count and return if not finished */ if (!$scope.increaseSpellTransactionResultCount()) { - return; + return } - $scope.cleanupSpellTransaction(); - }); + $scope.cleanupSpellTransaction() + }) }
http://git-wip-us.apache.org/repos/asf/zeppelin/blob/19b0f30f/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js index f8a1f63..29b203c 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.controller.test.js @@ -1,54 +1,53 @@ -describe('Controller: ParagraphCtrl', function() { +describe('Controller: ParagraphCtrl', function () { + beforeEach(angular.mock.module('zeppelinWebApp')) - beforeEach(angular.mock.module('zeppelinWebApp')); - - var scope; - var websocketMsgSrvMock = {}; - var paragraphMock = { + let scope + let websocketMsgSrvMock = {} + let paragraphMock = { config: {}, settings: { forms: {} } - }; - var route = { + } + let route = { current: { pathParams: { noteId: 'noteId' } } - }; + } - beforeEach(inject(function($controller, $rootScope) { - scope = $rootScope.$new(); - $rootScope.notebookScope = $rootScope.$new(true, $rootScope); + beforeEach(inject(function ($controller, $rootScope) { + scope = $rootScope.$new() + $rootScope.notebookScope = $rootScope.$new(true, $rootScope) $controller('ParagraphCtrl', { $scope: scope, websocketMsgSrv: websocketMsgSrvMock, $element: {}, $route: route - }); + }) - scope.init(paragraphMock); - })); + scope.init(paragraphMock) + })) - var functions = ['isRunning', 'getIframeDimensions', 'cancelParagraph', 'runParagraph', 'saveParagraph', + let functions = ['isRunning', 'getIframeDimensions', 'cancelParagraph', 'runParagraph', 'saveParagraph', 'moveUp', 'moveDown', 'insertNew', 'removeParagraph', 'toggleEditor', 'closeEditor', 'openEditor', 'closeTable', 'openTable', 'showTitle', 'hideTitle', 'setTitle', 'showLineNumbers', 'hideLineNumbers', 'changeColWidth', 'columnWidthClass', 'toggleOutput', 'loadForm', - 'aceChanged', 'aceLoaded', 'getEditorValue', 'getProgress', 'getExecutionTime', 'isResultOutdated']; - - functions.forEach(function(fn) { - it('check for scope functions to be defined : ' + fn, function() { - expect(scope[fn]).toBeDefined(); - }); - }); - - it('should have this array of values for "colWidthOption"', function() { - expect(scope.colWidthOption).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]); - }); - - it('should set default value of "paragraphFocused" as false', function() { - expect(scope.paragraphFocused).toEqual(false); - }); -}); + 'aceChanged', 'aceLoaded', 'getEditorValue', 'getProgress', 'getExecutionTime', 'isResultOutdated'] + + functions.forEach(function (fn) { + it('check for scope functions to be defined : ' + fn, function () { + expect(scope[fn]).toBeDefined() + }) + }) + + it('should have this array of values for "colWidthOption"', function () { + expect(scope.colWidthOption).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]) + }) + + it('should set default value of "paragraphFocused" as false', function () { + expect(scope.paragraphFocused).toEqual(false) + }) +}) http://git-wip-us.apache.org/repos/asf/zeppelin/blob/19b0f30f/zeppelin-web/src/app/notebook/paragraph/paragraph.status.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/app/notebook/paragraph/paragraph.status.js b/zeppelin-web/src/app/notebook/paragraph/paragraph.status.js index c2e9027..f839eee 100644 --- a/zeppelin-web/src/app/notebook/paragraph/paragraph.status.js +++ b/zeppelin-web/src/app/notebook/paragraph/paragraph.status.js @@ -19,12 +19,12 @@ export const ParagraphStatus = { FINISHED: 'FINISHED', ABORT: 'ABORT', ERROR: 'ERROR', -}; +} -export function isParagraphRunning(paragraph) { - if (!paragraph) { return false; } - const status = paragraph.status; - if (!status) { return false; } +export function isParagraphRunning (paragraph) { + if (!paragraph) { return false } + const status = paragraph.status + if (!status) { return false } - return status === ParagraphStatus.PENDING || status === ParagraphStatus.RUNNING; + return status === ParagraphStatus.PENDING || status === ParagraphStatus.RUNNING }