[OPENMEETINGS-551] basic save is added, code clean-up

Project: http://git-wip-us.apache.org/repos/asf/openmeetings/repo
Commit: http://git-wip-us.apache.org/repos/asf/openmeetings/commit/5394af08
Tree: http://git-wip-us.apache.org/repos/asf/openmeetings/tree/5394af08
Diff: http://git-wip-us.apache.org/repos/asf/openmeetings/diff/5394af08

Branch: refs/heads/master
Commit: 5394af089c42f56d8bd383609564ce08fbd4589b
Parents: 8a900e5
Author: Maxim Solodovnik <[email protected]>
Authored: Wed Apr 5 03:56:54 2017 +0000
Committer: Maxim Solodovnik <[email protected]>
Committed: Wed Apr 5 03:56:54 2017 +0000

----------------------------------------------------------------------
 .../db/dto/file/FileExplorerItemDTO.java        |  19 ++-
 .../openmeetings/db/dto/room/Whiteboard.java    |  11 ++
 .../web/common/AddFolderDialog.html             |  29 -----
 .../web/common/AddFolderDialog.java             | 107 ----------------
 .../openmeetings/web/common/NameDialog.html     |  29 +++++
 .../openmeetings/web/common/NameDialog.java     | 125 +++++++++++++++++++
 .../web/common/tree/FileTreePanel.java          |   6 +-
 .../web/room/sidebar/RoomFilePanel.java         |   4 +-
 .../web/room/sidebar/RoomSidebar.java           |   4 +-
 .../openmeetings/web/room/wb/WbPanel.html       |   2 +-
 .../openmeetings/web/room/wb/WbPanel.java       |  71 ++++++++---
 .../apache/openmeetings/web/room/wb/fabric.js   |  58 +++++----
 .../openmeetings/web/room/wb/fabric.min.js      |  18 +--
 .../org/apache/openmeetings/web/room/wb/wb.js   |  15 ++-
 .../web/user/profile/MessagesContactsPanel.java |   4 +-
 .../web/user/record/RecordingsPanel.java        |   4 +-
 .../src/main/webapp/WEB-INF/web.xml             |  12 +-
 17 files changed, 305 insertions(+), 213 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5394af08/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java
index e384ad5..49f7b23 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/file/FileExplorerItemDTO.java
@@ -31,7 +31,7 @@ import org.apache.openmeetings.db.entity.file.FileItem.Type;
 
 /**
  * This Object will represent a File on the File-System
- * 
+ *
  * @author sebastianwagner
  *
  */
