(function () { 'use strict'; angular .module('app', ['angular.drag.resize', 'ng-context-menu']) .controller('JointCtrl', JointCtrl); JointCtrl.$inject = ['$scope', 'smartRequest', 'Notification', '$http']; function JointCtrl($scope, smartRequest, Notification) { document.getElementById('aside').remove(); document.getElementById("view").style.display = "flex"; document.getElementById("view").style.justifyContent = "center"; document.getElementById("view").style.alignItems = "center"; //$scope.percentWidth = document.getElementById('tables').clientWidth / 1024; //$scope.percentHeight = document.getElementById('tables').clientHeight / 768; $scope.percentWidth = document.getElementById('tables').offsetWidth / 1024; $scope.percentHeight = document.getElementById('tables').offsetHeight / 768; console.log(document.getElementById('tables').offsetWidth / 1024); console.log(document.getElementById('tables').offsetHeight / 768); const { dia, shapes, highlighters } = joint; // Paper const paperContainer = document.getElementById("paper-container"); const graph = new dia.Graph({}, { cellNamespace: shapes }); const paper = new dia.Paper({ model: graph, cellViewNamespace: shapes, width: "100%", height: "100%", gridSize: 5, async: true, frozen: true, sorting: dia.Paper.sorting.APPROX, background: { color: "#F3F7F6" }, clickThreshold: 10, defaultConnector: { name: "rounded" }, defaultRouter: { name: "manhattan", args: { step: 5, endDirections: ["bottom"], startDirections: ["top"], padding: { bottom: 30 } } } }); paperContainer.appendChild(paper.el); const ResizeTool = joint.elementTools.Control.extend({ getPosition: function (view) { const model = view.model; const { width, height } = model.size(); return { x: width, y: height }; }, setPosition: function (view, coordinates) { const model = view.model; model.resize(Math.max(coordinates.x, 40), Math.max(coordinates.y, 40)); } }); const toolsView = new joint.dia.ToolsView({ tools: [ new ResizeTool({ selector: "body", handleAttributes: { fill: "#4666E5" } }) ] }); const color = "#ff4468"; paper.svg.prepend( V.createSVGStyle(` .joint-element .selection { stroke: ${color}; } .joint-link .selection { stroke: ${color}; stroke-dasharray: 5; stroke-dashoffset: 10; animation: dash 0.5s infinite linear; } @keyframes dash { to { stroke-dashoffset: 0; } } `) ); function element(w, h, x, y, table_id) { const el = new shapes.standard.Rectangle({ position: { x, y}, size: { width: w * $scope.percentWidth, height: h * $scope.percentHeight}, attrs: { label: { text: `СТОЛ ${table_id}`, fontFamily: "sans-serif", fontSize: "60%" } }, z: 2 }); graph.addCell(el); return el; } function elementC(x, y) { const el = new shapes.standard.Circle({ position: { x, y }, size: { width: 50, height: 50 }, attrs: { label: { text: `ℹ️`, fontFamily: "sans-serif" } }, z: 2 }); graph.addCell(el); return el; } function link(target, source) { const l = new shapes.standard.Link({ source: { id: source.id }, target: { id: target.id }, z: 1 }); graph.addCell(l); return l; } smartRequest.get('v1/roommap?method=map&type=place&id=2', function (data) { $scope.place = data.place; $scope.place_id = data.place_id; $scope.tables = data.tables; console.log($scope.tables); $scope.tables.forEach(function (el) { element(el.width, el.height, el.y * $scope.percentWidth, el.x * $scope.percentHeight, el.table_id); }); }); //const el1 = element(470 * $scope.percentWidth, 235 * $scope.percentHeight, 470 * $scope.percentHeight, 150 * $scope.percentWidth); /* link(el1, el4); link(el2, el4); link(el3, el5); link(el4, el5); link(el6, el1); link(el6, el2);*/ paper.unfreeze(); function getElementPredecessorLinks(el) { return graph .getSubgraph([el, ...graph.getPredecessors(el)]) .filter((cell) => cell.isLink()); } function highlightCell(cell) { highlighters.addClass.add( cell.findView(paper), cell.isElement() ? "body" : "line", "selection", { className: "selection" } ); } function unhighlightCell(cell) { highlighters.addClass.remove( cell.findView(paper).removeTools(toolsView), "selection" ); } let selection = null; function selectElement(el) { if (selection === el) return; if (selection) { unhighlightCell(selection); graph.getLinks().forEach((link) => unhighlightCell(link)); } if (el) { highlightCell(el); getElementPredecessorLinks(el).forEach((link) => highlightCell(link)); selection = el; selection.findView(paper).addTools( new joint.dia.ToolsView({ tools: [ new ResizeTool({ selector: "body", handleAttributes: { fill: "#4666E5" } }) ] }) ); } else { selection = null; } } paper.on("element:pointerclick", (elementView) => selectElement(elementView.model) ); paper.on("blank:pointerclick", (elementView) => selectElement(null)); /*selectElement(el2);*/ } })();