Repository: openmeetings
Updated Branches:
  refs/heads/master 4225fdb5b -> 5e2dffb96


[OPENMEETINGS-1720] import converts WB files


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

Branch: refs/heads/master
Commit: 5e2dffb96a96c288efdb8888a04d689f78ebfb13
Parents: 4225fdb
Author: Maxim Solodovnik <[email protected]>
Authored: Fri Oct 13 18:21:32 2017 +0700
Committer: Maxim Solodovnik <[email protected]>
Committed: Fri Oct 13 18:21:32 2017 +0700

----------------------------------------------------------------------
 .../openmeetings/db/dto/room/Whiteboard.java    |  37 ++-
 .../db/entity/file/BaseFileItem.java            |   6 +
 .../openmeetings/backup/BackupImport.java       |  31 +-
 .../backup/converter/WbConverter.java           | 295 +++++++++++++++++++
 .../openmeetings/web/room/wb/WbPanel.java       |  10 +-
 .../openmeetings/web/room/wb/tool-clipart.js    |   5 +-
 .../openmeetings/web/room/wb/tool-text.js       |   5 +-
 .../apache/openmeetings/web/room/wb/wb-board.js |   2 +-
 8 files changed, 365 insertions(+), 26 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5e2dffb9/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 c351e9a..6b375c2 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
@@ -18,7 +18,13 @@
  */
 package org.apache.openmeetings.db.dto.room;
 
+import static 
org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey;
+
+import java.io.BufferedWriter;
+import java.io.IOException;
 import java.io.Serializable;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.Collections;
 import java.util.Date;
 import java.util.LinkedHashMap;
