http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8c7424a1/zeppelin-web/src/components/navbar/navbar.controller.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/components/navbar/navbar.controller.js b/zeppelin-web/src/components/navbar/navbar.controller.js new file mode 100644 index 0000000..0aa24ef --- /dev/null +++ b/zeppelin-web/src/components/navbar/navbar.controller.js @@ -0,0 +1,49 @@ +/* global $:false */ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +angular.module('zeppelinWebApp').controller('NavCtrl', function($scope, $rootScope, $routeParams, notebookListDataFactory, websocketMsgSrv) { + /** Current list of notes (ids) */ + + var vm = this; + vm.notes = notebookListDataFactory; + vm.connected = false; + vm.websocketMsgSrv = websocketMsgSrv; + + $('#notebook-list').perfectScrollbar({suppressScrollX: true}); + + $scope.$on('setNoteMenu', function(event, notes) { + notebookListDataFactory.setNotes(notes); + }); + + $scope.$on('setConnectedStatus', function(event, param) { + vm.connected = param; + }); + + function loadNotes() { + websocketMsgSrv.getNotebookList(); + } + + function isActive(noteId) { + return ($routeParams.noteId === noteId); + } + + vm.loadNotes = loadNotes; + vm.isActive = isActive; + + vm.loadNotes(); + +});
http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8c7424a1/zeppelin-web/src/components/navbar/navbar.html ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/components/navbar/navbar.html b/zeppelin-web/src/components/navbar/navbar.html new file mode 100644 index 0000000..ebdd1fb --- /dev/null +++ b/zeppelin-web/src/components/navbar/navbar.html @@ -0,0 +1,54 @@ +<!-- +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--> +<div class="navbar navbar-inverse navbar-fixed-top" style="display: none;" role="navigation" ng-class="{'displayNavBar': !asIframe}"> + <div class="container"> + <div class="navbar-header"> + <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse"> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + <span class="icon-bar"></span> + </button> + <a class="navbar-brand" href="#/"> + <img style="margin-top: -7px;s" src="assets/images/zepLogoW.png" width="50" alt="I'm zeppelin"> Zeppelin + </a> + </div> + + <div class="collapse navbar-collapse" ng-controller="NavCtrl as navbar"> + <ul class="nav navbar-nav"> + <li class="dropdown"> + <a href="#" class="dropdown-toggle">Notebook <span class="caret"></span></a> + <ul class="dropdown-menu" role="menu"> + <li><a href="javascript:void(0);" ng-click="navbar.websocketMsgSrv.createNotebook()"><i class="fa fa-plus"></i> Create new note</a></li> + <li class="divider"></li> + <div id="notebook-list" class="scrollbar-container"> + <li ng-repeat="note in navbar.notes.list track by $index" ng-class="{'active' : navbar.isActive(note.id)}"> + <a href="#/notebook/{{note.id}}">{{note.name || 'Note ' + note.id}} </a> + </li> + </div> + </ul> + </li> + <li> + <a href="#/interpreter">Interpreter</a> + </li> + </ul> + <ul class="nav navbar-nav navbar-right" style="margin-top:10px; margin-right:5px;"> + <li class="server-status"> + <i class="fa fa-circle" ng-class="{'server-connected':navbar.connected, 'server-disconnected':!navbar.connected}"></i> + <span ng-show="navbar.connected">Connected</span> + <span ng-show="!navbar.connected">Disconnected</span> + </li> + </ul> + </div> + </div> +</div> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8c7424a1/zeppelin-web/src/components/ngdelete/ngdelete.directive.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/components/ngdelete/ngdelete.directive.js b/zeppelin-web/src/components/ngdelete/ngdelete.directive.js new file mode 100644 index 0000000..1ddf1eb --- /dev/null +++ b/zeppelin-web/src/components/ngdelete/ngdelete.directive.js @@ -0,0 +1,28 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +'use strict'; + +angular.module('zeppelinWebApp').directive('ngDelete', function() { + return function(scope, element, attrs) { + element.bind('keydown keyup', function(event) { + if (event.which === 27 || event.which === 46) { + scope.$apply(function() { + scope.$eval(attrs.ngEnter); + }); + event.preventDefault(); + } + }); + }; +}); http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8c7424a1/zeppelin-web/src/components/ngenter/ngenter.directive.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/components/ngenter/ngenter.directive.js b/zeppelin-web/src/components/ngenter/ngenter.directive.js new file mode 100644 index 0000000..f284c69 --- /dev/null +++ b/zeppelin-web/src/components/ngenter/ngenter.directive.js @@ -0,0 +1,27 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +angular.module('zeppelinWebApp').directive('ngEnter', function() { + return function(scope, element, attrs) { + element.bind('keydown keypress', function(event) { + if (event.which === 13) { + scope.$apply(function() { + scope.$eval(attrs.ngEnter); + }); + event.preventDefault(); + } + }); + }; +}); http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8c7424a1/zeppelin-web/src/components/notebookListDataFactory/notebookList.datafactory.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/components/notebookListDataFactory/notebookList.datafactory.js b/zeppelin-web/src/components/notebookListDataFactory/notebookList.datafactory.js new file mode 100644 index 0000000..ae48999 --- /dev/null +++ b/zeppelin-web/src/components/notebookListDataFactory/notebookList.datafactory.js @@ -0,0 +1,26 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +angular.module('zeppelinWebApp').factory('notebookListDataFactory', function() { + var notes = {}; + + notes.list = []; + + notes.setNotes = function(notesList) { + notes.list = angular.copy(notesList); + }; + + return notes; +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8c7424a1/zeppelin-web/src/components/popover-html-unsafe/popover-html-unsafe-popup.html ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/components/popover-html-unsafe/popover-html-unsafe-popup.html b/zeppelin-web/src/components/popover-html-unsafe/popover-html-unsafe-popup.html new file mode 100644 index 0000000..f537aee --- /dev/null +++ b/zeppelin-web/src/components/popover-html-unsafe/popover-html-unsafe-popup.html @@ -0,0 +1,21 @@ +<div class="popover {{placement}}" ng-class="{ in: isOpen(), fade: animation() }"> +<!-- +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +--> + <div class="arrow"></div> + + <div class="popover-inner"> + <h3 class="popover-title" ng-bind="title" ng-show="title"></h3> + <div class="popover-content" bind-html-unsafe="content"></div> + </div> +</div> http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8c7424a1/zeppelin-web/src/components/popover-html-unsafe/popover-html-unsafe.directive.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/components/popover-html-unsafe/popover-html-unsafe.directive.js b/zeppelin-web/src/components/popover-html-unsafe/popover-html-unsafe.directive.js new file mode 100644 index 0000000..3e405dc --- /dev/null +++ b/zeppelin-web/src/components/popover-html-unsafe/popover-html-unsafe.directive.js @@ -0,0 +1,28 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +angular.module('zeppelinWebApp') + .directive('popoverHtmlUnsafePopup', function() { + return { + restrict: 'EA', + replace: true, + scope: { title: '@', content: '@', placement: '@', animation: '&', isOpen: '&' }, + templateUrl: 'components/popover-html-unsafe/popover-html-unsafe-popup.html' + }; + }) + + .directive('popoverHtmlUnsafe', ['$tooltip', function($tooltip) { + return $tooltip('popoverHtmlUnsafe', 'popover', 'click'); + }]); http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8c7424a1/zeppelin-web/src/components/resizable/resizable.directive.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/components/resizable/resizable.directive.js b/zeppelin-web/src/components/resizable/resizable.directive.js new file mode 100644 index 0000000..fe46a24 --- /dev/null +++ b/zeppelin-web/src/components/resizable/resizable.directive.js @@ -0,0 +1,41 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +angular.module('zeppelinWebApp').directive('resizable', function () { + var resizableConfig = { + autoHide: true, + handles: 'se', + helper: 'resizable-helper', + minHeight:100, + grid: [10000, 10] // allow only vertical + }; + + return { + restrict: 'A', + scope: { + callback: '&onResize' + }, + link: function postLink(scope, elem, attrs) { + attrs.$observe('allowresize', function(isAllowed) { + if (isAllowed === 'true') { + elem.resizable(resizableConfig); + elem.on('resizestop', function () { + if (scope.callback) { scope.callback(); } + }); + } + }); + } + }; +}); http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8c7424a1/zeppelin-web/src/components/websocketEvents/websocketEvents.factory.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/components/websocketEvents/websocketEvents.factory.js b/zeppelin-web/src/components/websocketEvents/websocketEvents.factory.js new file mode 100644 index 0000000..2c01210 --- /dev/null +++ b/zeppelin-web/src/components/websocketEvents/websocketEvents.factory.js @@ -0,0 +1,66 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +angular.module('zeppelinWebApp').factory('websocketEvents', function($rootScope, $websocket, baseUrlSrv) { + var websocketCalls = {}; + + websocketCalls.ws = $websocket(baseUrlSrv.getWebsocketProtocol() + '://' + location.hostname + ':' + baseUrlSrv.getPort()); + + websocketCalls.ws.onOpen(function() { + console.log('Websocket created'); + $rootScope.$broadcast('setConnectedStatus', true); + }); + + + websocketCalls.sendNewEvent = function(data) { + console.log('Send >> %o, %o', data.op, data); + websocketCalls.ws.send(JSON.stringify(data)); + }; + + websocketCalls.ws.onMessage(function(event) { + var payload; + if (event.data) { + payload = angular.fromJson(event.data); + } + console.log('Receive << %o, %o', payload.op, payload); + var op = payload.op; + var data = payload.data; + if (op === 'NOTE') { + $rootScope.$broadcast('setNoteContent', data.note); + } else if (op === 'NOTES_INFO') { + $rootScope.$broadcast('setNoteMenu', data.notes); + } else if (op === 'PARAGRAPH') { + $rootScope.$broadcast('updateParagraph', data); + } else if (op === 'PROGRESS') { + $rootScope.$broadcast('updateProgress', data); + } else if (op === 'COMPLETION_LIST') { + $rootScope.$broadcast('completionList', data); + } else if (op === 'ANGULAR_OBJECT_UPDATE') { + $rootScope.$broadcast('angularObjectUpdate', data); + } + }); + + websocketCalls.ws.onError(function(event) { + console.log('error message: ', event); + $rootScope.$broadcast('setConnectedStatus', false); + }); + + websocketCalls.ws.onClose(function(event) { + console.log('close message: ', event); + $rootScope.$broadcast('setConnectedStatus', false); + }); + + return websocketCalls; +}); \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8c7424a1/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js b/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js new file mode 100644 index 0000000..2c4f132 --- /dev/null +++ b/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js @@ -0,0 +1,107 @@ +/* + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +angular.module('zeppelinWebApp').service('websocketMsgSrv', function($rootScope, websocketEvents) { + + return { + + createNotebook: function() { + websocketEvents.sendNewEvent({op: 'NEW_NOTE'}); + }, + + deleteNotebook: function(noteId) { + websocketEvents.sendNewEvent({op: 'DEL_NOTE', data: {id: noteId}}); + }, + + getNotebookList: function() { + websocketEvents.sendNewEvent({op: 'LIST_NOTES'}); + }, + + getNotebook: function(noteId) { + websocketEvents.sendNewEvent({op: 'GET_NOTE', data: {id: noteId}}); + }, + + updateNotebook: function(noteId, noteName, noteConfig) { + websocketEvents.sendNewEvent({op: 'NOTE_UPDATE', data: {id: noteId, name: noteName, config : noteConfig}}); + }, + + moveParagraph: function(paragraphId, newIndex) { + websocketEvents.sendNewEvent({ op: 'MOVE_PARAGRAPH', data : {id: paragraphId, index: newIndex}}); + }, + + insertParagraph: function(newIndex) { + websocketEvents.sendNewEvent({ op: 'INSERT_PARAGRAPH', data : {index: newIndex}}); + }, + + updateAngularObject: function(noteId, name, value, interpreterGroupId) { + websocketEvents.sendNewEvent({ + op: 'ANGULAR_OBJECT_UPDATED', + data: { + noteId: noteId, + name: name, + value: value, + interpreterGroupId: interpreterGroupId + } + }); + }, + + cancelParagraphRun: function(paragraphId) { + websocketEvents.sendNewEvent({op: 'CANCEL_PARAGRAPH', data: {id: paragraphId}}); + }, + + runParagraph: function(paragraphId, paragraphTitle, paragraphData, paragraphConfig, paragraphParams) { + websocketEvents.sendNewEvent({ + op: 'RUN_PARAGRAPH', + data: { + id: paragraphId, + title: paragraphTitle, + paragraph: paragraphData, + config: paragraphConfig, + params: paragraphParams + } + }); + }, + + removeParagraph: function(paragraphId) { + websocketEvents.sendNewEvent({op: 'PARAGRAPH_REMOVE', data: {id: paragraphId}}); + }, + + completion: function(paragraphId, buf, cursor) { + websocketEvents.sendNewEvent({ + op : 'COMPLETION', + data : { + id : paragraphId, + buf : buf, + cursor : cursor + } + }); + }, + + commitParagraph: function(paragraphId, paragraphTitle, paragraphData, paragraphConfig, paragraphParams) { + websocketEvents.sendNewEvent({ + op: 'COMMIT_PARAGRAPH', + data: { + id: paragraphId, + title : paragraphTitle, + paragraph: paragraphData, + config: paragraphConfig, + params: paragraphParams + } + }); + } + + }; + +}); http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8c7424a1/zeppelin-web/src/favicon.ico ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/favicon.ico b/zeppelin-web/src/favicon.ico new file mode 100644 index 0000000..7e5049a Binary files /dev/null and b/zeppelin-web/src/favicon.ico differ http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8c7424a1/zeppelin-web/src/fonts/FontAwesome.otf ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/fonts/FontAwesome.otf b/zeppelin-web/src/fonts/FontAwesome.otf new file mode 100644 index 0000000..81c9ad9 Binary files /dev/null and b/zeppelin-web/src/fonts/FontAwesome.otf differ http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/8c7424a1/zeppelin-web/src/fonts/Simple-Line-Icons.eot ---------------------------------------------------------------------- diff --git a/zeppelin-web/src/fonts/Simple-Line-Icons.eot b/zeppelin-web/src/fonts/Simple-Line-Icons.eot new file mode 100644 index 0000000..d258f62 Binary files /dev/null and b/zeppelin-web/src/fonts/Simple-Line-Icons.eot differ
