drawio/war/plugins/sql.js
2016-10-27 16:53:53 +01:00

176 lines
5 KiB
JavaScript

/**
* Parse SQL CREATE TABLE. Simple initial version for community to improve.
*/
Draw.loadPlugin(function(ui)
{
// LATER: REFERENCES and PRIMARY KEY
var div = document.createElement('div');
div.style.userSelect = 'none';
div.style.overflow = 'hidden';
div.style.padding = '10px';
div.style.height = '100%';
var graph = ui.editor.graph;
var sqlInput = document.createElement('textarea');
sqlInput.style.height = '200px';
sqlInput.style.width = '100%';
sqlInput.value = 'CREATE TABLE Persons\n(\nPersonID int,\nLastName varchar(255),\n' +
'FirstName varchar(255),\nAddress varchar(255),\nCity varchar(255)\n);';
mxUtils.br(div);
div.appendChild(sqlInput);
var graph = ui.editor.graph;
// Extends Extras menu
mxResources.parse('fromSql=From SQL');
var wnd = new mxWindow(mxResources.get('fromSql'), div, document.body.offsetWidth - 480, 140,
320, 300, true, true);
wnd.destroyOnClose = false;
wnd.setMaximizable(false);
wnd.setResizable(false);
wnd.setClosable(true);
function parseSql(text)
{
var lines = text.split('\n');
var tableCell = null;
var rows = null;
var cells = [];
var dx = 0;
for (var i = 0; i < lines.length; i++)
{
var tmp = mxUtils.trim(lines[i]);
if (tmp.substring(0, 12).toLowerCase() == 'create table')
{
var name = mxUtils.trim(tmp.substring(12));
if (name.charAt(name.length - 1) == '(')
{
name = name.substring(0, name.lastIndexOf(' '));
}
tableCell = new mxCell(name, new mxGeometry(dx, 0, 160, 26),
'swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=26;fillColor=#e0e0e0;horizontalStack=0;resizeParent=1;resizeLast=0;collapsible=1;marginBottom=0;swimlaneFillColor=#ffffff;align=center;');
tableCell.vertex = true;
cells.push(tableCell);
var size = ui.editor.graph.getPreferredSizeForCell(rowCell);
if (size != null)
{
tableCell.geometry.width = size.width + 10;
}
// For primary key lookups
rows = {};
}
else if (tableCell != null && tmp.charAt(0) == ')')
{
dx += tableCell.geometry.width + 40;
tableCell = null;
}
else if (tmp != '(' && tableCell != null)
{
var name = tmp.substring(0, (tmp.charAt(tmp.length - 1) == ',') ? tmp.length - 1 : tmp.length);
if (name.substring(0, 11).toLowerCase() != 'primary key')
{
var rowCell = new mxCell(name, new mxGeometry(0, 0, 90, 26),
'shape=partialRectangle;top=0;left=0;right=0;bottom=0;align=left;verticalAlign=top;spacingTop=-2;fillColor=none;spacingLeft=34;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;dropTarget=0;');
rowCell.vertex = true;
var left = sb.cloneCell(rowCell, '' /* eg. PK */);
left.connectable = false;
left.style = 'shape=partialRectangle;top=0;left=0;bottom=0;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[];portConstraint=eastwest;part=1;'
left.geometry.width = 30;
left.geometry.height = 26;
rowCell.insert(left);
var size = ui.editor.graph.getPreferredSizeForCell(rowCell);
if (size != null && tableCell.geometry.width < size.width + 10)
{
tableCell.geometry.width = size.width + 10;
}
tableCell.insert(rowCell);
tableCell.geometry.height += 26;
rows[rowCell.value] = rowCell;
}
}
}
if (cells.length > 0)
{
var graph = ui.editor.graph;
var view = graph.view;
var bds = graph.getGraphBounds();
// Computes unscaled, untranslated graph bounds
var x = Math.ceil(Math.max(0, bds.x / view.scale - view.translate.x) + 4 * graph.gridSize);
var y = Math.ceil(Math.max(0, (bds.y + bds.height) / view.scale - view.translate.y) + 4 * graph.gridSize);
graph.setSelectionCells(graph.importCells(cells, x, y));
graph.scrollCellToVisible(graph.getSelectionCell());
}
wnd.setVisible(false);
};
mxUtils.br(div);
var resetBtn = mxUtils.button(mxResources.get('reset'), function()
{
sqlInput.value = '';
});
resetBtn.style.marginTop = '8px';
resetBtn.style.marginRight = '4px';
resetBtn.style.padding = '4px';
div.appendChild(resetBtn);
var btn = mxUtils.button(mxResources.get('cancel'), function()
{
wnd.setVisible(false);
});
btn.style.marginTop = '8px';
btn.style.marginRight = '4px';
btn.style.padding = '4px';
div.appendChild(btn);
var btn = mxUtils.button(mxResources.get('insert'), function()
{
parseSql(sqlInput.value);
});
btn.style.marginTop = '8px';
btn.style.padding = '4px';
div.appendChild(btn);
// Adds action
ui.actions.addAction('fromSql', function()
{
wnd.setVisible(!wnd.isVisible());
if (wnd.isVisible())
{
sqlInput.focus();
}
});
var theMenu = ui.menus.get('insert');
var oldMenu = theMenu.funct;
theMenu.funct = function(menu, parent)
{
oldMenu.apply(this, arguments);
ui.menus.addMenuItems(menu, ['fromSql'], parent);
};
});