import { LitElement, html, PropertyValueMap } from "lit"; import { customElement, property } from "lit/decorators.js"; import init from "../../es6/shared"; import { SyncMetaWidget } from "../../widget"; // needed to prevent ts errors when bundling with rollup import { getWidgetTagName } from "../../es6/config"; import "https://unpkg.com/jquery@3.6.0/dist/jquery.js"; import "https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js"; import IWCW from "../../es6/lib/IWCWrapper"; import { getInstance } from "../../es6/lib/yjs-sync"; import Util from "../../es6/Util"; import NodePreview from "../../es6/heatmap_widget/NodePreview"; import { NodeAddOperation } from "../../es6/operations/ot/EntityOperation"; import NodeMoveOperation from "../../es6/operations/ot/NodeMoveOperation"; import NodeResizeOperation from "../../es6/operations/ot/NodeResizeOperation"; import { NodeDeleteOperation } from "../../es6/operations/ot/EntityOperation"; import CanvasViewChangeOperation from "../../es6/operations/non_ot/CanvasViewChangeOperation"; import { WaitForCanvas } from "../../es6/WaitForCanvas"; import { CONFIG } from "../../es6/config"; // widget body used by all syncmeta widgets @customElement(getWidgetTagName(CONFIG.WIDGET.NAME.HEATMAP)) export class HeatMapWidget extends SyncMetaWidget( LitElement, CONFIG.WIDGET.NAME.HEATMAP ) { @property({ type: String }) yjsHost = "localhost"; @property({ type: Number }) yjsPort = 1234; @property({ type: String }) yjsProtocol = "ws"; @property({ type: String }) yjsSpaceTitle = window.spaceTitle; protected async firstUpdated( _changedProperties: PropertyValueMap | Map ) { super.firstUpdated(_changedProperties); try { const yjsInstance = getInstance({ host: this.yjsHost, port: this.yjsPort, protocol: this.yjsProtocol, spaceTitle: this.yjsSpaceTitle, }); const y = await yjsInstance.connect(); console.info( "HEATMAP: Yjs successfully initialized in " + this.yjsSpaceTitle + " with y-user-id: " + y.clientID ); var model = y.getMap("data").get("model"); var iwc = IWCW.getInstance(CONFIG.WIDGET.NAME.HEATMAP, y); const user = await WaitForCanvas(CONFIG.WIDGET.NAME.HEATMAP, y, 7); iwc.setSpace(user); var $heatmap = $("#heatmap"); var scaleFactor = $heatmap.width() / 9000; var $window = $( "
" ); $window.hide(); $heatmap.append($window); //$('#viewpoint').draggable({ cursor: "move", containment:'#heatmap'}); var previewNodes = {}; const userMap = y.getMap("users"); var localUserId = userMap.get(y.clientID); /*if(guidancemodel.isGuidanceEditor()){ model = guidancemodel.guidancemodel; }*/ var minLeft = 4500; var minTop = 4500; var maxBottom = 5000; var maxRight = 5000; var addNodePreview = function (id, x, y, width, height, color) { var nodePreview = new NodePreview( id, x, y, width, height, scaleFactor, color ); previewNodes[id] = nodePreview; $heatmap.append(nodePreview.get$node()); return nodePreview; }; var operationCallback = function (operation) { var id, node, senderJabberId; if (operation instanceof NodeAddOperation) { senderJabberId = operation.getJabberId(); var color = null; //if(senderJabberId != localUserId) //color = iwc.getUserColor(senderJabberId); const userList = y.getMap("userList"); color = Util.getColor(userList.get(senderJabberId).globalId); node = addNodePreview( operation.getEntityId(), operation.getLeft(), operation.getTop(), operation.getWidth(), operation.getHeight(), color ); updateBoundingBox(node); updateZoom(); } else if (operation instanceof NodeMoveOperation) { id = operation.getEntityId(); if (previewNodes.hasOwnProperty(id)) { node = previewNodes[id]; node.moveX(operation.getOffsetX()); node.moveY(operation.getOffsetY()); senderJabberId = operation.getJabberId(); updateColor(node, senderJabberId); updateBoundingBox(node); updateZoom(); } } else if (operation instanceof NodeResizeOperation) { id = operation.getEntityId(); if (previewNodes.hasOwnProperty(id)) { node = previewNodes[id]; node.changeWidth(operation.getOffsetX()); node.changeHeight(operation.getOffsetY()); senderJabberId = operation.getJabberId(); updateColor(node, senderJabberId); updateBoundingBox(node); updateZoom(); } } else if (operation instanceof NodeDeleteOperation) { id = operation.getEntityId(); if (previewNodes.hasOwnProperty(id)) { node = previewNodes[id]; node.remove(); delete previewNodes[id]; } } else if (operation instanceof CanvasViewChangeOperation) { updateWindow(operation); } }; var registerCallbacks = function () { iwc.registerOnDataReceivedCallback(operationCallback); }; var updateWindow = function (viewChangeOperation) { var top = viewChangeOperation.getTop(); var left = viewChangeOperation.getLeft(); var width = viewChangeOperation.getWidth(); var height = viewChangeOperation.getHeight(); var zoom = viewChangeOperation.getZoom(); $window.css({ top: (-top * scaleFactor) / zoom, left: (-left * scaleFactor) / zoom, width: (width * scaleFactor) / zoom, height: (height * scaleFactor) / zoom, }); $window.show(); }; var updateColor = function (node, userId) { if (userId == localUserId) { node.resetColor(); } else { //node.setColor(iwc.getUserColor(userId)); const userList = y.getMap("userList"); node.setColor(Util.getColor(userList.get(userId).globalId)); } }; var updateZoom = function () { var width = maxRight - minLeft; var height = maxBottom - minTop; var bigger = width > height ? width : height; var centerX = minLeft + width / 2; var centerY = minTop + height / 2; var originX = (centerX / 9000) * 100; var originY = (centerY / 9000) * 100; var translateX = -(centerX - 4500) * scaleFactor; var translateY = -(centerY - 4500) * scaleFactor; var zoom = (9000 / bigger) * 0.9; $heatmap.css({ "transform-origin": originX + "%" + " " + originY + "%", transform: "translate(" + translateX + "px, " + translateY + "px) scale(" + zoom + ")", }); }; var updateBoundingBox = function (node) { if (node.originalX < minLeft) minLeft = node.originalX; if (node.originalY < minTop) minTop = node.originalY; if (node.originalX + node.originalWidth > maxRight) maxRight = node.originalX + node.originalWidth; if (node.originalY + node.originalHeight > maxBottom) maxBottom = node.originalY + node.originalHeight; }; registerCallbacks(); for (var nodeId in model.nodes) { if (model.nodes.hasOwnProperty(nodeId)) { var node = model.nodes[nodeId]; var nodePreview = addNodePreview( nodeId, node.left, node.top, node.width, node.height, scaleFactor ); updateColor(nodePreview, localUserId); updateBoundingBox(nodePreview); } } updateZoom(); } catch (error) { console.error(error); } } render() { return html`
`; } connectedCallback() { super.connectedCallback(); init(); } disconnectedCallback() { super.disconnectedCallback(); } }