@@ -28,12 +34,15 @@ import java.util.Map;
 import java.util.Map.Entry;
 
 import org.apache.openmeetings.util.NullStringer;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
 
 import com.github.openjson.JSONArray;
 import com.github.openjson.JSONObject;
 
 public class Whiteboard implements Serializable {
        private static final long serialVersionUID = 1L;
+       private static final Logger log = 
Red5LoggerFactory.getLogger(Whiteboard.class, getWebAppRootKey());
        public enum ZoomMode {
                fullFit
                , pageWidth
@@ -177,15 +186,29 @@ public class Whiteboard implements Serializable {
                //deep-copy
                JSONObject json = new JSONObject(new 
JSONObject(this).toString(new NullStringer()));
                json.remove("id"); //filtering
-               if (!json.has(ITEMS_KEY)) {
-                       json.put(ITEMS_KEY, new JSONObject());
-               }
-               JSONObject items = json.getJSONObject(ITEMS_KEY);
-               for (String uid : items.keySet()) {
-                       JSONObject o = items.getJSONObject(uid);
+               json.remove("empty"); //filtering
+               JSONObject items = new JSONObject();
+               for (Entry<String, String> e : roomItems.entrySet()) {
+                       JSONObject o = new JSONObject(e.getValue());
+                       //filtering
+                       o.remove("src");
+                       if ("Clipart".equals(o.opt("omType"))) {
+                               o.put("src", o.get("_src"));
+                       }
                        o.remove("_src");
-                       o.remove("src"); //filtering
+                       items.put(e.getKey(), o);
                }
+               json.put(ITEMS_KEY, items);
                return json;
        }
+
+       public String save(Path path) {
+               try (BufferedWriter writer = Files.newBufferedWriter(path)) {
+                       writer.write(toJson().toString(new NullStringer(2)));
+               } catch (IOException e) {
+                       log.error("Unexpected error while saving WB", e);
+                       return e.getMessage();
+               }
+               return null;
+       }
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5e2dffb9/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
index 20b4a80..2871a67 100644
--- 
a/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
+++ 
b/openmeetings-db/src/main/java/org/apache/openmeetings/db/entity/file/BaseFileItem.java
@@ -377,4 +377,10 @@ public abstract class BaseFileItem extends 
HistoricalEntity {
                        return n.startsWith(getHash()) && 
!exclusions.contains(ext);
                }
        }
+
+       @Override
+       public String toString() {
+               return "FileItem [id=" + id + ", name=" + name + ", room=" + 
roomId + ", type=" + type.name() + "]";
+       }
+
 }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5e2dffb9/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
 
b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
index 53b239e..4efb183 100644
--- 
a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
+++ 
b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/BackupImport.java
@@ -138,6 +138,7 @@ import 
org.apache.openmeetings.backup.converter.RoomConverter;
 import org.apache.openmeetings.backup.converter.RoomTypeConverter;
 import org.apache.openmeetings.backup.converter.SalutationConverter;
 import org.apache.openmeetings.backup.converter.UserConverter;
+import org.apache.openmeetings.backup.converter.WbConverter;
 import org.apache.openmeetings.core.converter.DocumentConverter;
 import org.apache.openmeetings.db.dao.basic.ChatDao;
 import org.apache.openmeetings.db.dao.basic.ConfigurationDao;
@@ -155,6 +156,7 @@ import 
org.apache.openmeetings.db.dao.user.PrivateMessageDao;
 import org.apache.openmeetings.db.dao.user.PrivateMessageFolderDao;
 import org.apache.openmeetings.db.dao.user.UserContactDao;
 import org.apache.openmeetings.db.dao.user.UserDao;
+import org.apache.openmeetings.db.dto.room.Whiteboard;
 import org.apache.openmeetings.db.entity.basic.ChatMessage;
 import org.apache.openmeetings.db.entity.basic.Configuration;
 import org.apache.openmeetings.db.entity.calendar.Appointment;
@@ -403,7 +405,7 @@ public class BackupImport {
                importPrivateMsgFolders(f, simpleSerializer);
                importContacts(f);
                importPrivateMsgs(f);
-               importFiles(f, ver.compareTo(BackupVersion.get("4.0.0")) < 0);
+               List<FileItem> files = importFiles(f, 
ver.compareTo(BackupVersion.get("4.0.0")) < 0);
                importPolls(f);
                importRoomFiles(f);
 
@@ -414,9 +416,17 @@ public class BackupImport {
                importFolders(f);
 
                if (ver.compareTo(BackupVersion.get("4.0.0")) < 0) {
-                       for (BaseFileItem bfi : fileItemDao.get()) {
+                       for (BaseFileItem bfi : files) {
                                if (BaseFileItem.Type.Presentation == 
bfi.getType()) {
-                                       convertOldPresentation(bfi);
+                                       convertOldPresentation((FileItem)bfi);
+                               }
+                               if (BaseFileItem.Type.WmlFile == bfi.getType()) 
{
+                                       try {
+                                               Whiteboard wb = 
WbConverter.convert((FileItem)bfi);
+                                               wb.save(bfi.getFile().toPath());
+                                       } catch (Exception e) {
+                                               log.error("Unexpected error 
while converting WB", e);
+                                       }
                                }
                        }
                }
@@ -847,8 +857,9 @@ public class BackupImport {
        /*
         * ##################### Import File-Explorer Items
         */
-       private void importFiles(File f, boolean old) throws Exception {
+       private List<FileItem> importFiles(File f, boolean old) throws 
Exception {
                log.info("Private message import complete, starting file 
explorer item import");
+               List<FileItem> result = new ArrayList<>();
                List<FileItem> list = readFileItemList(f, 
"fileExplorerItems.xml", "fileExplorerItems");
                for (FileItem file : list) {
                        Long fId = file.getId();
@@ -866,8 +877,10 @@ public class BackupImport {
                                file.setHash(UUID.randomUUID().toString());
                        }
                        file = fileItemDao.update(file);
+                       result.add(file);
                        fileItemMap.put(fId, file.getId());
                }
+               return result;
        }
 
        /*
@@ -1012,7 +1025,7 @@ public class BackupImport {
                                                                
f.setType(BaseFileItem.Type.WmlFile);
                                                                f.setHash(val);
                                                        }
-                                                       if 
("isChart".equals(name) && "true".equals(val)) {
+                                                       if (f.getType() == null 
&& "isChart".equals(name) && "true".equals(val)) {
                                                                
f.setType(BaseFileItem.Type.PollChart);
                                                        }
                                                        if 
("isImage".equals(name) && "true".equals(val)) {
@@ -1501,12 +1514,12 @@ public class BackupImport {
                return countries.getProperty(String.format("country.%s", 
countryId));
        }
 
-       private void convertOldPresentation(BaseFileItem bfi) {
-               File f = bfi.getOriginal();
+       private void convertOldPresentation(FileItem fi) {
+               File f = fi.getOriginal();
                if (f != null && f.exists()) {
                        try {
-                               StoredFile sf = new StoredFile(bfi.getHash(), 
getFileExt(f.getName()), f);
-                               docConverter.convertPDF((FileItem)bfi, sf);
+                               StoredFile sf = new StoredFile(fi.getHash(), 
getFileExt(f.getName()), f);
+                               docConverter.convertPDF(fi, sf);
                        } catch (Exception e) {
                                log.error("Unexpected exception while 
converting OLD format presentations", e);
                        }

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5e2dffb9/openmeetings-install/src/main/java/org/apache/openmeetings/backup/converter/WbConverter.java
----------------------------------------------------------------------
diff --git 
a/openmeetings-install/src/main/java/org/apache/openmeetings/backup/converter/WbConverter.java
 
b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/converter/WbConverter.java
new file mode 100644
index 0000000..67a4f48
--- /dev/null
+++ 
b/openmeetings-install/src/main/java/org/apache/openmeetings/backup/converter/WbConverter.java
@@ -0,0 +1,295 @@
+/*
+ * 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.backup.converter;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+import static org.apache.commons.lang3.math.NumberUtils.toLong;
+import static org.apache.openmeetings.util.OmFileHelper.EXTENSION_WML;
+import static 
org.apache.openmeetings.util.OpenmeetingsVariables.getWebAppRootKey;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+
+import org.apache.openmeetings.db.dto.room.Whiteboard;
+import org.apache.openmeetings.db.entity.file.BaseFileItem;
+import org.apache.openmeetings.db.entity.file.FileItem;
+import org.apache.openmeetings.util.OmFileHelper;
+import org.red5.logging.Red5LoggerFactory;
+import org.slf4j.Logger;
+
+import com.github.openjson.JSONArray;
+import com.github.openjson.JSONObject;
+import com.thoughtworks.xstream.XStream;
+import com.thoughtworks.xstream.io.xml.XppDriver;
+
+public class WbConverter {
+       private static final Logger log = 
Red5LoggerFactory.getLogger(WbConverter.class, getWebAppRootKey());
+
+       private static String getColor(int val) {
+               return String.format("#%06X", (0xFFFFFF & val));
+       }
+
+       private static void add(Whiteboard wb, JSONObject o) {
+               String uid = UUID.randomUUID().toString();
+               wb.put(uid, o.put("uid", uid));
+       }
+
+       private static JSONObject init(Whiteboard wb, List<?> props) {
+               return init(wb, props, true);
+       }
+
+       private static JSONObject init(Whiteboard wb, List<?> props, boolean 
addDim) {
+               double left = ((Number)props.get(props.size() - 
5)).doubleValue();
+               double top = ((Number)props.get(props.size() - 
4)).doubleValue();
+               double w = ((Number)props.get(props.size() - 3)).doubleValue();
+               double h = ((Number)props.get(props.size() - 2)).doubleValue();
+               JSONObject o = new JSONObject().put("slide", 0);
+               if (addDim) {
+                       o.put("left", left)
+                               .put("top", top)
+                               .put("width", w)
+                               .put("height", h);
+                       wb.setWidth((int)Math.max(wb.getWidth(), w + left));
+                       wb.setHeight((int)Math.max(wb.getHeight(), h + top));
+               }
+               return o;
+       }
+
+       private static JSONObject setColor(JSONObject o, String stroke, String 
fill) {
+               return o.put("stroke", stroke).put("fill", fill);
+       }
+
+       private static void processText(Whiteboard wb, List<?> props) {
+               if (props.size() < 12) {
+                       return;
+               }
+               String color = getColor((int)props.get(2));
+               String style = (String)props.get(4);
+               JSONObject o = setColor(init(wb, props), color, color)
+                               .put("type", "i-text")
+                               .put("text", props.get(1))
+                               .put("fontSize", props.get(3));
+               if (style.indexOf("bold") > -1) {
+                       o.put("fontWeight", "bold");
+               }
+               if (style.indexOf("italic") > -1) {
+                       o.put("fontStyle", "inalic");
+               }
+               add(wb, o);
+       }
+
+       private static void processPath(Whiteboard wb, List<?> props) {
+               if (props.size() < 13) {
+                       return;
+               }
+               String color = getColor((int)props.get(4));
+               JSONObject o = setColor(init(wb, props), color, null)
+                               .put("type", "path")
+                               .put("strokeWidth", props.get(3));
+               @SuppressWarnings("unchecked")
+               List<List<?>> points = (List<List<?>>)props.get(1);
+               JSONArray path = new JSONArray();
+               for (List<?> point : points) {
+                       if (path.length() == 0) {
+                               path.put(new JSONArray(Arrays.asList("M", 
(int)point.get(1), (int)point.get(2))));
+                       } else if (path.length() == points.size() - 1) {
+                               path.put(new JSONArray(Arrays.asList("L", 
(int)point.get(3), (int)point.get(4))));
+                       } else {
+                               path.put(new JSONArray(Arrays.asList("Q"
+                                               , (int)point.get(1), 
(int)point.get(2)
+                                               , (int)point.get(3), 
(int)point.get(4))));
+                       }
+               }
+               add(wb, o.put("path", path).put("opacity", props.get(5)));
+       }
+
+       private static void processLine(Whiteboard wb, List<?> props) {
+               if (props.size() < 16) {
+                       return;
+               }
+               String color = getColor((int)props.get(1));
+               add(wb, setColor(init(wb, props), color, color)
+                               .put("type", "line")
+                               .put("strokeWidth", props.get(2))
+                               .put("opacity", props.get(3))
+                               .put("x1", props.get(4))
+                               .put("y1", props.get(5))
+                               .put("x2", props.get(6))
+                               .put("y2", props.get(7)));
+       }
+
+       private static JSONObject processRect(Whiteboard wb, List<?> props) {
+               if (props.size() < 15) {
+                       return null;
+               }
+               return setColor(init(wb, props)
+                                       , 1 == (int)props.get(4) ? 
getColor((int)props.get(1)) : null
+                                       , 1 == (int)props.get(5) ? 
getColor((int)props.get(3)) : null)
+                               .put("type", "rect")
+                               .put("strokeWidth", props.get(2))
+                               .put("opacity", props.get(6));
+       }
+
+       private static void processEllipse(Whiteboard wb, List<?> props) {
+               JSONObject o = processRect(wb, props);
+               if (o != null) {
+                       o.put("type", "ellipse")
+                               .put("rx", o.getDouble("width") / 2)
+                               .put("ry", o.getDouble("height") / 2);
+                       add(wb, o);
+               }
+       }
+
+       private static void processClipart(Whiteboard wb, List<?> props) {
+               if (props.size() < 19) {
+                       return;
+               }
+               String src = (String)props.get(2);
+               int idx = src.indexOf("cliparts");
+               if (idx > -1) {
+                       src = String.format("./public/%s", src.substring(idx));
+               }
+               add(wb, init(wb, props)
+                       .put("type", "image")
+                       .put("omType", "Clipart")
+                       .put("_src", src)
+                       .put("angle", props.get(3)));
+       }
+
+       private static long getFileId(String src) {
+               int idx1 = src.lastIndexOf('/'), idx2 = src.indexOf('?');
+               if (idx1 < 0 || idx2 < 0) {
+                       return -1;
+               }
+               return toLong(src.substring(idx1 + 1, idx2), -1);
+       }
+
+       // will support only import from 3.2.x+
+       private static void processImage(Whiteboard wb, List<?> props) {
+               if (props.size() < 17) {
+                       return;
+               }
+               long fileId = getFileId((String)props.get(2));
+               if (fileId < 0) {
+                       return;
+               }
+               add(wb, init(wb, props)
+                       .put("type", "image")
+                       .put("fileType", BaseFileItem.Type.Image.name())
+                       .put("fileId", fileId));
+       }
+
+       private static void processDoc(Whiteboard wb, List<?> props) {
+               if (props.size() < 27) {
+                       return;
+               }
+               long fileId = getFileId((String)props.get(2));
+               if (fileId < 0) {
+                       return;
+               }
+               add(wb, init(wb, props, false)
+                       .put("type", "image")
+                       .put("fileType", BaseFileItem.Type.Presentation.name())
+                       .put("fileId", fileId));
+       }
+
+       private static void processVid(Whiteboard wb, List<?> props) {
+               if (props.size() < 14) {
+                       return;
+               }
+               add(wb, init(wb, props)
+                       .put("type", "image")
+                       .put("fileType", BaseFileItem.Type.Video.name())
+                       .put("fileId", props.get(1)));
+       }
+
+       public static Whiteboard convert(FileItem fi) {
+               Whiteboard wb = new Whiteboard();
+               wb.setWidth(0);
+               wb.setHeight(0);
+               Set<String> uids = new HashSet<>();
+               List<?> wml = loadWmlFile(fi.getHash());
+               for (Object wo : wml) {
+                       List<?> props = (List<?>)wo;
+                       if (props.size() > 0) {
+                               String uid = (String)props.get(props.size() - 
1);
+                               if (uids.contains(uid)) {
+                                       continue;
+                               }
+                               uids.add(uid);
+                               switch ((String)props.get(0)) {
+                                       case "letter":
+                                               processText(wb, props);
+                                               break;
+                                       case "paint":
+                                               processPath(wb, props);
+                                               break;
+                                       case "line":
+                                       case "uline":
+                                               processLine(wb, props);
+                                               break;
+                                       case "rectangle":
+                                       case "drawarrow": // will replace with 
rectangle
+                                               add(wb, processRect(wb, props));
+                                               break;
+                                       case "ellipse":
+                                               processEllipse(wb, props);
+                                               break;
+                                       case "clipart":
+                                               processClipart(wb, props);
+                                               break;
+                                       case "image":
+                                               processImage(wb, props);
+                                               break;
+                                       case "swf":
+                                               processDoc(wb, props);
+                                               break;
+                                       case "flv":
+                                               processVid(wb, props);
+                                               break;
+                               }
+                       }
+               }
+               return wb;
+       }
+
+       public static List<?> loadWmlFile(String hash) {
+               String name = OmFileHelper.getName(hash, EXTENSION_WML);
+               File file = new File(OmFileHelper.getUploadWmlDir(), name);
+               log.debug("filepathComplete: {}", file);
+
+               XStream xStream = new XStream(new XppDriver());
+               xStream.setMode(XStream.NO_REFERENCES);
+               try (InputStream is = new FileInputStream(file); BufferedReader 
reader = new BufferedReader(new InputStreamReader(is, UTF_8))) {
+                       return (List<?>) xStream.fromXML(reader);
+               } catch (Exception err) {
+                       log.error("loadWmlFile", err);
+               }
+               return new ArrayList<>();
+       }
+}

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5e2dffb9/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 cc9f020..f2f7d80 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
@@ -28,7 +28,6 @@ import static org.apache.wicket.AttributeModifier.append;
 
 import java.awt.image.BufferedImage;
 import java.io.BufferedReader;
-import java.io.BufferedWriter;
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
@@ -50,6 +49,7 @@ import java.util.function.Function;
 import javax.imageio.ImageIO;
 
 import org.apache.commons.codec.binary.Base64;
+import org.apache.directory.api.util.Strings;
 import org.apache.openmeetings.core.data.whiteboard.WhiteboardCache;
 import org.apache.openmeetings.db.dao.file.FileItemDao;
 import org.apache.openmeetings.db.dao.record.RecordingDao;
@@ -116,12 +116,10 @@ public class WbPanel extends AbstractWbPanel {
                        f.setHash(UUID.randomUUID().toString());
                        f.setName(getModelObject());
                        f = getBean(FileItemDao.class).update(f);
-                       try (BufferedWriter writer = 
Files.newBufferedWriter(f.getFile().toPath())) {
-                               writer.write(wb.toJson().toString(new 
NullStringer(2)));
-                       } catch (IOException e) {
-                               error("Unexpected error while saving WB: " + 
e.getMessage());
+                       String res = wb.save(f.getFile().toPath());
+                       if (!Strings.isEmpty(res)) {
+                               error("Unexpected error while saving WB: " + 
res);
                                target.add(feedback);
-                               log.error("Unexpected error while saving WB", 
e);
                        }
                }
 

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5e2dffb9/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-clipart.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-clipart.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-clipart.js
index c5d5533..dd3d189 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-clipart.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-clipart.js
@@ -3,7 +3,8 @@ var Clipart = function(wb, btn) {
        const art = Shape(wb);
        art.add2Canvas = function(canvas) {}
        art.createShape = function(canvas) {
-               fabric.Image.fromURL(btn.data('image'), function(img) {
+               const imgSrc = btn.data('image');
+               fabric.Image.fromURL(imgSrc, function(img) {
                        art.orig.width = img.width;
                        art.orig.height = img.height;
                        art.obj = img.set({
@@ -11,6 +12,8 @@ var Clipart = function(wb, btn) {
                                , top: art.orig.y
                                , width: 0
                                , height: 0
+                               , omType: 'Clipart'
+                               , _src: imgSrc
                        });
                        canvas.add(art.obj);
                });

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5e2dffb9/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-text.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-text.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-text.js
index a81126b..703ecc3 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-text.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/tool-text.js
@@ -3,7 +3,7 @@ var Text = function(wb, s) {
        const text = ShapeBase();
        text.obj = null;
        text.fill.color = '#000000';
-       text.stroke.width = 1;
+       text.stroke.width = 12; //fontSize
        text.stroke.color = '#000000';
        text.style = {bold: false, italic: false};
        //TODO font size, background color
@@ -21,7 +21,8 @@ var Text = function(wb, s) {
                                , padding: 7
                                , fill: text.fill.enabled ? text.fill.color : 
'rgba(0,0,0,0)'
                                , stroke: text.stroke.enabled ? 
text.stroke.color : 'rgba(0,0,0,0)'
-                               , strokeWidth: text.stroke.width
+                               //, strokeWidth: text.stroke.width
+                               , fontSize: text.stroke.width
                                , opacity: text.opacity
                        });
                        if (text.style.bold) {

http://git-wip-us.apache.org/repos/asf/openmeetings/blob/5e2dffb9/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-board.js
----------------------------------------------------------------------
diff --git 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-board.js
 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-board.js
index 1f3b0c1..c827f11 100644
--- 
a/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-board.js
+++ 
b/openmeetings-web/src/main/java/org/apache/openmeetings/web/room/wb/wb-board.js
@@ -2,7 +2,7 @@
 var Wb = function() {
        const ACTIVE = 'active', BUMPER = 100
                , wb = {id: -1, name: ''}, canvases = []
-               , extraProps = ['uid', 'fileId', 'fileType', 'count', 'slide'];
+               , extraProps = ['uid', 'fileId', 'fileType', 'count', 'slide', 
'omType', '_src'];
        let a, t, z, s, mode, slide = 0, width = 0, height = 0
                        , zoom = 1., zoomMode = 'fullFit', role = null;
 

Reply via email to