[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));
