You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@zeppelin.apache.org by mo...@apache.org on 2015/08/16 17:17:42 UTC

incubator-zeppelin git commit: ZEPPELIN-210 Show notebook in a homescreen

Repository: incubator-zeppelin
Updated Branches:
  refs/heads/master d5ab911bf -> 014696197


ZEPPELIN-210 Show notebook in a homescreen

https://issues.apache.org/jira/browse/ZEPPELIN-210

This patch lets user specify a notebook id by `ZEPPELIN_NOTEBOOK_HOMESCREEN` environment variable or `zeppelin.notebook.homescreen` property. Then Zeppelin default homescreen will be replaced by the notebook.

Here's an example of home screen
![image](https://cloud.githubusercontent.com/assets/1540981/9153389/8039610e-3e07-11e5-8ef5-5407798d86b1.png)

Author: Lee moon soo <mo...@apache.org>

This patch had conflicts when merged, resolved by
Committer: Lee moon soo <mo...@apache.org>

Closes #191 from Leemoonsoo/homenotebook and squashes the following commits:

1a30e48 [Lee moon soo] Add ZEPPELIN_NOTEBOOK_HOMESCREEN, ZEPPELIN_NOTEBOOK_HOMESCREEN_HIDE to zeppelin-env.sh.template
e14fdb6 [Lee moon soo] add zeppelin.notebook.homescreen.hide option
7e88ee4 [Lee moon soo] Add zeppelin.notebook.homescreen to zeppelin-site.xml.tempate
10d4665 [Lee moon soo] Add home screen theme
6ea2318 [Lee moon soo] show notebook in a homescreen


Project: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/commit/01469619
Tree: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/tree/01469619
Diff: http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/diff/01469619

Branch: refs/heads/master
Commit: 014696197be71ff1186e3075b3e2f25cffbaccd7
Parents: d5ab911
Author: Lee moon soo <mo...@apache.org>
Authored: Sun Aug 9 15:00:29 2015 -0700
Committer: Lee moon soo <mo...@apache.org>
Committed: Sun Aug 16 08:17:38 2015 -0700

----------------------------------------------------------------------
 conf/zeppelin-env.sh.template                   |  2 +
 conf/zeppelin-site.xml.template                 | 13 +++
 .../org/apache/zeppelin/socket/Message.java     |  2 +
 .../apache/zeppelin/socket/NotebookServer.java  | 33 +++++++
 zeppelin-web/src/app/home/home.controller.js    | 26 +++++-
 zeppelin-web/src/app/home/home.css              |  3 +-
 zeppelin-web/src/app/home/home.html             | 21 ++++-
 .../src/assets/styles/looknfeel/home.css        | 97 ++++++++++++++++++++
 .../websocketEvents/websocketMsg.service.js     |  4 +
 .../zeppelin/conf/ZeppelinConfiguration.java    |  4 +
 .../org/apache/zeppelin/notebook/Notebook.java  |  3 +
 11 files changed, 204 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/01469619/conf/zeppelin-env.sh.template
----------------------------------------------------------------------
diff --git a/conf/zeppelin-env.sh.template b/conf/zeppelin-env.sh.template
index bfaf436..a5beda7 100644
--- a/conf/zeppelin-env.sh.template
+++ b/conf/zeppelin-env.sh.template
@@ -26,6 +26,8 @@
 # export ZEPPELIN_LOG_DIR        		# Where log files are stored.  PWD by default.
 # export ZEPPELIN_PID_DIR        		# The pid files are stored. /tmp by default.
 # export ZEPPELIN_NOTEBOOK_DIR   		# Where notebook saved
+# export ZEPPELIN_NOTEBOOK_HOMESCREEN		# Id of notebook to be displayed in homescreen. ex) 2A94M5J1Z
+# export ZEPPELIN_NOTEBOOK_HOMESCREEN_HIDE	# hide homescreen notebook from list when this value set to "true". default "false"
 # export ZEPPELIN_NOTEBOOK_S3_BUCKET    # Bucket where notebook saved
 # export ZEPPELIN_NOTEBOOK_S3_USER      # User in bucket where notebook saved. For example bucket/user/notebook/2A94M5J1Z/note.json
 # export ZEPPELIN_IDENT_STRING   		# A string representing this instance of zeppelin. $USER by default.

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/01469619/conf/zeppelin-site.xml.template
----------------------------------------------------------------------
diff --git a/conf/zeppelin-site.xml.template b/conf/zeppelin-site.xml.template
index 6d03f6e..57d1b23 100644
--- a/conf/zeppelin-site.xml.template
+++ b/conf/zeppelin-site.xml.template
@@ -37,6 +37,19 @@
   <description>path or URI for notebook persist</description>
 </property>
 
+<property>
+  <name>zeppelin.notebook.homescreen</name>
+  <value></value>
+  <description>id of notebook to be displayed in homescreen. ex) 2A94M5J1Z Empty value displays default home screen</description>
+</property>
+
+<property>
+  <name>zeppelin.notebook.homescreen.hide</name>
+  <value>false</value>
+  <description>hide homescreen notebook from list when this value set to true</description>
+</property>
+
+
 <!-- If used S3 to storage the notebooks, it is necessary the following folder structure bucketname/username/notebook/ -->
 <!--
 <property>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/01469619/zeppelin-server/src/main/java/org/apache/zeppelin/socket/Message.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/Message.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/Message.java
