diff options
author | Ondřej Žára <ondras@zarovi.cz> | 2015-06-12 09:19:12 +0200 |
---|---|---|
committer | Ondřej Žára <ondras@zarovi.cz> | 2015-06-12 09:19:12 +0200 |
commit | c5a07ea2b037cc880225defc58ead88c916fa066 (patch) | |
tree | d12e9ff669e2eb826cc7da44e8eea98be2171587 /js/wwwsqldesigner.js | |
parent | c831747a411fbd7b59957d2cdf1943db53394ee8 (diff) | |
parent | 8f5da3a871bbe1fed02cbbc70d980772d9373566 (diff) | |
download | wwwsqldesigner-c5a07ea2b037cc880225defc58ead88c916fa066.zip wwwsqldesigner-c5a07ea2b037cc880225defc58ead88c916fa066.tar.gz wwwsqldesigner-c5a07ea2b037cc880225defc58ead88c916fa066.tar.bz2 |
Merge pull request #198 from tempelmann/master
Adds Dropbox support.
Diffstat (limited to 'js/wwwsqldesigner.js')
-rwxr-xr-x[-rw-r--r--] | js/wwwsqldesigner.js | 250 |
1 files changed, 211 insertions, 39 deletions
diff --git a/js/wwwsqldesigner.js b/js/wwwsqldesigner.js index 7e0394d..235e1ad 100644..100755 --- a/js/wwwsqldesigner.js +++ b/js/wwwsqldesigner.js @@ -1,8 +1,31 @@ +/* -------------------- configuration -------------------- */ + +/* + * The key below needs to be set individually by you if you want to use the Dropbox load/save feature. + * To do that, first sign up with Dropbox (may require a specific developer / SDK sign-up), go to + * https://www.dropbox.com/developers/apps and use "Create app" to add a new app. Call it, for instance, + * "wwwsqldesigner", and give it the "App Folder" permission. Unter "OAuth 2", "Redirect URIs", add + * the URL to the "dropbox-oauth-receiver.html" file on your server. E.g, if you install wwwsqldesigner + * on your local web server under "http://localhost/sqldesigner/", then add + * http://localhost/sqldesigner/dropbox-oauth-receiver.html as a Redirection URI. + * Copy the shown "App key" and paste it here below: + */ +var dropboxAppKey = null; // "your app key"; + + +/* -------------------- globals -------------------- */ + function _(str) { /* getText */ if (!(str in window.LOCALE)) { return str; } return window.LOCALE[str]; } +if (typeof String.prototype.endsWith !== 'function') { + String.prototype.endsWith = function(suffix) { + return this.indexOf(suffix, this.length - suffix.length) !== -1; + }; +} + var DATATYPES = false; var LOCALE = {}; var SQL = {}; @@ -1249,12 +1272,14 @@ SQL.IO = OZ.Class(); SQL.IO.prototype.init = function(owner) { this.owner = owner; - this._name = ""; /* last used keyword */ + this._name = ""; /* last used name with server load/save */ + this.lastUsedName = ""; /* last used name with local storage or dropbox load/save */ this.dom = { container:OZ.$("io") }; var ids = ["saveload","clientlocalsave", "clientsave", "clientlocalload", "clientlocallist","clientload", "clientsql", + "dropboxsave", "dropboxload", "dropboxlist", "quicksave", "serversave", "serverload", "serverlist", "serverimport"]; for (var i=0;i<ids.length;i++) { @@ -1290,6 +1315,9 @@ SQL.IO.prototype.init = function(owner) { OZ.Event.add(this.dom.clientlocalload, "click", this.bind(this.clientlocalload)); OZ.Event.add(this.dom.clientlocallist, "click", this.bind(this.clientlocallist)); OZ.Event.add(this.dom.clientload, "click", this.bind(this.clientload)); + OZ.Event.add(this.dom.dropboxload, "click", this.bind(this.dropboxload)); + OZ.Event.add(this.dom.dropboxsave, "click", this.bind(this.dropboxsave)); + OZ.Event.add(this.dom.dropboxlist, "click", this.bind(this.dropboxlist)); OZ.Event.add(this.dom.clientsql, "click", this.bind(this.clientsql)); OZ.Event.add(this.dom.quicksave, "click", this.bind(this.quicksave)); OZ.Event.add(this.dom.serversave, "click", this.bind(this.serversave)); @@ -1298,6 +1326,8 @@ SQL.IO.prototype.init = function(owner) { OZ.Event.add(this.dom.serverimport, "click", this.bind(this.serverimport)); OZ.Event.add(document, "keydown", this.bind(this.press)); this.build(); + + this.dropBoxInit (); } SQL.IO.prototype.build = function() { @@ -1328,6 +1358,24 @@ SQL.IO.prototype.click = function() { /* open io dialog */ this.owner.window.open(_("saveload"),this.dom.container); } +SQL.IO.prototype.fromXMLText = function(xml) { + try { + if (window.DOMParser) { + var parser = new DOMParser(); + var xmlDoc = parser.parseFromString(xml, "text/xml"); + } else if (window.ActiveXObject || "ActiveXObject" in window) { + var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); + xmlDoc.loadXML(xml); + } else { + throw new Error("No XML parser available."); + } + } catch(e) { + alert(_("xmlerror")+': '+e.message); + return; + } + this.fromXML(xmlDoc); +} + SQL.IO.prototype.fromXML = function(xmlDoc) { if (!xmlDoc || !xmlDoc.documentElement) { alert(_("xmlerror")+': Null document'); @@ -1349,21 +1397,21 @@ SQL.IO.prototype.clientload = function() { alert(_("empty")); return; } - try { - if (window.DOMParser) { - var parser = new DOMParser(); - var xmlDoc = parser.parseFromString(xml, "text/xml"); - } else if (window.ActiveXObject || "ActiveXObject" in window) { - var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); - xmlDoc.loadXML(xml); - } else { - throw new Error("No XML parser available."); - } - } catch(e) { - alert(_("xmlerror")+': '+e.message); - return; + + this.fromXMLText(xml); +} + +SQL.IO.prototype.promptName = function(title, suffix) { + var lastUsedName = this.owner.getOption("lastUsedName") || this.lastUsedName; + var name = prompt(_(title), lastUsedName); + if (!name) { return null; } + if (suffix && name.endsWith(suffix)) { + // remove suffix from name + name = name.substr(0, name.length-4); } - this.fromXML(xmlDoc); + this.owner.setOption("lastUsedName", name); + this.lastUsedName = name; // save this also in variable in case cookies are disabled + return name; } SQL.IO.prototype.clientlocalsave = function() { @@ -1378,8 +1426,8 @@ SQL.IO.prototype.clientlocalsave = function() { return; } - var key = prompt(_("serversaveprompt"), this._name); - if (key === null) { return; } + var key = this.promptName("serversaveprompt"); + if (!key) { return; } key = "wwwsqldesigner_databases_" + (key || "default"); try { @@ -1390,16 +1438,13 @@ SQL.IO.prototype.clientlocalsave = function() { } } - - SQL.IO.prototype.clientlocalload = function() { if (!window.localStorage) { alert("Sorry, your browser does not seem to support localStorage."); return; } - var key = prompt(_("serverloadprompt"), this._name); - if (key === null) { return; } + var key = this.promptName("serverloadprompt"); key = "wwwsqldesigner_databases_" + (key || "default"); try { @@ -1410,22 +1455,7 @@ SQL.IO.prototype.clientlocalload = function() { return; } - try { - if (window.DOMParser) { - var parser = new DOMParser(); - var xmlDoc = parser.parseFromString(xml, "text/xml"); - } else if (window.ActiveXObject || "ActiveXObject" in window) { - var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); - xmlDoc.loadXML(xml); - } else { - throw new Error("No XML parser available."); - } - } catch(e) { - alert(_("xmlerror")+': '+e.message); - return; - } - - this.fromXML(xmlDoc); + this.fromXMLText(xml); } SQL.IO.prototype.clientlocallist = function() { @@ -1434,7 +1464,7 @@ SQL.IO.prototype.clientlocallist = function() { return; } - /* --- Define some usefull vars --- */ + /* --- Define some useful vars --- */ var baseKeysName = "wwwsqldesigner_databases_"; var localLen = localStorage.length; var data = ""; @@ -1461,6 +1491,148 @@ SQL.IO.prototype.clientlocallist = function() { this.listresponse(data, code); } +/* ------------------------- Dropbox start ------------------------ */ + +/* + * The following code uses this lib: https://github.com/dropbox/dropbox-js + */ + +SQL.IO.prototype.dropBoxInit = function() +{ + if (dropboxAppKey) { + this.dropboxClient = new Dropbox.Client({ key: dropboxAppKey }); +} else { + this.dropboxClient = null; + + // Hide the Dropbox buttons and divider + var elems = document.querySelectorAll("[id^=dropbox]"); // gets all tags whose id start with "dropbox" + [].slice.call(elems).forEach( + function(elem) { elem.style.display = "none"; } + ); + } +} + +SQL.IO.prototype.showDropboxError = function(error) { + var prefix = _("Dropbox error")+": "; + var msg = error.status; + + switch (error.status) { + case Dropbox.ApiError.INVALID_TOKEN: + // If you're using dropbox.js, the only cause behind this error is that + // the user token expired. + // Get the user through the authentication flow again. + msg = _("Invalid Token (expired)"); + break; + + case Dropbox.ApiError.NOT_FOUND: + // The file or folder you tried to access is not in the user's Dropbox. + // Handling this error is specific to your application. + msg = _("File not found"); + break; + + case Dropbox.ApiError.OVER_QUOTA: + // The user is over their Dropbox quota. + // Tell them their Dropbox is full. Refreshing the page won't help. + msg = _("Dropbox is full"); + break; + + case Dropbox.ApiError.RATE_LIMITED: + // Too many API requests. Tell the user to try again later. + // Long-term, optimize your code to use fewer API calls. + break; + + case Dropbox.ApiError.NETWORK_ERROR: + // An error occurred at the XMLHttpRequest layer. + // Most likely, the user's network connection is down. + // API calls will not succeed until the user gets back online. + msg = _("Network error"); + break; + + case Dropbox.ApiError.INVALID_PARAM: + case Dropbox.ApiError.OAUTH_ERROR: + case Dropbox.ApiError.INVALID_METHOD: + default: + // Caused by a bug in dropbox.js, in your application, or in Dropbox. + // Tell the user an error occurred, ask them to refresh the page. + } + + alert (prefix+msg); +}; + +SQL.IO.prototype.showDropboxAuthenticate = function() { + if (!this.dropboxClient) return false; + + // We want to use a popup window for authentication as the default redirection won't work for us as it'll make us lose our schema data + this.dropboxClient.authDriver(new Dropbox.AuthDriver.Popup({ receiverUrl: "dropbox-oauth-receiver.html" })); + + // Now let's authenticate us + var success = false; + this.dropboxClient.authenticate( function(error, client) { + if (error) { + this.showDropboxError(error); + return; + } + success = true; + return; + }); + return success; +} + +SQL.IO.prototype.dropboxsave = function() { + if (!this.showDropboxAuthenticate()) return; + + var key = this.promptName("serversaveprompt", ".xml"); + if (!key) { return; } + var filename = (key || "default") + ".xml"; + + var sql_io = this; + sql_io.listresponse("Saving...", 200); + var xml = this.owner.toXML(); + this.dropboxClient.writeFile(filename, xml, function(error, stat) { + if (error) { + sql_io.listresponse("", 200); + return this.showDropboxError(error); + } + sql_io.listresponse(filename+" "+_("was saved to Dropbox"), 200); + }); +} + +SQL.IO.prototype.dropboxload = function() { + if (!this.showDropboxAuthenticate()) return; + + var key = this.promptName("serverloadprompt", ".xml"); + if (!key) { return; } + var filename = (key || "default") + ".xml"; + + var sql_io = this; + sql_io.listresponse("Loading...", 200); + this.dropboxClient.readFile(filename, function(error, data) { + sql_io.listresponse("", 200); + if (error) { + return this.showDropboxError(error); + } + sql_io.fromXMLText(data); + }); +} + +SQL.IO.prototype.dropboxlist = function() { + if (!this.showDropboxAuthenticate()) return; + + var sql_io = this; + sql_io.listresponse("Loading...", 200); + this.dropboxClient.readdir("/", function(error, entries) { + if (error) { + sql_io.listresponse("", 200); + return this.showDropboxError(error); + } + var data = entries.join("\n")+"\n"; + sql_io.listresponse(data, 200); + }); +} + + +/* ------------------------- Dropbox end ------------------------ */ + SQL.IO.prototype.clientsql = function() { var bp = this.owner.getOption("staticpath"); var path = bp + "db/"+window.DATATYPES.getAttribute("db")+"/output.xsl"; @@ -1491,7 +1663,7 @@ SQL.IO.prototype.finish = function(xslDoc) { alert(_("xmlerror")+': '+e.message); return; } - this.dom.ta.value = sql; + this.dom.ta.value = sql.trim(); } SQL.IO.prototype.serversave = function(e, keyword) { |