@@ -44,6 +44,7 @@ public class FileExplorerItemDTO implements Serializable {
        private String hash;
        private Long parentId;
        private Long roomId;
+       private Long groupId;
        private Long ownerId;
        private Long size;
        private String externalId;
@@ -60,6 +61,7 @@ public class FileExplorerItemDTO implements Serializable {
                hash = f.getHash();
                parentId = f.getParentId();
                roomId = f.getRoomId();
+               groupId = f.getGroupId();
                ownerId = f.getOwnerId();
                size = f.getSize();
                externalId = f.getExternalId();
@@ -68,7 +70,7 @@ public class FileExplorerItemDTO implements Serializable {
                width = f.getWidth();
                height = f.getHeight();
        }
-       
+
        public FileExplorerItem get() {
                FileExplorerItem f = new FileExplorerItem();
                f.setId(id);
@@ -76,6 +78,7 @@ public class FileExplorerItemDTO implements Serializable {
                f.setHash(hash);
                f.setParentId(parentId != null && parentId > 0 ? parentId : 
null);
                f.setRoomId(roomId != null && roomId > 0 ? roomId : null);
+               f.setRoomId(groupId != null && groupId > 0 ? groupId : null);
                f.setOwnerId(ownerId != null && ownerId > 0 ? ownerId : null);
                f.setSize(size);
                f.setExternalId(externalId);
@@ -85,11 +88,11 @@ public class FileExplorerItemDTO implements Serializable {
                f.setHeight(height);
                return f;
        }
-       
+
        public Long getId() {
                return id;
        }
-       
+
        public void setId(Long id) {
                this.id = id;
        }
@@ -126,6 +129,14 @@ public class FileExplorerItemDTO implements Serializable {
                this.roomId = roomId;
        }
 
+       public Long getGroupId() {
+               return groupId;
+       }
+
+       public void setGroupId(Long groupId) {
+               this.groupId = groupId;
+       }
+
        public Long getOwnerId() {
                return ownerId;
        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5394af08/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java
index c4a3df8..a11a800 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/dto/room/Whiteboard.java
@@ -140,4 +140,15 @@ public class Whiteboard {
        public void setSlide(int slide) {
                this.slide = slide;
        }
+
+       public JSONObject toJson() {
+               //deep-copy
+               JSONObject json = new JSONObject(new 
JSONObject(this).toString());
+               json.remove("id"); //filtering
+               JSONObject items = json.getJSONObject("roomItems");
+               for (String uid : items.keySet()) {
+                       items.getJSONObject(uid).remove("_src"); //filtering
+               }
+               return json;
+       }
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5394af08/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.html
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.html
deleted file mode 100644
index 5f9cdd0..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.html
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one
-  or more contributor license agreements.  See the NOTICE file
-  distributed with this work for additional information
-  regarding copyright ownership.  The ASF licenses this file
-  to you 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.
-  
--->
-<html xmlns:wicket="http://wicket.apache.org";>
-<wicket:panel>
-       <form wicket:id="form">
-               <span style="padding-left: 20px; padding-right: 
20px;"><wicket:message key="572"/></span><input type="text" wicket:id="title"/>
-               <div wicket:id="feedback"></div>
-               <input type="submit" wicket:id="submit" 
class="invisible-form-component"/>
-       </form>
-</wicket:panel>
-</html>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5394af08/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java
deleted file mode 100644
index 022ac8d..0000000
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/AddFolderDialog.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-package org.apache.openmeetings.web.common;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.openmeetings.web.app.Application;
-import org.apache.wicket.ajax.AjaxRequestTarget;
-import org.apache.wicket.ajax.markup.html.form.AjaxButton;
-import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
-import org.apache.wicket.markup.html.form.Form;
-import org.apache.wicket.markup.html.form.RequiredTextField;
-import org.apache.wicket.markup.html.panel.FeedbackPanel;
-import org.apache.wicket.model.Model;
-
-import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
-import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
-
-public abstract class AddFolderDialog extends AbstractFormDialog<String> {
-       private static final long serialVersionUID = 1L;
-       private final DialogButton add = new DialogButton("add", 
Application.getString(1261));
-       private final DialogButton cancel = new DialogButton("cancel", 
Application.getString(219));
-       private final Form<String> form;
-       private final FeedbackPanel feedback = new FeedbackPanel("feedback");
-       private final String name;
-       private RequiredTextField<String> title;
-
-       public AddFolderDialog(String id) {
-               this(id, null);
-       }
-
-       public AddFolderDialog(String id, String name) {
-               super(id, Application.getString(1260), Model.of(name));
-               this.name = name;
-               form = new Form<String>("form", getModel()) {
-                       private static final long serialVersionUID = 1L;
-                       {
-                               add(title = new RequiredTextField<>("title", 
getModel()));
-                               
title.setLabel(Model.of(Application.getString(572)));
-                               add(feedback.setOutputMarkupId(true));
-                               add(new AjaxButton("submit") { //FAKE button so 
"submit-on-enter" works as expected
-                                       private static final long 
serialVersionUID = 1L;
-
-                                       @Override
-                                       protected void 
onSubmit(AjaxRequestTarget target) {
-                                               
AddFolderDialog.this.onSubmit(target);
-                                       }
-
-                                       @Override
-                                       protected void 
onError(AjaxRequestTarget target) {
-                                               
AddFolderDialog.this.onError(target);
-                                       }
-                               });
-                       }
-               };
-               add(form.setOutputMarkupId(true));
-       }
-
-       @Override
-       protected void onOpen(IPartialPageRequestHandler handler) {
-               handler.add(form);
-               setModelObject(name);
-               getFeedbackMessages().clear();
-       }
-
-       @Override
-       protected void onSubmit(AjaxRequestTarget target) {
-               close(target, getSubmitButton());
-       }
-
-       @Override
-       protected List<DialogButton> getButtons() {
-               return Arrays.asList(add, cancel);
-       }
-
-       @Override
-       public DialogButton getSubmitButton() {
-               return add;
-       }
-
-       @Override
-       public Form<String> getForm() {
-               return form;
-       }
-
-       @Override
-       protected void onError(AjaxRequestTarget target) {
-               target.add(feedback);
-       }
-}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5394af08/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
new file mode 100644
index 0000000..ef9e252
--- /dev/null
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.html
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you 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.
+
+-->
+<html xmlns:wicket="http://wicket.apache.org";>
+<wicket:panel>
+       <form wicket:id="form">
+               <label style="padding-left: 20px; padding-right: 20px;" 
wicket:id="label"></label><input type="text" wicket:id="title"/>
+               <div wicket:id="feedback"></div>
+               <input type="submit" wicket:id="submit" 
class="invisible-form-component"/>
+       </form>
+</wicket:panel>
+</html>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5394af08/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
new file mode 100644
index 0000000..ab4c811
--- /dev/null
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/NameDialog.java
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.openmeetings.web.common;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.openmeetings.web.app.Application;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.form.AjaxButton;
+import org.apache.wicket.core.request.handler.IPartialPageRequestHandler;
+import org.apache.wicket.markup.html.basic.Label;
+import org.apache.wicket.markup.html.form.Form;
+import org.apache.wicket.markup.html.form.RequiredTextField;
+import org.apache.wicket.model.Model;
+
+import com.googlecode.wicket.jquery.core.Options;
+import com.googlecode.wicket.jquery.ui.widget.dialog.AbstractFormDialog;
+import com.googlecode.wicket.jquery.ui.widget.dialog.DialogButton;
+import com.googlecode.wicket.kendo.ui.panel.KendoFeedbackPanel;
+
+public abstract class NameDialog extends AbstractFormDialog<String> {
+       private static final long serialVersionUID = 1L;
+       private final DialogButton add;
+       private final DialogButton cancel = new DialogButton("cancel", 
Application.getString(219));
+       private final Form<String> form;
+       private final KendoFeedbackPanel feedback = new 
KendoFeedbackPanel("feedback", new Options("button", true));
+       private final String name;
+       private RequiredTextField<String> title;
+
+       public NameDialog(String id) {
+               this(id, null);
+       }
+
+       public NameDialog(String id, String name) {
+               super(id, "", Model.of(name));
+               this.name = name;
+               add = new DialogButton("add", getAddStr());
+               form = new Form<>("form", getModel());
+       }
+
+       @Override
+       protected void onInitialize() {
+               super.onInitialize();
+               setTitle(Model.of(getTitleStr()));
+               form.add(new Label("label", getLabelStr())
+                               , title = new RequiredTextField<>("title", 
getModel())
+                               , feedback.setOutputMarkupId(true)
+                               , new AjaxButton("submit") { //FAKE button so 
"submit-on-enter" works as expected
+                                       private static final long 
serialVersionUID = 1L;
+
+                                       @Override
+                                       protected void 
onSubmit(AjaxRequestTarget target) {
+                                               
NameDialog.this.onSubmit(target);
+                                       }
+
+                                       @Override
+                                       protected void 
onError(AjaxRequestTarget target) {
+                                               NameDialog.this.onError(target);
+                                       }
+                               });
+               title.setLabel(Model.of(getLabelStr()));
+               add(form.setOutputMarkupId(true));
+       }
+
+       @Override
+       protected void onOpen(IPartialPageRequestHandler handler) {
+               handler.add(form);
+               setModelObject(name);
+               getFeedbackMessages().clear();
+       }
+
+       @Override
+       protected void onSubmit(AjaxRequestTarget target) {
+               close(target, getSubmitButton());
+       }
+
+       @Override
+       protected List<DialogButton> getButtons() {
+               return Arrays.asList(add, cancel);
+       }
+
+       @Override
+       public DialogButton getSubmitButton() {
+               return add;
+       }
+
+       @Override
+       public Form<String> getForm() {
+               return form;
+       }
+
+       @Override
+       protected void onError(AjaxRequestTarget target) {
+               target.add(feedback);
+       }
+
+       protected String getTitleStr() {
+               return getString("1260");
+       }
+
+       protected String getLabelStr() {
+               return getString("572");
+       }
+
+       protected String getAddStr() {
+               return Application.getString("1261");
+       }
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5394af08/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
index a23cbd1..dff9122 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/common/tree/FileTreePanel.java
@@ -38,7 +38,7 @@ import 
org.apache.openmeetings.db.entity.file.FileExplorerItem;
 import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.db.entity.file.FileItem.Type;
 import org.apache.openmeetings.db.entity.record.Recording;
-import org.apache.openmeetings.web.common.AddFolderDialog;
+import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import 
org.apache.openmeetings.web.common.ConfirmableAjaxBorder.ConfirmableBorderDialog;
 import org.apache.openmeetings.web.util.AjaxDownload;
@@ -91,7 +91,7 @@ public abstract class FileTreePanel extends Panel {
                }
        };
        private final Form<Void> form = new Form<>("form");
-       private final AddFolderDialog addFolder;
+       private final NameDialog addFolder;
        private final ConfirmableBorderDialog trashConfirm;
        private ConfirmableAjaxBorder trashBorder;
        private final Long roomId;
@@ -106,7 +106,7 @@ public abstract class FileTreePanel extends Panel {
        });
        private final Component upload = new WebMarkupContainer("upload");
 
-       public FileTreePanel(String id, Long roomId, AddFolderDialog addFolder, 
ConfirmableBorderDialog trashConfirm) {
+       public FileTreePanel(String id, Long roomId, NameDialog addFolder, 
ConfirmableBorderDialog trashConfirm) {
                super(id);
                this.roomId = roomId;
                this.addFolder = addFolder;

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5394af08/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
index c6aca8f..d215d71 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomFilePanel.java
@@ -26,7 +26,7 @@ import 
org.apache.openmeetings.db.dao.file.FileExplorerItemDao;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
 import org.apache.openmeetings.db.dto.record.RecordingContainerData;
 import org.apache.openmeetings.db.entity.file.FileItem;
-import org.apache.openmeetings.web.common.AddFolderDialog;
+import org.apache.openmeetings.web.common.NameDialog;
 import 
org.apache.openmeetings.web.common.ConfirmableAjaxBorder.ConfirmableBorderDialog;
 import org.apache.openmeetings.web.common.tree.FileTreePanel;
 import org.apache.openmeetings.web.room.RoomPanel;
@@ -38,7 +38,7 @@ public class RoomFilePanel extends FileTreePanel {
        private static final long serialVersionUID = 1L;
        private final RoomPanel room;
 
-       public RoomFilePanel(String id, RoomPanel room, AddFolderDialog 
addFolder, ConfirmableBorderDialog trashConfirm) {
+       public RoomFilePanel(String id, RoomPanel room, NameDialog addFolder, 
ConfirmableBorderDialog trashConfirm) {
                super(id, room.getRoom().getId(), addFolder, trashConfirm);
                this.room = room;
        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5394af08/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
index cb0e6a5..b09e688 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/sidebar/RoomSidebar.java
@@ -34,7 +34,7 @@ import org.apache.openmeetings.db.entity.room.Room;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.web.app.Application;
-import org.apache.openmeetings.web.common.AddFolderDialog;
+import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.common.ConfirmableAjaxBorder;
 import 
org.apache.openmeetings.web.common.ConfirmableAjaxBorder.ConfirmableBorderDialog;
 import org.apache.openmeetings.web.room.RoomBroadcaster;
@@ -97,7 +97,7 @@ public class RoomSidebar extends Panel {
                        item.add(new RoomClientPanel("user", item, room));
                }
        };
-       private final AddFolderDialog addFolder = new 
AddFolderDialog("addFolder", Application.getString(712)) {
+       private final NameDialog addFolder = new NameDialog("addFolder", 
Application.getString(712)) {
                private static final long serialVersionUID = 1L;
 
                @Override

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5394af08/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
index f464953..e0eb3fa 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.html
@@ -61,7 +61,6 @@
                        <div wicket:message="title:62" class="ui-widget-header 
clickable om-icon big clear-all"></div>
                        <div wicket:message="title:1005" 
class="ui-widget-header clickable om-icon big clear-slide"></div>
                        <div wicket:message="title:197" class="ui-widget-header 
clickable om-icon big save"></div>
-<!-- save-as filename -->
                        <div wicket:message="title:70" class="ui-widget-header 
clickable om-icon big undo"></div>
 
                        <div wicket:message="title:72" class="ui-widget-header 
clickable om-icon big pointer"></div>
@@ -118,5 +117,6 @@
                        <wicket:message key="1359"/>
                </div>
        </div>
+       <div wicket:id="filename"></div>
 </wicket:panel>
 </html>

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5394af08/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
index ad438ff..4f3762a 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/WbPanel.java
@@ -39,6 +39,8 @@ import org.apache.openmeetings.db.entity.file.FileItem;
 import org.apache.openmeetings.db.entity.room.Room.Right;
 import org.apache.openmeetings.db.entity.room.Room.RoomElement;
 import org.apache.openmeetings.util.OmFileHelper;
+import org.apache.openmeetings.web.app.Application;
+import org.apache.openmeetings.web.common.NameDialog;
 import org.apache.openmeetings.web.room.RoomPanel;
 import org.apache.openmeetings.web.room.RoomResourceReference;
 import org.apache.openmeetings.web.user.record.JpgRecordingResourceReference;
@@ -79,16 +81,18 @@ public class WbPanel extends Panel {
        private boolean readOnly = true;
        private final Long roomId;
        private final RoomPanel rp;
+       private long wb2save = -1;
        private enum Action {
                createWb
                , removeWb
-               , activeWb
+               , activateWb
                , setSlide
                , createObj
                , modifyObj
                , deleteObj
                , clearAll
                , clearSlide
+               , save
        }
        private final AbstractDefaultAjaxBehavior wbAction = new 
AbstractDefaultAjaxBehavior() {
                private static final long serialVersionUID = 1L;
@@ -106,7 +110,7 @@ public class WbPanel extends Panel {
                                JSONObject obj = sv.isEmpty() ? new 
JSONObject() : new JSONObject(sv.toString());
                                if (Action.createObj == a || Action.modifyObj 
== a) {
                                        if 
("pointer".equals(obj.getJSONObject("obj").getString("type"))) {
-                                               
sendWbOthers(String.format("WbArea.%s", a.name()), obj);
+                                               sendWbOthers(a, obj);
                                                return;
                                        }
                                }
@@ -117,7 +121,7 @@ public class WbPanel extends Panel {
                                                case createWb:
                                                {
                                                        Whiteboard wb = 
getBean(WhiteboardCache.class).add(roomId, 
rp.getClient().getUser().getLanguageId());
-                                                       sendWbAll("WbArea.add", 
getAddWbJson(wb.getId(), wb.getName()));
+                                                       
sendWbAll(Action.createWb, getAddWbJson(wb.getId(), wb.getName()));
                                                }
                                                        break;
                                                case removeWb:
@@ -125,16 +129,16 @@ public class WbPanel extends Panel {
                                                        long _id = 
obj.optLong("id", -1);
                                                        Long id = _id < 0 ? 
null : _id;
                                                        
getBean(WhiteboardCache.class).remove(roomId, id);
-                                                       
sendWbAll("WbArea.remove", new JSONObject().put("id", id));
+                                                       
sendWbAll(Action.removeWb, new JSONObject().put("id", id));
                                                }
                                                        break;
-                                               case activeWb:
+                                               case activateWb:
                                                {
                                                        long _id = 
obj.optLong("id", -1);
                                                        if (_id > -1) {
                                                                Whiteboards wbs 
= getBean(WhiteboardCache.class).get(roomId);
                                                                
wbs.setActiveWb(_id);
-                                                               
sendWbAll("WbArea.activate", new JSONObject().put("id", _id));
+                                                               
sendWbAll(Action.activateWb, new JSONObject().put("id", _id));
                                                        }
                                                }
                                                        break;
@@ -142,7 +146,7 @@ public class WbPanel extends Panel {
                                                {
                                                        Whiteboard wb = 
getBean(WhiteboardCache.class).get(roomId).get(obj.getLong("wbId"));
                                                        
wb.setSlide(obj.optInt("slide", 0));
-                                                       
sendWbOthers(String.format("WbArea.%s", a.name()), obj);
+                                                       
sendWbOthers(Action.setSlide, obj);
                                                }
                                                        break;
                                                case createObj:
@@ -150,7 +154,7 @@ public class WbPanel extends Panel {
                                                        Whiteboard wb = 
getBean(WhiteboardCache.class).get(roomId).get(obj.getLong("wbId"));
                                                        JSONObject o = 
obj.getJSONObject("obj");
                                                        
wb.put(o.getString("uid"), o);
-                                                       
sendWbOthers(String.format("WbArea.%s", a.name()), obj);
+                                                       
sendWbOthers(Action.createObj, obj);
                                                }
                                                        break;
                                                case modifyObj:
@@ -166,7 +170,7 @@ public class WbPanel extends Panel {
                                                                        
wb.put(_o.getString("uid"), _o);
                                                                }
                                                        }
-                                                       
sendWbOthers(String.format("WbArea.%s", a.name()), obj);
+                                                       
sendWbOthers(Action.modifyObj, obj);
                                                }
                                                case deleteObj:
                                                {
@@ -175,23 +179,27 @@ public class WbPanel extends Panel {
                                                        for (int i = 0; i < 
arr.length(); ++i) {
                                                                
wb.remove(arr.getString(i));
                                                        }
-                                                       
sendWbAll("WbArea.removeObj", obj);
+                                                       
sendWbAll(Action.deleteObj, obj);
                                                }
                                                        break;
                                                case clearAll:
                                                {
                                                        Whiteboard wb = 
getBean(WhiteboardCache.class).get(roomId).get(obj.getLong("wbId"));
                                                        wb.clear();
-                                                       
sendWbAll("WbArea.clearAll", obj);
+                                                       
sendWbAll(Action.clearAll, obj);
                                                }
                                                        break;
                                                case clearSlide:
                                                {
                                                        Whiteboard wb = 
getBean(WhiteboardCache.class).get(roomId).get(obj.getLong("wbId"));
                                                        
wb.entrySet().removeIf(e -> e.getValue().optInt("slide", -1) == 
obj.getInt("slide"));
-                                                       
sendWbAll("WbArea.clearSlide", obj);
+                                                       
sendWbAll(Action.clearSlide, obj);
                                                }
                                                        break;
+                                               case save:
+                                                       wb2save = 
obj.getLong("wbId");
+                                                       fileName.open(target);
+                                                       break;
                                        }
                                }
                        } catch (Exception e) {
@@ -199,6 +207,30 @@ public class WbPanel extends Panel {
                        }
                }
        };
+       private final NameDialog fileName = new NameDialog("filename") {
+               private static final long serialVersionUID = 1L;
+
+               @Override
+               protected void onSubmit(AjaxRequestTarget target) {
+                       Whiteboard wb = 
getBean(WhiteboardCache.class).get(roomId).get(wb2save);
+                       wb.toJson();
+               }
+
+               @Override
+               protected String getTitleStr() {
+                       return getString("199");
+               }
+
+               @Override
+               protected String getLabelStr() {
+                       return getString("200");
+               }
+
+               @Override
+               protected String getAddStr() {
+                       return Application.getString("203");
+               }
+       };
 
        public WbPanel(String id, RoomPanel rp) {
                super(id);
@@ -217,7 +249,7 @@ public class WbPanel extends Panel {
                                        item.add(append("class", cls), 
append("data-mode", cls)
                                                        , new 
AttributeAppender("data-image", item.getModelObject()).setSeparator(""));
                                }
-                       });
+                       }, fileName);
                        add(wbAction);
                }
        }
@@ -242,25 +274,25 @@ public class WbPanel extends Panel {
                        }
                        
sb.append("WbArea.load(").append(getObjWbJson(entry.getKey(), 
arr).toString()).append(");");
                }
-               sb.append("WbArea.activate({id: 
").append(wbs.getActiveWb()).append("});");
+               sb.append("WbArea.activateWb({id: 
").append(wbs.getActiveWb()).append("});");
                response.render(OnDomReadyHeaderItem.forScript(sb));
        }
 
-       private void sendWbAll(CharSequence meth, JSONObject obj) {
+       private void sendWbAll(Action meth, JSONObject obj) {
                sendWb(meth, obj, null);
        }
 
-       private void sendWbOthers(CharSequence meth, JSONObject obj) {
+       private void sendWbOthers(Action meth, JSONObject obj) {
                sendWb(meth, obj, c -> 
!rp.getClient().getUid().equals(c.getUid()));
        }
 
-       private void sendWb(CharSequence meth, JSONObject obj, 
Predicate<Client> check) {
+       private void sendWb(Action meth, JSONObject obj, Predicate<Client> 
check) {
                WebSocketHelper.sendRoom(
                                roomId
                                , new JSONObject()
                                                .put("type", "wb")
                                , check
-                               , (o, c) -> o.put("func", 
String.format("%s(%s);", meth, obj.toString())).toString()
+                               , (o, c) -> o.put("func", 
String.format("WbArea.%s(%s);", meth.name(), obj.toString())).toString()
                        );
        }
 
@@ -391,6 +423,9 @@ public class WbPanel extends Panel {
                                        ;
                        wb.put(wuid, file);
                        final String ruid = wbs.getUid();
+                       if (clean) {
+                               sendWbAll(Action.clearAll, new 
JSONObject().put("wbId", wb.getId()));
+                       }
                        WebSocketHelper.sendRoom(
                                        roomId
                                        , new JSONObject().put("type", "wb")

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5394af08/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/fabric.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/fabric.js 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/fabric.js
index f875a24..c9d71b0 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/fabric.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/fabric.js
@@ -1,8 +1,8 @@
 /* build: `node build.js modules=ALL exclude=json,gestures minifier=uglifyjs` 
*/
  /*! Fabric.js Copyright 2008-2015, Printio (Juriy Zaytsev, Maxim Chernyak) */
-/* version 1.7.8 */
+
 /* Licensed MIT https://github.com/kangax/fabric.js/blob/master/LICENSE */
-var fabric = fabric || { version: "1.7.8" };
+var fabric = fabric || { version: "1.7.9" };
 if (typeof exports !== 'undefined') {
   exports.fabric = fabric;
 }
@@ -3804,8 +3804,10 @@ if (typeof console !== 'undefined') {
    * @param {Function} callback Callback to call when parsing is finished;
    * It's being passed an array of elements (parsed from a document).
    * @param {Function} [reviver] Method for further parsing of SVG elements, 
called after each fabric object created.
+   * @param {Object} [parsingOptions] options for parsing document
+   * @param {String} [parsingOptions.crossOrigin] crossOrigin settings
    */
-  fabric.parseSVGDocument = function(doc, callback, reviver) {
+  fabric.parseSVGDocument = function(doc, callback, reviver, parsingOptions) {
     if (!doc) {
       return;
     }
@@ -3815,7 +3817,7 @@ if (typeof console !== 'undefined') {
     var svgUid =  fabric.Object.__uid++,
         options = applyViewboxTransform(doc),
         descendants = fabric.util.toArray(doc.getElementsByTagName('*'));
-
+    options.crossOrigin = parsingOptions && parsingOptions.crossOrigin;
     options.svgUid = svgUid;
 
     if (descendants.length === 0 && fabric.isLikelyNode) {
@@ -3847,7 +3849,7 @@ if (typeof console !== 'undefined') {
       if (callback) {
         callback(instances, options);
       }
-    }, clone(options), reviver);
+    }, clone(options), reviver, parsingOptions);
   };
 
   var reFontDeclaration = new RegExp(
@@ -3999,8 +4001,8 @@ if (typeof console !== 'undefined') {
      * @param {Object} [options] Options object
      * @param {Function} [reviver] Method for further parsing of SVG elements, 
called after each fabric object created.
      */
-    parseElements: function(elements, callback, options, reviver) {
-      new fabric.ElementsParser(elements, callback, options, reviver).parse();
+    parseElements: function(elements, callback, options, reviver, 
parsingOptions) {
+      new fabric.ElementsParser(elements, callback, options, reviver, 
parsingOptions).parse();
     },
 
     /**
@@ -4126,8 +4128,10 @@ if (typeof console !== 'undefined') {
      * @param {String} url
      * @param {Function} callback
      * @param {Function} [reviver] Method for further parsing of SVG elements, 
called after each fabric object created.
+     * @param {Object} [options] Object containing options for parsing
+     * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting 
to use for external resources
      */
-    loadSVGFromURL: function(url, callback, reviver) {
+    loadSVGFromURL: function(url, callback, reviver, options) {
 
       url = url.replace(/^\n\s*/, '').trim();
       new fabric.util.request(url, {
@@ -4148,9 +4152,9 @@ if (typeof console !== 'undefined') {
           callback && callback(null);
         }
 
-        fabric.parseSVGDocument(xml.documentElement, function (results, 
options) {
-          callback && callback(results, options);
-        }, reviver);
+        fabric.parseSVGDocument(xml.documentElement, function (results, 
_options) {
+          callback && callback(results, _options);
+        }, reviver, options);
       }
     },
 
@@ -4160,8 +4164,10 @@ if (typeof console !== 'undefined') {
      * @param {String} string
      * @param {Function} callback
      * @param {Function} [reviver] Method for further parsing of SVG elements, 
called after each fabric object created.
+     * @param {Object} [options] Object containing options for parsing
+     * @param {String} [options.crossOrigin] crossOrigin crossOrigin setting 
to use for external resources
      */
-    loadSVGFromString: function(string, callback, reviver) {
+    loadSVGFromString: function(string, callback, reviver, options) {
       string = string.trim();
       var doc;
       if (typeof DOMParser !== 'undefined') {
@@ -4177,21 +4183,22 @@ if (typeof console !== 'undefined') {
         doc.loadXML(string.replace(/<!DOCTYPE[\s\S]*?(\[[\s\S]*\])*?>/i, ''));
       }
 
-      fabric.parseSVGDocument(doc.documentElement, function (results, options) 
{
-        callback(results, options);
-      }, reviver);
+      fabric.parseSVGDocument(doc.documentElement, function (results, 
_options) {
+        callback(results, _options);
+      }, reviver, options);
     }
   });
 
 })(typeof exports !== 'undefined' ? exports : this);
 
 
-fabric.ElementsParser = function(elements, callback, options, reviver) {
+fabric.ElementsParser = function(elements, callback, options, reviver, 
parsingOptions) {
   this.elements = elements;
   this.callback = callback;
   this.options = options;
   this.reviver = reviver;
   this.svgUid = (options && options.svgUid) || 0;
+  this.parsingOptions = parsingOptions;
 };
 
 fabric.ElementsParser.prototype.parse = function() {
@@ -19223,7 +19230,7 @@ fabric.util.object.extend(fabric.Object.prototype, /** 
@lends fabric.Object.prot
    * @see {@link http://www.w3.org/TR/SVG/struct.html#ImageElement}
    */
   fabric.Image.ATTRIBUTE_NAMES =
-    fabric.SHARED_ATTRIBUTES.concat('x y width height preserveAspectRatio 
xlink:href'.split(' '));
+    fabric.SHARED_ATTRIBUTES.concat('x y width height preserveAspectRatio 
xlink:href crossOrigin'.split(' '));
 
   /**
    * Returns {@link fabric.Image} instance from an SVG element
@@ -24210,7 +24217,7 @@ fabric.Image.filters.BaseFilter.fromObject = 
function(object, callback) {
       }
 
       this.isEditing = true;
-
+      this.selected = true;
       this.initHiddenTextarea(e);
       this.hiddenTextarea.focus();
       this._updateTextarea();
@@ -24595,7 +24602,7 @@ fabric.Image.filters.BaseFilter.fromObject = 
function(object, callback) {
           }
         }
       }
-      var newStyle = style || currentLineStyles[charIndex - 1];
+      var newStyle = style || clone(currentLineStyles[charIndex - 1]);
       newStyle && (this.styles[lineIndex][charIndex] = newStyle);
       this._forceClearCache = true;
     },
@@ -24631,8 +24638,14 @@ fabric.Image.filters.BaseFilter.fromObject = 
function(object, callback) {
      * @param {Number} offset Can be -1 or +1
      */
     shiftLineStyles: function(lineIndex, offset) {
-      // shift all line styles by 1 upward
+      // shift all line styles by 1 upward or downward
       var clonedStyles = clone(this.styles);
+      for (var line in clonedStyles) {
+        var numericLine = parseInt(line, 10);
+        if (numericLine <= lineIndex) {
+          delete clonedStyles[numericLine];
+        }
+      }
       for (var line in this.styles) {
         var numericLine = parseInt(line, 10);
         if (numericLine > lineIndex) {
@@ -24847,7 +24860,6 @@ fabric.util.object.extend(fabric.IText.prototype, /** 
@lends fabric.IText.protot
         return;
       }
       var pointer = this.canvas.getPointer(options.e);
-
       this.__mousedownX = pointer.x;
       this.__mousedownY = pointer.y;
       this.__isMousedown = true;
@@ -25004,8 +25016,8 @@ fabric.util.object.extend(fabric.IText.prototype, /** 
@lends fabric.IText.protot
     this.hiddenTextarea = fabric.document.createElement('textarea');
     this.hiddenTextarea.setAttribute('autocapitalize', 'off');
     var style = this._calcTextareaPosition();
-    this.hiddenTextarea.style.cssText = 'position: absolute; top: ' + 
style.top + '; left: ' + style.left + ';'
-                                        + ' opacity: 0; width: 0px; height: 
0px; z-index: -999;';
+    this.hiddenTextarea.style.cssText = 'white-space: nowrap; position: 
absolute; top: ' + style.top +
+      '; left: ' + style.left + '; opacity: 0; width: 1px; height: 1px; 
z-index: -999;';
     fabric.document.body.appendChild(this.hiddenTextarea);
 
     fabric.util.addListener(this.hiddenTextarea, 'keydown', 
this.onKeyDown.bind(this));

Reply via email to