index d78f202..1784c53 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/Message.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/Message.java
@@ -34,6 +34,8 @@ public class Message {
    *
    */
   public static enum OP {
+    GET_HOME_NOTE, // [c-s] load note for home screen
+
     GET_NOTE, // [c-s] client load note
               // @param id note id
 

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/01469619/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
----------------------------------------------------------------------
diff --git a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
index 8c8b600..8a02b53 100644
--- a/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
+++ b/zeppelin-server/src/main/java/org/apache/zeppelin/socket/NotebookServer.java
@@ -25,6 +25,9 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import javax.servlet.http.HttpServletRequest;
+
+import org.apache.zeppelin.conf.ZeppelinConfiguration;
+import org.apache.zeppelin.conf.ZeppelinConfiguration.ConfVars;
 import org.apache.zeppelin.display.AngularObject;
 import org.apache.zeppelin.display.AngularObjectRegistry;
 import org.apache.zeppelin.display.AngularObjectRegistryListener;
@@ -110,6 +113,9 @@ public class NotebookServer extends WebSocketServlet implements
           case LIST_NOTES:
             broadcastNoteList();
             break;
+          case GET_HOME_NOTE:
+            sendHomeNote(conn, notebook);
+            break;
           case GET_NOTE:
             sendNote(conn, notebook, messagereceived);
             break;
@@ -279,10 +285,20 @@ public class NotebookServer extends WebSocketServlet implements
 
   private void broadcastNoteList() {
     Notebook notebook = notebook();
+
+    ZeppelinConfiguration conf = notebook.getConf();
+    String homescreenNotebookId = conf.getString(ConfVars.ZEPPELIN_NOTEBOOK_HOMESCREEN);
+    boolean hideHomeScreenNotebookFromList = conf
+        .getBoolean(ConfVars.ZEPPELIN_NOTEBOOK_HOMESCREEN_HIDE);
+
     List<Note> notes = notebook.getAllNotes();
     List<Map<String, String>> notesInfo = new LinkedList<>();
     for (Note note : notes) {
       Map<String, String> info = new HashMap<>();
+      if (hideHomeScreenNotebookFromList && note.id().equals(homescreenNotebookId)) {
+        continue;
+      }
+
       info.put("id", note.id());
       info.put("name", note.getName());
       notesInfo.add(info);
@@ -306,6 +322,23 @@ public class NotebookServer extends WebSocketServlet implements
     }
   }
 
+  private void sendHomeNote(NotebookSocket conn, Notebook notebook) throws IOException {
+    String noteId = notebook.getConf().getString(ConfVars.ZEPPELIN_NOTEBOOK_HOMESCREEN);
+
+    Note note = null;
+    if (noteId != null) {
+      note = notebook.getNote(noteId);
+    }
+
+    if (note != null) {
+      addConnectionToNote(note.id(), conn);
+      conn.send(serializeMessage(new Message(OP.NOTE).put("note", note)));
+      sendAllAngularObjects(note, conn);
+    } else {
+      conn.send(serializeMessage(new Message(OP.NOTE).put("note", null)));
+    }
+  }
+
   private void updateNote(WebSocket conn, Notebook notebook, Message fromMessage)
       throws SchedulerException, IOException {
     String noteId = (String) fromMessage.get("id");

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/01469619/zeppelin-web/src/app/home/home.controller.js
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/home/home.controller.js b/zeppelin-web/src/app/home/home.controller.js
index e66201c..d3fba0f 100644
--- a/zeppelin-web/src/app/home/home.controller.js
+++ b/zeppelin-web/src/app/home/home.controller.js
@@ -13,10 +13,34 @@
  */
 'use strict';
 
-angular.module('zeppelinWebApp').controller('HomeCtrl', function($scope, notebookListDataFactory, websocketMsgSrv) {
+angular.module('zeppelinWebApp').controller('HomeCtrl', function($scope, notebookListDataFactory, websocketMsgSrv, $rootScope) {
   
   var vm = this;
   vm.notes = notebookListDataFactory;
   vm.websocketMsgSrv = websocketMsgSrv;
+
+  $scope.notebookHome = false;
+  $scope.staticHome = false;
   
+  var initHome = function() {
+    websocketMsgSrv.getHomeNotebook();
+  }
+
+  initHome();
+
+  $scope.$on('setNoteContent', function(event, note) {
+    if (note) {
+      $scope.note = note;
+
+      // initialize look And Feel
+      $rootScope.$broadcast('setLookAndFeel', 'home');
+
+      // make it read only
+      $scope.viewOnly = true;
+
+      $scope.notebookHome = true;
+    } else {
+      $scope.staticHome = true;
+    }
+  });
 });

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/01469619/zeppelin-web/src/app/home/home.css
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/home/home.css b/zeppelin-web/src/app/home/home.css
index 9bf1e7b..5d5e115 100644
--- a/zeppelin-web/src/app/home/home.css
+++ b/zeppelin-web/src/app/home/home.css
@@ -293,5 +293,4 @@ This part should be removed when new version of bootstrap handles this issue.
 .btn-group > .tooltip + .btn,
 .btn-group > .popover + .btn {
   margin-left:-1px;
-}
-
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/01469619/zeppelin-web/src/app/home/home.html
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/app/home/home.html b/zeppelin-web/src/app/home/home.html
index b3991ae..f437d61 100644
--- a/zeppelin-web/src/app/home/home.html
+++ b/zeppelin-web/src/app/home/home.html
@@ -12,7 +12,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 -->
 
-<div class="box width-full home" ng-controller="HomeCtrl as home">
+<div ng-show="staticHome" class="box width-full home" ng-controller="HomeCtrl as home">
   <div class="zeppelin">
     <div class="zeppelin2"></div>
   </div>
@@ -51,3 +51,22 @@ limitations under the License.
   </div>
   <br/><br/><br/>
 </div>
+
+
+<!-- Load notebook -->
+<div id="{{currentParagraph.id}}_paragraphColumn_main"
+     ng-show="notebookHome"
+     ng-repeat="currentParagraph in note.paragraphs"
+     ng-controller="ParagraphCtrl"
+     ng-Init="init(currentParagraph)"
+     ng-class="columnWidthClass(currentParagraph.config.colWidth)"
+     class="paragraph-col">
+  <div id="{{currentParagraph.id}}_paragraphColumn"
+       ng-if="currentParagraph.result"
+       ng-include src="'app/notebook/paragraph/paragraph.html'"
+       ng-class="{'paragraph-space box paragraph-margin': !asIframe, 'focused': paragraphFocused}"
+       ng-hide="currentParagraph.config.tableHide && viewOnly">
+  </div>
+</div>
+
+<div style="clear:both;height:10px"></div>

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/01469619/zeppelin-web/src/assets/styles/looknfeel/home.css
----------------------------------------------------------------------
diff --git a/zeppelin-web/src/assets/styles/looknfeel/home.css b/zeppelin-web/src/assets/styles/looknfeel/home.css
new file mode 100644
index 0000000..b25d37a
--- /dev/null
+++ b/zeppelin-web/src/assets/styles/looknfeel/home.css
@@ -0,0 +1,97 @@
+/*
+ * 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.
+ */
+
+
+/**
+ * Theme for homescreen
+ */
+
+
+body {
+  background: #ecf0f1;
+}
+
+/**
+ * Box and well
+ */
+.box{
+  border-style: solid;
+  min-height: 20px;
+  padding: 19px;
+  margin-bottom: 20px;
+}
+
+.box, 
+.well {
+  background-color: #ffffff;
+  border-color: #e5e5e5;
+  border-width: 1px 1px 2px;
+  border-radius: 3px;
+  -webkit-box-shadow: none;
+  box-shadow: none;
+}
+
+.paragraph {
+  min-height: 32px;
+}
+
+.noteAction {
+  background-color: white;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.15);
+  color: #2c3e50;
+  border-bottom: 1px solid #E5E5E5;
+}
+
+.control span {
+    margin-left: 4px;
+}
+
+.control {
+    padding: 4px;
+}
+
+.paragraph-space {
+  margin-bottom: 5px;
+  padding: 10px !important;
+}
+
+.editor,
+.executionTime,
+.nv-controlsWrap {
+  display:block;
+}
+
+
+.paragraph .control {
+  visibility : hidden;
+  right:15px;
+  top: 6px;
+}
+
+.paragraph:hover .control {
+  visibility : hidden;
+}
+
+.noteAction span, .noteAction button, .noteAction form {
+  visibility : hidden;
+}
+
+.noteAction:hover span, .noteAction:hover button, .noteAction:hover form {
+  visibility : visible;
+}
+
+.executionTime,
+.nv-controlsWrap {
+  display:none;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/01469619/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
index fcdc51f..a30905c 100644
--- a/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js
+++ b/zeppelin-web/src/components/websocketEvents/websocketMsg.service.js
@@ -17,6 +17,10 @@ angular.module('zeppelinWebApp').service('websocketMsgSrv', function($rootScope,
 
   return {
 
+    getHomeNotebook: function() {
+      websocketEvents.sendNewEvent({op: 'GET_HOME_NOTE'});
+    },
+
     createNotebook: function(noteName) {
       websocketEvents.sendNewEvent({op: 'NEW_NOTE',data: {name: noteName}});
     },

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/01469619/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
index 0d2eb58..6fda2b2 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/conf/ZeppelinConfiguration.java
@@ -401,6 +401,10 @@ public class ZeppelinConfiguration extends XMLConfiguration {
     ZEPPELIN_INTERPRETER_CONNECT_TIMEOUT("zeppelin.interpreter.connect.timeout", 30000),
     ZEPPELIN_ENCODING("zeppelin.encoding", "UTF-8"),
     ZEPPELIN_NOTEBOOK_DIR("zeppelin.notebook.dir", "notebook"),
+    // use specified notebook (id) as homescreen
+    ZEPPELIN_NOTEBOOK_HOMESCREEN("zeppelin.notebook.homescreen", null),
+    // whether homescreen notebook will be hidden from notebook list or not
+    ZEPPELIN_NOTEBOOK_HOMESCREEN_HIDE("zeppelin.notebook.homescreen.hide", false),
     ZEPPELIN_NOTEBOOK_S3_BUCKET("zeppelin.notebook.s3.bucket", "zeppelin"),
     ZEPPELIN_NOTEBOOK_S3_USER("zeppelin.notebook.s3.user", "user"),
     ZEPPELIN_NOTEBOOK_STORAGE("zeppelin.notebook.storage", VFSNotebookRepo.class.getName()),

http://git-wip-us.apache.org/repos/asf/incubator-zeppelin/blob/01469619/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java
----------------------------------------------------------------------
diff --git a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java
index 5383d27..03c9638 100644
--- a/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java
+++ b/zeppelin-zengine/src/main/java/org/apache/zeppelin/notebook/Notebook.java
@@ -399,5 +399,8 @@ public class Notebook {
     return replFactory;
   }
 
+  public ZeppelinConfiguration getConf() {
+    return conf;
+  }
 
 }