From 7085c6cb6d38ad812e46f930a75b12737616a167 Mon Sep 17 00:00:00 2001 From: Michael Hackstein Date: Fri, 31 Jan 2014 21:38:47 +0100 Subject: [PATCH 01/29] The context menu in the graphviewer now has style of OSX --- .../frontend/css/jquery.contextmenu.css | 41 +++++++++++++++++++ js/apps/system/aardvark/manifest.json | 1 + .../specContextMenu/contextMenuSpec.js | 15 ++++--- 3 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 js/apps/system/aardvark/frontend/css/jquery.contextmenu.css diff --git a/js/apps/system/aardvark/frontend/css/jquery.contextmenu.css b/js/apps/system/aardvark/frontend/css/jquery.contextmenu.css new file mode 100644 index 0000000000..621123da3b --- /dev/null +++ b/js/apps/system/aardvark/frontend/css/jquery.contextmenu.css @@ -0,0 +1,41 @@ +/* OSX Theme */ +/* ========= */ +.context-menu-theme-osx { + background-color:white; + opacity: .93; + filter: alpha(opacity=93); + zoom:1.0; + border:1px solid #b2b2b2; + padding: 3px 0px; + border-radius: 4px; +} +.context-menu-theme-osx .context-menu-item { + text-align:left; + cursor:pointer; + color:black; + font-family:Lucida Grande,Arial; + font-weight:700; + font-size:12px; + opacity: 1.0; + filter: alpha(opacity=100); + z-index:1; +} +.context-menu-theme-osx .context-menu-separator { + margin:5px 1px 4px 1px; + font-size:0px; + border-top:1px solid #e4e4e4; +} +.context-menu-theme-osx .context-menu-item:hover { + background-color:#1C44F2; + color:white; +} +.context-menu-theme-osx .context-menu-item .context-menu-item-inner { + padding:2px 10px 2px 22px; + background-color:none; + background-repeat:no-repeat; + background-position:4px center; + background-image:none; +} +.context-menu-theme-osx .context-menu-item-disabled { + color:#939393; +} diff --git a/js/apps/system/aardvark/manifest.json b/js/apps/system/aardvark/manifest.json index 34cc606cb5..f835df9748 100644 --- a/js/apps/system/aardvark/manifest.json +++ b/js/apps/system/aardvark/manifest.json @@ -100,6 +100,7 @@ "frontend/css/arangodbIcons.css", "frontend/css/bootstrap-glyphicons.css", "frontend/css/jquery-ui-1.9.2.custom.css", + "frontend/css/jquery.contextmenu.css", "frontend/css/layout.css", "frontend/css/jquery.dataTables.css", "frontend/css/nv.d3.css", diff --git a/js/apps/system/aardvark/test/specs/graphViewer/specContextMenu/contextMenuSpec.js b/js/apps/system/aardvark/test/specs/graphViewer/specContextMenu/contextMenuSpec.js index 2cb81bbb98..5057aed82f 100644 --- a/js/apps/system/aardvark/test/specs/graphViewer/specContextMenu/contextMenuSpec.js +++ b/js/apps/system/aardvark/test/specs/graphViewer/specContextMenu/contextMenuSpec.js @@ -3,7 +3,7 @@ /*global describe, it, expect, jasmine */ /*global runs, spyOn, waitsFor, waits */ /*global document, $*/ -/*global ContextMenu*/ +/*global ContextMenu, uiMatchers*/ //////////////////////////////////////////////////////////////////////////////// /// @brief Graph functionality @@ -66,6 +66,7 @@ }; spyOn($.contextMenu, "create").andReturn(fakeMenu); conMenu = new ContextMenu(id); + uiMatchers.define(this); }); it("should create a div in the body", function() { @@ -95,15 +96,19 @@ spyOn(call, "back"); conMenu.addEntry("MyLabel", call.back); // Check if entry is inserted - entry = document.getElementById(id).firstChild; + entry = document.getElementById(id); expect(entry).toBeDefined(); - expect(entry.tagName.toLowerCase()).toEqual("ul"); + expect(entry).toBeTag("div"); + expect(entry).toBeOfClass("context-menu"); + expect(entry).toBeOfClass("context-menu-theme-osx"); entry = entry.firstChild; expect(entry).toBeDefined(); - expect(entry.tagName.toLowerCase()).toEqual("li"); + expect(entry).toBeTag("div"); + expect(entry).toBeOfClass("context-menu-item"); entry = entry.firstChild; expect(entry).toBeDefined(); - expect(entry.tagName.toLowerCase()).toEqual("button"); + expect(entry).toBeTag("div"); + expect(entry).toBeOfClass("context-menu-item-inner"); // Check clicks conMenu.bindMenu(fake); expect(call.back).not.toHaveBeenCalled(); From 6f44fcf00e6ead2392d3591d94c51c16783055f2 Mon Sep 17 00:00:00 2001 From: Michael Hackstein Date: Fri, 31 Jan 2014 21:41:40 +0100 Subject: [PATCH 02/29] Made unexpanded vertices semi-transparent, i am not yet happy with this --- .../js/graphViewer/graph/nodeShaper.js | 5 +++++ .../js/graphViewer/ui/contextMenuHelper.js | 21 +++++++++---------- .../js/graphViewer/ui/modalDialogHelper.js | 1 - 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/js/apps/system/aardvark/frontend/js/graphViewer/graph/nodeShaper.js b/js/apps/system/aardvark/frontend/js/graphViewer/graph/nodeShaper.js index 6a54cf32ae..9a84fa5f29 100644 --- a/js/apps/system/aardvark/frontend/js/graphViewer/graph/nodeShaper.js +++ b/js/apps/system/aardvark/frontend/js/graphViewer/graph/nodeShaper.js @@ -426,6 +426,11 @@ function NodeShaper(parent, flags, idfunc) { return colourMapper.getCommunityColour(); } return colourMapper.getColour(findFirstValue(color.key, n._data)); + }).attr("opacity", function(n) { + if (!n._expanded) { + return "0.8"; + } + return "1"; }); }; addLabelColor = function (n) { diff --git a/js/apps/system/aardvark/frontend/js/graphViewer/ui/contextMenuHelper.js b/js/apps/system/aardvark/frontend/js/graphViewer/ui/contextMenuHelper.js index 77df15c96a..b718805a7b 100644 --- a/js/apps/system/aardvark/frontend/js/graphViewer/ui/contextMenuHelper.js +++ b/js/apps/system/aardvark/frontend/js/graphViewer/ui/contextMenuHelper.js @@ -40,16 +40,17 @@ function ContextMenu(id) { menu, addEntry = function(label, callback) { - var li, button; - li = document.createElement("li"); - button = document.createElement("button"); - button.onclick = function() { + var item, inner; + item = document.createElement("div"); + item.className = "context-menu-item"; + inner = document.createElement("div"); + inner.className = "context-menu-item-inner"; + inner.appendChild(document.createTextNode(label)); + inner.onclick = function() { callback(d3.select(menu.target).data()[0]); }; - button.className = "btn btn-primary gv_context_button"; - button.appendChild(document.createTextNode(label)); - li.appendChild(button); - ul.appendChild(li); + item.appendChild(inner); + div.appendChild(item); }, bindMenu = function($objects) { @@ -70,11 +71,9 @@ function ContextMenu(id) { div.parentElement.removeChild(div); } div = document.createElement("div"); + div.className = "context-menu context-menu-theme-osx"; div.id = id; - ul = document.createElement("ul"); document.body.appendChild(div); - div.appendChild(ul); - ul = div.firstChild; return div; }; diff --git a/js/apps/system/aardvark/frontend/js/graphViewer/ui/modalDialogHelper.js b/js/apps/system/aardvark/frontend/js/graphViewer/ui/modalDialogHelper.js index 151c60a458..dfa3f35d29 100644 --- a/js/apps/system/aardvark/frontend/js/graphViewer/ui/modalDialogHelper.js +++ b/js/apps/system/aardvark/frontend/js/graphViewer/ui/modalDialogHelper.js @@ -451,7 +451,6 @@ var modalDialogHelper = modalDialogHelper || {}; modalDialogHelper.createModalChangeDialog = function(title, idprefix, objects, callback) { var table = modalDialogHelper.modalDivTemplate(title, "Change", idprefix, callback); - console.log(objects); _.each(objects, function(o) { insertModalRow(table, idprefix, o); }); From 7c063d35728dd8934818c9b5438b6501b3fe3104 Mon Sep 17 00:00:00 2001 From: Michael Hackstein Date: Fri, 31 Jan 2014 22:57:03 +0100 Subject: [PATCH 03/29] The graph viewer now has arrows --- .../frontend/js/graphViewer/graph/edgeShaper.js | 15 +++++++++++++-- .../frontend/js/graphViewer/graphViewer.js | 3 +++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/js/apps/system/aardvark/frontend/js/graphViewer/graph/edgeShaper.js b/js/apps/system/aardvark/frontend/js/graphViewer/graph/edgeShaper.js index 6b7b9c84fa..77b49fd253 100644 --- a/js/apps/system/aardvark/frontend/js/graphViewer/graph/edgeShaper.js +++ b/js/apps/system/aardvark/frontend/js/graphViewer/graph/edgeShaper.js @@ -94,7 +94,18 @@ function EdgeShaper(parent, config, idfunc) { * (t.y - s.y) + (t.x - s.x) * (t.x - s.x) - ); + ), + m; + if (s.x === t.x) { + res -= t.z * 18; + } else { + m = Math.abs((t.y - s.y) / (t.x - s.x)); + if (m < 0.4) { + res -= Math.abs((res * t.z * 45) / (t.x - s.x)); + } else { + res -= Math.abs((res * t.z * 18) / (t.y - s.y)); + } + } return res; }, @@ -215,7 +226,7 @@ function EdgeShaper(parent, config, idfunc) { .select("defs") .append("marker") .attr("id", "arrow") - .attr("refX", "22") + .attr("refX", "10") .attr("refY", "5") .attr("markerUnits", "strokeWidth") .attr("markerHeight", "10") diff --git a/js/apps/system/aardvark/frontend/js/graphViewer/graphViewer.js b/js/apps/system/aardvark/frontend/js/graphViewer/graphViewer.js index acb21b53ca..dcadcb296e 100644 --- a/js/apps/system/aardvark/frontend/js/graphViewer/graphViewer.js +++ b/js/apps/system/aardvark/frontend/js/graphViewer/graphViewer.js @@ -112,6 +112,9 @@ function GraphViewer(svg, width, height, adapterConfig, config) { nsConf = config.nodeShaper || {}, idFunc = nsConf.idfunc || undefined, zConf = config.zoom || false; + esConf.shape = esConf.shape || { + type: EdgeShaper.shapes.ARROW + }; parseLayouterConfig(config.layouter); edgeContainer = graphContainer.append("g"); edgeShaper = new EdgeShaper(edgeContainer, esConf); From 6b12a0babcd89779d2ea22e576b9d7691ba2d0f4 Mon Sep 17 00:00:00 2001 From: Michael Hackstein Date: Fri, 31 Jan 2014 23:09:24 +0100 Subject: [PATCH 04/29] The db selection select box is now readable in firefox --- js/apps/system/aardvark/frontend/css/dbSelectionView.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/apps/system/aardvark/frontend/css/dbSelectionView.css b/js/apps/system/aardvark/frontend/css/dbSelectionView.css index 91e057b929..671718fa89 100644 --- a/js/apps/system/aardvark/frontend/css/dbSelectionView.css +++ b/js/apps/system/aardvark/frontend/css/dbSelectionView.css @@ -1,8 +1,8 @@ span.selectDB > select { line-height: 20px; - height: 20px; + height: 30px; width: 150px; - margin: -3px 0px 2px 0px; + margin: -5px 0px; border-radius: 0px !important; border: 1px solid; } From f580bd1aded8084364d49a6d45cd8a5a37662333 Mon Sep 17 00:00:00 2001 From: Michael Hackstein Date: Fri, 31 Jan 2014 23:38:33 +0100 Subject: [PATCH 05/29] Fixed tests for translated arrow positions. --- .../specEdgeShaper/edgeShaperSpec.js | 55 ++++++++++++++----- 1 file changed, 42 insertions(+), 13 deletions(-) diff --git a/js/apps/system/aardvark/test/specs/graphViewer/specEdgeShaper/edgeShaperSpec.js b/js/apps/system/aardvark/test/specs/graphViewer/specEdgeShaper/edgeShaperSpec.js index 1006921ec9..397c14b16e 100644 --- a/js/apps/system/aardvark/test/specs/graphViewer/specEdgeShaper/edgeShaperSpec.js +++ b/js/apps/system/aardvark/test/specs/graphViewer/specEdgeShaper/edgeShaperSpec.js @@ -38,7 +38,27 @@ describe('Edge Shaper', function() { - var svg; + var svg, + getDistance = function(s, t) { + var res = Math.sqrt( + (t.y - s.y) + * (t.y - s.y) + + (t.x - s.x) + * (t.x - s.x) + ), + m; + if (s.x === t.x) { + res -= t.z * 18; + } else { + m = Math.abs((t.y - s.y) / (t.x - s.x)); + if (m < 0.4) { + res -= Math.abs((res * t.z * 45) / (t.x - s.x)); + } else { + res -= Math.abs((res * t.z * 18) / (t.y - s.y)); + } + } + return res; + }; beforeEach(function () { svg = document.createElement("svg"); @@ -261,35 +281,40 @@ _id: 1, position: { x: 20, - y: 20 + y: 20, + z: 1 } }, NE = { _id: 2, position: { x: 30, - y: 10 + y: 10, + z: 1 } }, SE = { _id: 3, position: { x: 40, - y: 30 + y: 30, + z: 1 } }, SW = { _id: 4, position: { x: 10, - y: 40 + y: 40, + z: 1 } }, NW = { _id: 5, position: { x: 0, - y: 0 + y: 0, + z: 1 } }, edges = [ @@ -328,10 +353,10 @@ expect($("#1-5").attr("transform")).toEqual("translate(20, 20)rotate(-135)"); //Check length of line - expect($("#1-2 line").attr("x2")).toEqual("14.142135623730951"); - expect($("#1-3 line").attr("x2")).toEqual("22.360679774997898"); - expect($("#1-4 line").attr("x2")).toEqual("22.360679774997898"); - expect($("#1-5 line").attr("x2")).toEqual("28.284271247461902"); + expect($("#1-2 line").attr("x2")).toEqual(String(getDistance(center.position, NE.position))); + expect($("#1-3 line").attr("x2")).toEqual(String(getDistance(center.position, SE.position))); + expect($("#1-4 line").attr("x2")).toEqual(String(getDistance(center.position, SW.position))); + expect($("#1-5 line").attr("x2")).toEqual(String(getDistance(center.position, NW.position))); }); it('should be able to draw an edge that follows the cursor', function() { @@ -721,14 +746,16 @@ _id: 1, position: { x: 20, - y: 20 + y: 20, + z: 1 } }, { _id: 2, position: { x: 100, - y: 20 + y: 20, + z: 1 } } ], @@ -744,7 +771,9 @@ ]; shaper.drawEdges(edges); - expect($("#1-2 text").attr("transform")).toEqual("translate(40, -3)"); + expect($("#1-2 text").attr("transform")).toEqual("translate(" + + getDistance(nodes[0].position, nodes[1].position) / 2 + + ", -3)"); }); it('should ignore other attributes', function() { From 74c0457b4bdf5b2eed3aa7192299c3284f40ed32 Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Fri, 31 Jan 2014 23:58:36 +0100 Subject: [PATCH 06/29] added version check for admin interface --- .../aardvark/frontend/js/arango/arango.js | 38 +++++++- .../aardvark/frontend/js/routers/router.js | 93 +++++++++++++++++++ 2 files changed, 129 insertions(+), 2 deletions(-) diff --git a/js/apps/system/aardvark/frontend/js/arango/arango.js b/js/apps/system/aardvark/frontend/js/arango/arango.js index 9a8d40da4c..e53e00a920 100644 --- a/js/apps/system/aardvark/frontend/js/arango/arango.js +++ b/js/apps/system/aardvark/frontend/js/arango/arango.js @@ -3,6 +3,40 @@ (function() { "use strict"; + window.versionHelper = { + fromString: function (s) { + var parts = s.replace(/-.*$/g, '').split('.'); + return { + major: parseInt(parts[0]) || 0, + minor: parseInt(parts[1]) || 0, + patch: parseInt(parts[2]) || 0 + }; + }, + toString: function (v) { + return v.major + '.' + v.minor + '.' + v.patch; + }, + toStringMainLine: function (v) { + return v.major + '.' + v.minor; + }, + compareVersions: function (l, r) { + if (l.major === r.major) { + if (l.minor === r.minor) { + if (l.patch === r.patch) { + return 0; + } + return l.patch - r.patch; + } + return l.minor - r.minor; + } + return l.major - r.major; + }, + compareVersionStrings: function (l, r) { + l = window.versionHelper.fromString(l); + r = window.versionHelper.fromString(r); + return window.versionHelper.compareVersions(l, r); + } + }; + window.arangoHelper = { lastNotificationMessage: null, @@ -71,12 +105,12 @@ $.gritter.removeAll(); this.lastNotificationMessage = null; }, - arangoNotification: function (message) { + arangoNotification: function (message, time) { var returnVal = false; $.gritter.add({ title: "Notice:", text: message, - time: 3000, + time: time || 3000, before_open: function(){ returnVal = true; } diff --git a/js/apps/system/aardvark/frontend/js/routers/router.js b/js/apps/system/aardvark/frontend/js/routers/router.js index 95dd10dc87..8a59e8c387 100644 --- a/js/apps/system/aardvark/frontend/js/routers/router.js +++ b/js/apps/system/aardvark/frontend/js/routers/router.js @@ -76,6 +76,8 @@ collection: window.arangoCollectionsStore }); + // this.initVersionCheck(); + var self = this; $(window).resize(function() { self.handleResize(); @@ -83,6 +85,97 @@ this.handleResize(); }, +/* + initVersionCheck: function () { + // this checks for version updates + + var self = this; + var versionCheck = function () { + $.ajax({ + async: true, + crossDomain: true, + dataType: "jsonp", + url: "https://www.arangodb.org/repositories/versions.php?callback=parseVersions", + success: function (json) { + if (typeof json !== 'object') { + return; + } + + // turn our own version string into a version object + var currentVersion = window.versionHelper.fromString(self.footerView.system.version); + + // get our mainline version + var mainLine = window.versionHelper.toStringMainLine(currentVersion); + + var mainLines = Object.keys(json).sort(window.versionHelper.compareVersionStrings); + var latestMainLine; + mainLines.forEach(function (l) { + if (json[l].stable) { + if (window.versionHelper.compareVersionStrings(l, mainLine) > 0) { + latestMainLine = json[l]; + } + } + }); + + var update; + + if (latestMainLine !== undefined && + Object.keys(latestMainLine.versions.length > 0) { + var mainLineVersions = Object.keys(latestMainLine.versions); + mainLineVersions = mainLineVersions.sort(window.versionHelper.compareVersionStrings); + var latest = mainLineVersions[mainLineVersions.length - 1]; + + update = { + type: "major", + version: latest, + changes: latestMainLine.versions[latest].changes + }; + } + + // check which stable mainline versions are available remotely + if (update === undefined && + json.hasOwnProperty(mainLine) && + json[mainLine].stable && + json[mainLine].hasOwnProperty("versions") && + Object.keys(json[mainLine].versions).length > 0) { + // sort by version numbers + var mainLineVersions = Object.keys(json[mainLine].versions); + mainLineVersions = mainLineVersions.sort(window.versionHelper.compareVersionStrings); + var latest = mainLineVersions[mainLineVersions.length - 1]; + + var result = window.versionHelper.compareVersions( + currentVersion, + window.versionHelper.fromString(latest) + ); + if (result < 0) { + update = { + type: "minor", + version: latest, + changes: json[mainLine].versions[latest].changes + }; + } + } + + if (update !== undefined) { + var msg = "A newer version of ArangoDB (" + update.version + + ") has become available. You may want to check the " + + "changelog at " + + update.changes + ""; + arangoHelper.arangoNotification(msg, 15000); + + } + }, + error: function () { + // re-schedule the version check + window.setTimeout(versionCheck, 60000); + } + }); + }; + + window.setTimeout(versionCheck, 5000); + }, +*/ + logsAllowed: function () { return (window.databaseName === '_system'); }, From fbf6954bd7eb980c62372f6a5b2943198ba8cc1d Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Sat, 1 Feb 2014 00:25:19 +0100 Subject: [PATCH 07/29] updated documentation --- arangod/RestHandler/RestDocumentHandler.cpp | 28 ++++++++++----- arangod/RestHandler/RestEdgeHandler.cpp | 40 +++++++++++++-------- 2 files changed, 44 insertions(+), 24 deletions(-) diff --git a/arangod/RestHandler/RestDocumentHandler.cpp b/arangod/RestHandler/RestDocumentHandler.cpp index d2bdd43a61..ed3b012692 100644 --- a/arangod/RestHandler/RestDocumentHandler.cpp +++ b/arangod/RestHandler/RestDocumentHandler.cpp @@ -447,16 +447,18 @@ bool RestDocumentHandler::readDocument () { /// @RESTRETURNCODE{200} /// is returned if the document was found /// -/// @RESTRETURNCODE{404} -/// is returned if the document or collection was not found -/// /// @RESTRETURNCODE{304} /// is returned if the "If-None-Match" header is given and the document has /// the same version /// +/// @RESTRETURNCODE{404} +/// is returned if the document or collection was not found +/// /// @RESTRETURNCODE{412} /// is returned if a "If-Match" header or `rev` is given and the found -/// document has a different version +/// document has a different version. The response will also contain the found +/// document's current revision in the `_rev` attribute. Additionally, the +/// attributes `_id` and `_key` will be returned. /// /// @EXAMPLES /// @@ -773,7 +775,9 @@ bool RestDocumentHandler::readAllDocuments () { /// /// @RESTRETURNCODE{412} /// is returned if a "If-Match" header or `rev` is given and the found -/// document has a different version +/// document has a different version. The response will also contain the found +/// document's current revision in the `_rev` attribute. Additionally, the +/// attributes `_id` and `_key` will be returned. /// /// @EXAMPLES /// @@ -922,7 +926,9 @@ bool RestDocumentHandler::checkDocument () { /// /// @RESTRETURNCODE{412} /// is returned if a "If-Match" header or `rev` is given and the found -/// document has a different version +/// document has a different version. The response will also contain the found +/// document's current revision in the `_rev` attribute. Additionally, the +/// attributes `_id` and `_key` will be returned. /// /// @EXAMPLES /// @@ -1114,7 +1120,9 @@ bool RestDocumentHandler::replaceDocument () { /// /// @RESTRETURNCODE{412} /// is returned if a "If-Match" header or `rev` is given and the found -/// document has a different version +/// document has a different version. The response will also contain the found +/// document's current revision in the `_rev` attribute. Additionally, the +/// attributes `_id` and `_key` will be returned. /// /// @EXAMPLES /// @@ -1378,8 +1386,10 @@ bool RestDocumentHandler::modifyDocument (bool isPatch) { /// The response body contains an error document in this case. /// /// @RESTRETURNCODE{412} -/// is returned if a "If-Match" header or `rev` is given and the current -/// document has a different version +/// is returned if a "If-Match" header or `rev` is given and the found +/// document has a different version. The response will also contain the found +/// document's current revision in the `_rev` attribute. Additionally, the +/// attributes `_id` and `_key` will be returned. /// /// @EXAMPLES /// diff --git a/arangod/RestHandler/RestEdgeHandler.cpp b/arangod/RestHandler/RestEdgeHandler.cpp index 6822bb443a..e98963bf69 100644 --- a/arangod/RestHandler/RestEdgeHandler.cpp +++ b/arangod/RestHandler/RestEdgeHandler.cpp @@ -357,16 +357,18 @@ bool RestEdgeHandler::createDocument () { /// @RESTRETURNCODE{200} /// is returned if the edge was found /// -/// @RESTRETURNCODE{404} -/// is returned if the edge or collection was not found -/// /// @RESTRETURNCODE{304} /// is returned if the "If-None-Match" header is given and the edge has /// the same version /// +/// @RESTRETURNCODE{404} +/// is returned if the edge or collection was not found +/// /// @RESTRETURNCODE{412} /// is returned if a "If-Match" header or `rev` is given and the found -/// edge has a different version +/// document has a different version. The response will also contain the found +/// document's current revision in the `_rev` attribute. Additionally, the +/// attributes `_id` and `_key` will be returned. //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// @@ -424,16 +426,18 @@ bool RestEdgeHandler::createDocument () { /// @RESTRETURNCODE{200} /// is returned if the edge document was found /// -/// @RESTRETURNCODE{404} -/// is returned if the edge document or collection was not found -/// /// @RESTRETURNCODE{304} /// is returned if the "If-None-Match" header is given and the edge document has /// same version /// +/// @RESTRETURNCODE{404} +/// is returned if the edge document or collection was not found +/// /// @RESTRETURNCODE{412} -/// is returned if a "If-Match" header or `rev` is given and the found edge -/// document has a different version +/// is returned if a "If-Match" header or `rev` is given and the found +/// document has a different version. The response will also contain the found +/// document's current revision in the `_rev` attribute. Additionally, the +/// attributes `_id` and `_key` will be returned. //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// @@ -555,8 +559,10 @@ bool RestEdgeHandler::createDocument () { /// is returned if the collection or the edge document was not found /// /// @RESTRETURNCODE{412} -/// is returned if a "If-Match" header or `rev` is given and the found edge -/// document has a different version +/// is returned if a "If-Match" header or `rev` is given and the found +/// document has a different version. The response will also contain the found +/// document's current revision in the `_rev` attribute. Additionally, the +/// attributes `_id` and `_key` will be returned. /////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// @@ -655,8 +661,10 @@ bool RestEdgeHandler::createDocument () { /// is returned if the collection or the edge document was not found /// /// @RESTRETURNCODE{412} -/// is returned if a "If-Match" header or `rev` is given and the found edge -/// document has a different version +/// is returned if a "If-Match" header or `rev` is given and the found +/// document has a different version. The response will also contain the found +/// document's current revision in the `_rev` attribute. Additionally, the +/// attributes `_id` and `_key` will be returned. //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// @@ -716,8 +724,10 @@ bool RestEdgeHandler::createDocument () { /// The response body contains an error document in this case. /// /// @RESTRETURNCODE{412} -/// is returned if a "If-Match" header or `rev` is given and the current edge -/// document has a different version +/// is returned if a "If-Match" header or `rev` is given and the found +/// document has a different version. The response will also contain the found +/// document's current revision in the `_rev` attribute. Additionally, the +/// attributes `_id` and `_key` will be returned. //////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////// From 4a99cde395e11e00993a89db29d384bd38695dac Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Sat, 1 Feb 2014 01:50:58 +0100 Subject: [PATCH 08/29] jslintified several tests --- js/Makefile.files | 3 ++ .../aardvark/frontend/js/arango/arango.js | 8 ++--- js/client/tests/client.js | 33 ++++++++++++------- js/client/tests/shell-auth.js | 8 +++-- js/client/tests/shell-endpoints.js | 20 +++++++---- js/client/tests/shell-fm.js | 18 ++++++---- js/common/tests/shell-collection-volatile.js | 2 +- js/common/tests/shell-collection.js | 6 ++-- js/common/tests/shell-download.js | 4 +-- js/common/tests/shell-fs.js | 1 - js/common/tests/shell-graph-algorithms.js | 2 -- js/common/tests/shell-graph-measurement.js | 1 - js/common/tests/shell-graph-traversal.js | 8 ++--- js/common/tests/shell-hash-index.js | 15 ++++----- js/common/tests/shell-index-geo.js | 2 +- js/common/tests/shell-index.js | 2 +- js/common/tests/shell-statement.js | 8 ++--- js/common/tests/shell-unique-constraint.js | 8 ++--- js/common/tests/shell-unload.js | 1 - js/server/tests/ahuacatl-cross.js | 8 ++--- js/server/tests/ahuacatl-functions.js | 6 ++-- js/server/tests/ahuacatl-hash.js | 1 - js/server/tests/ahuacatl-skiplist.js | 1 - js/server/tests/compaction.js | 2 -- js/server/tests/replication-data.js | 13 ++++---- js/server/tests/routing.js | 1 - js/server/tests/shell-any.js | 3 +- js/server/tests/shell-bitarray-index.js | 2 -- js/server/tests/shell-database.js | 2 -- js/server/tests/shell-foxx-base-middleware.js | 6 ++-- js/server/tests/shell-foxx-preprocessor.js | 2 +- js/server/tests/shell-foxx.js | 9 ++--- js/server/tests/shell-production.js | 1 - js/server/tests/shell-skiplist-correctness.js | 3 -- js/server/tests/shell-skiplist-index.js | 3 -- .../tests/shell-skiplist-rm-performance.js | 3 -- js/server/tests/transactions.js | 6 ---- 37 files changed, 105 insertions(+), 117 deletions(-) diff --git a/js/Makefile.files b/js/Makefile.files index d7d0c97ccb..75c0da5b6a 100644 --- a/js/Makefile.files +++ b/js/Makefile.files @@ -50,10 +50,13 @@ JAVASCRIPT_JSLINT = \ `find @srcdir@/js/common/modules/org -name "*.js"` \ `find @srcdir@/js/client/modules -name "*.js"` \ `find @srcdir@/js/server/modules -name "*.js"` \ + `find @srcdir@/js/client/tests -name "*.js"` \ `find @srcdir@/js/apps/system/aardvark/frontend/js/models -name "*.js"` \ `find @srcdir@/js/apps/system/aardvark/frontend/js/views -name "*.js"` \ `find @srcdir@/js/apps/system/aardvark/frontend/js/collections -name "*.js"` \ `find @srcdir@/js/apps/system/aardvark/frontend/js/routers -name "*.js"` \ + `find @srcdir@/js/apps/system/aardvark/frontend/js/arango -name "*.js"` \ + `find @srcdir@/js/apps/system/aardvark/frontend/js/shell -name "*.js"` \ \ @srcdir@/js/client/client.js \ @srcdir@/js/server/server.js \ diff --git a/js/apps/system/aardvark/frontend/js/arango/arango.js b/js/apps/system/aardvark/frontend/js/arango/arango.js index e53e00a920..e85bad77c1 100644 --- a/js/apps/system/aardvark/frontend/js/arango/arango.js +++ b/js/apps/system/aardvark/frontend/js/arango/arango.js @@ -5,11 +5,11 @@ "use strict"; window.versionHelper = { fromString: function (s) { - var parts = s.replace(/-.*$/g, '').split('.'); + var parts = s.replace(/-[a-zA-Z0-9_\-]*$/g, '').split('.'); return { - major: parseInt(parts[0]) || 0, - minor: parseInt(parts[1]) || 0, - patch: parseInt(parts[2]) || 0 + major: parseInt(parts[0], 10) || 0, + minor: parseInt(parts[1], 10) || 0, + patch: parseInt(parts[2], 10) || 0 }; }, toString: function (v) { diff --git a/js/client/tests/client.js b/js/client/tests/client.js index 637938b062..92498c2efe 100644 --- a/js/client/tests/client.js +++ b/js/client/tests/client.js @@ -1,3 +1,8 @@ +/*jslint indent: 2, maxlen: 120, vars: true, white: true, plusplus: true, nonpropdel: true, nomen: true, sloppy: true */ +/*global require, assertEqual, assertNotEqual, + print, print_plain, COMPARE_STRING, NORMALIZE_STRING, + help, start_pager, stop_pager, start_pretty_print, stop_pretty_print, start_color_print, stop_color_print */ + //////////////////////////////////////////////////////////////////////////////// /// @brief tests for client-specific functionality /// @@ -25,6 +30,8 @@ /// @author Copyright 2012, triAGENS GmbH, Cologne, Germany //////////////////////////////////////////////////////////////////////////////// +(function () { + var jsunity = require("jsunity"); var db = require("org/arangodb").db; @@ -153,8 +160,8 @@ function clientTestSuite () { //////////////////////////////////////////////////////////////////////////////// testICU_Compare : function () { - nfc = "Gr\u00FC\u00DF Gott."; - nfd = "Gru\u0308\u00DF Gott."; + var nfc = "Gr\u00FC\u00DF Gott."; + var nfd = "Gru\u0308\u00DF Gott."; assertNotEqual(nfc, nfd); assertNotEqual(COMPARE_STRING(nfc, nfd), true); @@ -165,8 +172,8 @@ function clientTestSuite () { //////////////////////////////////////////////////////////////////////////////// testICU_Normalize : function () { - nfc = "Gr\u00FC\u00DF Gott."; - nfd = "Gru\u0308\u00DF Gott."; + var nfc = "Gr\u00FC\u00DF Gott."; + var nfd = "Gru\u0308\u00DF Gott."; assertNotEqual(nfc, nfd); assertEqual(NORMALIZE_STRING(nfd), nfc); @@ -179,15 +186,15 @@ function clientTestSuite () { testICU_Compare_Skiplist_Sorting : function () { db._create("ICU_SORTED"); - db["ICU_SORTED"].ensureSkiplist("test"); - db["ICU_SORTED"].save({ test : "äää" }); - db["ICU_SORTED"].save({ test : "aaa" }); - db["ICU_SORTED"].save({ test : "aab" }); - db["ICU_SORTED"].save({ test : "äaa" }); - db["ICU_SORTED"].save({ test : "äää" }); - db["ICU_SORTED"].save({ test : "Aaa" }); + db.ICU_SORTED.ensureSkiplist("test"); + db.ICU_SORTED.save({ test : "äää" }); + db.ICU_SORTED.save({ test : "aaa" }); + db.ICU_SORTED.save({ test : "aab" }); + db.ICU_SORTED.save({ test : "äaa" }); + db.ICU_SORTED.save({ test : "äää" }); + db.ICU_SORTED.save({ test : "Aaa" }); - var y = db["ICU_SORTED"].range("test", "A", "z") ; + var y = db.ICU_SORTED.range("test", "A", "z") ; assertEqual(y.next().test, "Aaa"); assertEqual(y.next().test, "aaa"); @@ -208,6 +215,8 @@ jsunity.run(clientTestSuite); return jsunity.done(); +}()); + // Local Variables: // mode: outline-minor // outline-regexp: "^\\(/// @brief\\|/// @addtogroup\\|// --SECTION--\\|/// @page\\|/// @}\\)" diff --git a/js/client/tests/shell-auth.js b/js/client/tests/shell-auth.js index bd2cf70e8a..3a358f0916 100644 --- a/js/client/tests/shell-auth.js +++ b/js/client/tests/shell-auth.js @@ -1,5 +1,8 @@ +/*jslint indent: 2, maxlen: 120, vars: true, white: true, plusplus: true, nonpropdel: true, nomen: true, sloppy: true */ +/*global require, fail, assertTrue */ + //////////////////////////////////////////////////////////////////////////////// -/// @brief test the foxx manager +/// @brief test the authentication /// /// @file /// @@ -25,6 +28,7 @@ /// @author Copyright 2013, triAGENS GmbH, Cologne, Germany //////////////////////////////////////////////////////////////////////////////// +(function () { var jsunity = require("jsunity"); var arango = require("org/arangodb").arango; var db = require("internal").db; @@ -241,9 +245,9 @@ function AuthSuite () { jsunity.run(AuthSuite); return jsunity.done(); +}()); // Local Variables: // mode: outline-minor // outline-regexp: "^\\(/// @brief\\|/// @addtogroup\\|// --SECTION--\\|/// @page\\|/// @}\\)" // End: - diff --git a/js/client/tests/shell-endpoints.js b/js/client/tests/shell-endpoints.js index 5662ff22e9..d4d0ad3b30 100644 --- a/js/client/tests/shell-endpoints.js +++ b/js/client/tests/shell-endpoints.js @@ -1,3 +1,6 @@ +/*jslint indent: 2, maxlen: 120, vars: true, white: true, plusplus: true, nonpropdel: true, nomen: true, sloppy: true */ +/*global require, fail, assertTrue, assertEqual */ + //////////////////////////////////////////////////////////////////////////////// /// @brief test the endpoints /// @@ -25,6 +28,8 @@ /// @author Copyright 2013, triAGENS GmbH, Cologne, Germany //////////////////////////////////////////////////////////////////////////////// +(function () { + var jsunity = require("jsunity"); var arangodb = require("org/arangodb"); var arango = arangodb.arango; @@ -166,7 +171,7 @@ function EndpointsSuite () { fail(); } catch (err1) { - assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err1.errorNum) + assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err1.errorNum); } try { @@ -175,7 +180,7 @@ function EndpointsSuite () { fail(); } catch (err2) { - assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err2.errorNum) + assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err2.errorNum); } try { @@ -184,7 +189,7 @@ function EndpointsSuite () { fail(); } catch (err3) { - assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err3.errorNum) + assertEqual(ERRORS.ERROR_BAD_PARAMETER.code, err3.errorNum); } }, @@ -257,7 +262,7 @@ function EndpointsSuite () { var base = 30000 + parseInt(Math.random() * 10000, 10); // create a few endpoints - db._configureEndpoint("tcp://127.0.0.1:" + (base + 0), [ ]); + db._configureEndpoint("tcp://127.0.0.1:" + (base), [ ]); db._configureEndpoint("tcp://127.0.0.1:" + (base + 1), [ "UnitTestsDatabase0" ]); db._configureEndpoint("tcp://127.0.0.1:" + (base + 2), [ "UnitTestsDatabase1" ]); db._configureEndpoint("tcp://127.0.0.1:" + (base + 3), [ "UnitTestsDatabase0", "UnitTestsDatabase1" ]); @@ -290,7 +295,7 @@ function EndpointsSuite () { [ "UnitTestsDatabase1", "UnitTestsDatabase1" ] ]; - test("tcp://127.0.0.1:" + (base + 0), endpoints); + test("tcp://127.0.0.1:" + (base), endpoints); endpoints = [ [ "", "UnitTestsDatabase0" ], @@ -354,7 +359,7 @@ function EndpointsSuite () { fail(); } catch (err2) { - assertEqual(ERRORS.ERROR_ARANGO_USE_SYSTEM_DATABASE.code, err2.errorNum) + assertEqual(ERRORS.ERROR_ARANGO_USE_SYSTEM_DATABASE.code, err2.errorNum); } // _configureEndpoint is forbidden @@ -364,7 +369,7 @@ function EndpointsSuite () { fail(); } catch (err3) { - assertEqual(ERRORS.ERROR_ARANGO_USE_SYSTEM_DATABASE.code, err3.errorNum) + assertEqual(ERRORS.ERROR_ARANGO_USE_SYSTEM_DATABASE.code, err3.errorNum); } } @@ -382,6 +387,7 @@ function EndpointsSuite () { jsunity.run(EndpointsSuite); return jsunity.done(); +}()); // Local Variables: // mode: outline-minor diff --git a/js/client/tests/shell-fm.js b/js/client/tests/shell-fm.js index 936796ce4b..4439525284 100644 --- a/js/client/tests/shell-fm.js +++ b/js/client/tests/shell-fm.js @@ -1,3 +1,6 @@ +/*jslint indent: 2, maxlen: 120, vars: true, white: true, plusplus: true, nonpropdel: true, nomen: true, sloppy: true */ +/*global require, fail, assertTrue, assertFalse, assertEqual, assertMatch, assertNotNull */ + //////////////////////////////////////////////////////////////////////////////// /// @brief test the foxx manager /// @@ -25,6 +28,7 @@ /// @author Copyright 2013, triAGENS GmbH, Cologne, Germany //////////////////////////////////////////////////////////////////////////////// +(function () { var jsunity = require("jsunity"); var fm = require("org/arangodb/foxx/manager"); var arango = require("org/arangodb").arango; @@ -119,8 +123,8 @@ function FoxxManagerSuite () { assertTrue(entry.hasOwnProperty("description")); assertTrue(entry.hasOwnProperty("version")); assertTrue(entry.hasOwnProperty("path")); + return; } - return; } fail(); @@ -185,7 +189,7 @@ function FoxxManagerSuite () { assertTrue(entry.hasOwnProperty("author")); assertTrue(entry.hasOwnProperty("versions")); - versions = entry.versions; + var version; for (version in entry.versions) { if (entry.versions.hasOwnProperty(version)) { @@ -302,7 +306,7 @@ function FoxxManagerSuite () { try { fm.uninstall("/itz"); } - catch (err) { + catch (err1) { } try { @@ -310,7 +314,7 @@ function FoxxManagerSuite () { fm.uninstall("/itz"); fail(); } - catch (err) { + catch (err2) { } }, @@ -361,7 +365,7 @@ function FoxxManagerSuite () { try { fm.uninstall("/itz"); } - catch (err) { + catch (err1) { } try { @@ -369,7 +373,7 @@ function FoxxManagerSuite () { fm.unmount("/itz"); fail(); } - catch (err) { + catch (err2) { } }, @@ -408,6 +412,8 @@ jsunity.run(FoxxManagerSuite); return jsunity.done(); +}()); + // Local Variables: // mode: outline-minor // outline-regexp: "^\\(/// @brief\\|/// @addtogroup\\|// --SECTION--\\|/// @page\\|/// @}\\)" diff --git a/js/common/tests/shell-collection-volatile.js b/js/common/tests/shell-collection-volatile.js index 6671f7986c..adbae63625 100644 --- a/js/common/tests/shell-collection-volatile.js +++ b/js/common/tests/shell-collection-volatile.js @@ -89,7 +89,7 @@ function CollectionVolatileSuite () { testCreationError : function () { try { // cannot set isVolatile and waitForSync at the same time - var c = internal.db._create(cn, { isVolatile : true, waitForSync : true }); + internal.db._create(cn, { isVolatile : true, waitForSync : true }); fail(); } catch (err) { diff --git a/js/common/tests/shell-collection.js b/js/common/tests/shell-collection.js index cf96a8ac0a..07b5f6ad60 100644 --- a/js/common/tests/shell-collection.js +++ b/js/common/tests/shell-collection.js @@ -870,7 +870,7 @@ function CollectionSuite () { db._drop(cn1); db._drop(cn2); var c1 = db._create(cn1); - var c2 = db._create(cn2); + db._create(cn2); try { c1.rename(cn2); @@ -1506,8 +1506,8 @@ function CollectionDbSuite () { db._drop(cn1); db._drop(cn2); - var c1 = db._createDocumentCollection(cn1); - var c2 = db._createEdgeCollection(cn2); + db._createDocumentCollection(cn1); + db._createEdgeCollection(cn2); var collections = db._collections(); for (var i in collections) { diff --git a/js/common/tests/shell-download.js b/js/common/tests/shell-download.js index f4f68bcc39..1c27818b72 100644 --- a/js/common/tests/shell-download.js +++ b/js/common/tests/shell-download.js @@ -133,7 +133,7 @@ function DownloadSuite () { //////////////////////////////////////////////////////////////////////////////// testGetErrorNoReturn : function () { - var result, response = internal.download(buildUrl("?foo=1&bar=baz&code=404"), undefined, { }, tempName ); + var response = internal.download(buildUrl("?foo=1&bar=baz&code=404"), undefined, { }, tempName ); assertEqual(404, response.code); @@ -287,7 +287,7 @@ function DownloadSuite () { //////////////////////////////////////////////////////////////////////////////// testHead : function () { - var result, response = internal.download(buildUrl(""), undefined, { method: "head" }); + var response = internal.download(buildUrl(""), undefined, { method: "head" }); assertEqual(200, response.code); diff --git a/js/common/tests/shell-fs.js b/js/common/tests/shell-fs.js index b65b6fcdd1..4d0d17e589 100644 --- a/js/common/tests/shell-fs.js +++ b/js/common/tests/shell-fs.js @@ -28,7 +28,6 @@ var jsunity = require("jsunity"); var fs = require("fs"); -var internal = require("internal"); // ----------------------------------------------------------------------------- // --SECTION-- filesystem diff --git a/js/common/tests/shell-graph-algorithms.js b/js/common/tests/shell-graph-algorithms.js index 086c75ae5a..07e9235a6d 100644 --- a/js/common/tests/shell-graph-algorithms.js +++ b/js/common/tests/shell-graph-algorithms.js @@ -32,8 +32,6 @@ var jsunity = require("jsunity"); var console = require("console"); -var Helper = require("org/arangodb/test-helper").Helper; - // ----------------------------------------------------------------------------- // --SECTION-- collection methods // ----------------------------------------------------------------------------- diff --git a/js/common/tests/shell-graph-measurement.js b/js/common/tests/shell-graph-measurement.js index 3430ee765f..588e715be0 100644 --- a/js/common/tests/shell-graph-measurement.js +++ b/js/common/tests/shell-graph-measurement.js @@ -37,7 +37,6 @@ //////////////////////////////////////////////////////////////////////////////// var jsunity = require("jsunity"), - Helper = require("org/arangodb/test-helper").Helper, console = require("console"); // ----------------------------------------------------------------------------- diff --git a/js/common/tests/shell-graph-traversal.js b/js/common/tests/shell-graph-traversal.js index 53ebc7df88..bf51659e56 100644 --- a/js/common/tests/shell-graph-traversal.js +++ b/js/common/tests/shell-graph-traversal.js @@ -75,10 +75,10 @@ function GraphTraversalSuite () { var v2 = g.addVertex("v2"); var v3 = g.addVertex("v3"); var v4 = g.addVertex("v4"); - var e1 = g.addEdge(v1, v2, "v1v2"); - var e3 = g.addEdge(v2, v3, "v2v3"); - var e4 = g.addEdge(v1, v4, "v1v4"); - var e5 = g.addEdge(v4, v3, "v4v3"); + g.addEdge(v1, v2, "v1v2"); + g.addEdge(v2, v3, "v2v3"); + g.addEdge(v1, v4, "v1v4"); + g.addEdge(v4, v3, "v4v3"); }, //////////////////////////////////////////////////////////////////////////////// diff --git a/js/common/tests/shell-hash-index.js b/js/common/tests/shell-hash-index.js index 987e69fb6e..e1dda1383b 100644 --- a/js/common/tests/shell-hash-index.js +++ b/js/common/tests/shell-hash-index.js @@ -30,7 +30,6 @@ var jsunity = require("jsunity"); var internal = require("internal"); -var console = require("console"); var errors = internal.errors; // ----------------------------------------------------------------------------- @@ -158,15 +157,15 @@ function HashIndexSuite() { var d1 = collection.save({ a : 1, b : 1 })._id; var d2 = collection.save({ a : 2, b : 1 })._id; - var d3 = collection.save({ a : 3, b : 1 })._id; - var d4 = collection.save({ a : 4, b : 1 })._id; - var d5 = collection.save({ a : 4, b : 2 })._id; + collection.save({ a : 3, b : 1 })._id; + collection.save({ a : 4, b : 1 })._id; + collection.save({ a : 4, b : 2 })._id; var d6 = collection.save({ a : 1, b : 1 })._id; var d7 = collection.save({ a : 1 })._id; var d8 = collection.save({ a : 1 })._id; - var d9 = collection.save({ a : null, b : 1 })._id; - var d10 = collection.save({ a : null, b : 1 })._id; + collection.save({ a : null, b : 1 })._id; + collection.save({ a : null, b : 1 })._id; var d11 = collection.save({ c : 1 })._id; var d12 = collection.save({ c : 1 })._id; @@ -214,9 +213,9 @@ function HashIndexSuite() { testReadDocumentsUnloaded : function () { var idx = collection.ensureHashIndex("a"); - var d1 = collection.save({ a : 1, b : 1 })._id; + collection.save({ a : 1, b : 1 })._id; var d2 = collection.save({ a : 2, b : 1 })._id; - var d3 = collection.save({ a : 3, b : 1 })._id; + collection.save({ a : 3, b : 1 })._id; collection.unload(); internal.wait(4); diff --git a/js/common/tests/shell-index-geo.js b/js/common/tests/shell-index-geo.js index d61fdb9153..5a91449693 100644 --- a/js/common/tests/shell-index-geo.js +++ b/js/common/tests/shell-index-geo.js @@ -549,7 +549,7 @@ function GeoIndexErrorHandlingSuite() { var d2 = collection.save({ loc : null }); var d3 = collection.save({ loc : [0] }); var d4 = collection.save({ loc : [ -100, -200 ] }); - var d5 = collection.save({ loc : [ -10, -20 ]}); + collection.save({ loc : [ -10, -20 ]}); assertEqual(1, collection.near(0,0).toArray().length); diff --git a/js/common/tests/shell-index.js b/js/common/tests/shell-index.js index 83f321a903..2e3d91ff29 100644 --- a/js/common/tests/shell-index.js +++ b/js/common/tests/shell-index.js @@ -175,7 +175,7 @@ function indexSuite() { testGetNonExistingIndexes : function () { [ "2444334000000", "9999999999999" ].forEach(function (id) { try { - var idx = collection.index(id); + collection.index(id); fail(); } catch (err) { diff --git a/js/common/tests/shell-statement.js b/js/common/tests/shell-statement.js index f12119630e..e06854b62e 100644 --- a/js/common/tests/shell-statement.js +++ b/js/common/tests/shell-statement.js @@ -73,7 +73,7 @@ function StatementSuite () { testConstructNoQuery : function () { try { - var st = new ArangoStatement(db); + new ArangoStatement(db); fail(); } catch (e) { @@ -396,8 +396,8 @@ function StatementSuite () { var st = new ArangoStatement(db, { query : "for u in [ 1 ] return @value" }); st.bind("list", [ 1, 2, 3 ]); try { - var result = st.execute(); - assertFalse(true); + st.execute(); + fail(); } catch (e) { assertEqual(1551, e.errorNum); @@ -413,7 +413,7 @@ function StatementSuite () { st.bind("value", 1); try { st.bind("value", 1); - assertFalse(true); + fail(); } catch (e) { } diff --git a/js/common/tests/shell-unique-constraint.js b/js/common/tests/shell-unique-constraint.js index 6067348552..0637fbefaf 100644 --- a/js/common/tests/shell-unique-constraint.js +++ b/js/common/tests/shell-unique-constraint.js @@ -162,10 +162,10 @@ function UniqueConstraintSuite() { assertEqual(true, idx.isNewlyCreated); var d1 = collection.save({ a : 1, b : 1 })._id; - var d2 = collection.save({ a : 2, b : 1 })._id; - var d3 = collection.save({ a : 3, b : 1 })._id; - var d4 = collection.save({ a : 4, b : 1 })._id; - var d5 = collection.save({ a : 4, b : 2 })._id; + collection.save({ a : 2, b : 1 })._id; + collection.save({ a : 3, b : 1 })._id; + collection.save({ a : 4, b : 1 })._id; + collection.save({ a : 4, b : 2 })._id; collection.save({ a : 1 }); collection.save({ a : 1 }); diff --git a/js/common/tests/shell-unload.js b/js/common/tests/shell-unload.js index 3a35176118..d70f99ed59 100644 --- a/js/common/tests/shell-unload.js +++ b/js/common/tests/shell-unload.js @@ -29,7 +29,6 @@ //////////////////////////////////////////////////////////////////////////////// var jsunity = require("jsunity"); -var arangodb = require("org/arangodb"); var internal = require("internal"); // ----------------------------------------------------------------------------- diff --git a/js/server/tests/ahuacatl-cross.js b/js/server/tests/ahuacatl-cross.js index 4f6b6ca6f2..9e5dccb6c7 100644 --- a/js/server/tests/ahuacatl-cross.js +++ b/js/server/tests/ahuacatl-cross.js @@ -134,8 +134,8 @@ function ahuacatlCrossCollection () { var d1 = vertex1.save({ _key: "test1", a: 1 }); var d2 = vertex1.save({ _key: "test2", a: 2 }); var d3 = vertex2.save({ _key: "test3", a: 3 }); - var e1 = edge.save(d1._id, d2._id, { }); - var e2 = edge.save(d2._id, d3._id, { }); + edge.save(d1._id, d2._id, { }); + edge.save(d2._id, d3._id, { }); var actual = getQueryResults("FOR t IN TRAVERSAL(" + vn1 + ", " + en + ", " + JSON.stringify(d1._id) + ", 'outbound', { }) RETURN t"); assertEqual(3, actual.length); @@ -153,8 +153,8 @@ function ahuacatlCrossCollection () { var d1 = vertex1.save({ _key: "test1", a: 1 }); var d2 = vertex2.save({ _key: "test2", a: 2 }); var d3 = vertex2.save({ _key: "test3", a: 3 }); - var e1 = edge.save(d1._id, d2._id, { }); - var e2 = edge.save(d2._id, d3._id, { }); + edge.save(d1._id, d2._id, { }); + edge.save(d2._id, d3._id, { }); var actual = getQueryResults("FOR t IN TRAVERSAL(" + vn1 + ", " + en + ", " + JSON.stringify(d2._id) + ", 'outbound', { }) RETURN t"); assertEqual(2, actual.length); diff --git a/js/server/tests/ahuacatl-functions.js b/js/server/tests/ahuacatl-functions.js index 78928f3467..500443b056 100644 --- a/js/server/tests/ahuacatl-functions.js +++ b/js/server/tests/ahuacatl-functions.js @@ -1179,7 +1179,7 @@ function ahuacatlFunctionsTestSuite () { //////////////////////////////////////////////////////////////////////////////// testKeep : function () { - var actual, expected; + var actual; actual = getQueryResults("FOR i IN [ { }, { foo: 1, bar: 2, moo: 3, goof: 4, bang: 5, meow: 6 }, { foo: 0, goof: 1, meow: 2 }, { foo: null }, { foo: true }, { goof: null } ] RETURN KEEP(i, 'foo', 'bar', 'baz', [ 'meow' ], [ ])"); assertEqual([ { }, { bar: 2, foo: 1, meow: 6 }, { foo: 0, meow: 2 }, { foo: null }, { foo: true }, { } ], actual); @@ -1993,7 +1993,7 @@ function ahuacatlFunctionsTestSuite () { actual = getQueryResults("RETURN DOCUMENT(CONCAT(\"" + cn + "\", \"bart\"))"); assertEqual([ null ], actual); - var d3 = cx.save({ _key: "foo", value: "bar" }); + cx.save({ _key: "foo", value: "bar" }); expected = [ { value: "bar" } ]; actual = getQueryResults("RETURN DOCUMENT(CONCAT(\"" + cn + "\", \"foo\"))"); assertEqual([ null ], actual); @@ -2112,7 +2112,7 @@ function ahuacatlFunctionsTestSuite () { var cn = "UnitTestsAhuacatlFunctions"; internal.db._drop(cn); - var cx = internal.db._create(cn); + internal.db._create(cn); var expected, actual; diff --git a/js/server/tests/ahuacatl-hash.js b/js/server/tests/ahuacatl-hash.js index b54143976f..babc8b13e8 100644 --- a/js/server/tests/ahuacatl-hash.js +++ b/js/server/tests/ahuacatl-hash.js @@ -30,7 +30,6 @@ var jsunity = require("jsunity"); var helper = require("org/arangodb/aql-helper"); var getQueryResults = helper.getQueryResults; var getQueryExplanation = helper.getQueryExplanation; -var errors = internal.errors; //////////////////////////////////////////////////////////////////////////////// /// @brief test suite diff --git a/js/server/tests/ahuacatl-skiplist.js b/js/server/tests/ahuacatl-skiplist.js index 018682226c..6a10e87168 100644 --- a/js/server/tests/ahuacatl-skiplist.js +++ b/js/server/tests/ahuacatl-skiplist.js @@ -36,7 +36,6 @@ var getQueryExplanation = helper.getQueryExplanation; //////////////////////////////////////////////////////////////////////////////// function ahuacatlSkiplistTestSuite () { - var errors = internal.errors; var skiplist; return { diff --git a/js/server/tests/compaction.js b/js/server/tests/compaction.js index 71c0024c51..eeab87c9aa 100644 --- a/js/server/tests/compaction.js +++ b/js/server/tests/compaction.js @@ -37,8 +37,6 @@ var internal = require("internal"); //////////////////////////////////////////////////////////////////////////////// function CompactionSuite () { - var ERRORS = require("internal").errors; - return { //////////////////////////////////////////////////////////////////////////////// diff --git a/js/server/tests/replication-data.js b/js/server/tests/replication-data.js index 4e06bdef15..2a671970cf 100644 --- a/js/server/tests/replication-data.js +++ b/js/server/tests/replication-data.js @@ -81,7 +81,6 @@ function ReplicationSuite () { var masterState = replication.logger.state(); assertTrue(masterState.state.running); - var lastTick = masterState.state.lastLogTick; replication.logger.stop(); masterState = replication.logger.state(); @@ -183,7 +182,7 @@ function ReplicationSuite () { }; try { - replication.applier.properties(); + replication.applier.properties(configuration); } catch (err) { require("internal").print(err); @@ -203,7 +202,7 @@ function ReplicationSuite () { }; try { - replication.applier.properties(); + replication.applier.properties(configuration); } catch (err) { assertEqual(errors.ERROR_HTTP_UNAUTHORIZED.code, err.errorNum); @@ -222,7 +221,7 @@ function ReplicationSuite () { }; try { - replication.applier.properties(); + replication.applier.properties(configuration); } catch (err) { assertEqual(errors.ERROR_HTTP_UNAUTHORIZED.code, err.errorNum); @@ -512,7 +511,7 @@ function ReplicationSuite () { testTransaction3 : function () { compare( function (state) { - var c = db._create(cn), i; + db._create(cn); db._executeTransaction({ collections: { @@ -546,7 +545,7 @@ function ReplicationSuite () { testTransaction4 : function () { compare( function (state) { - var c = db._create(cn), i; + db._create(cn); db._executeTransaction({ collections: { @@ -592,7 +591,7 @@ function ReplicationSuite () { testTransactionBig : function () { compare( function (state) { - var c = db._create(cn), i; + db._create(cn); db._executeTransaction({ collections: { diff --git a/js/server/tests/routing.js b/js/server/tests/routing.js index 52c607f27f..77c79e83f9 100644 --- a/js/server/tests/routing.js +++ b/js/server/tests/routing.js @@ -38,7 +38,6 @@ var jsunity = require("jsunity"); //////////////////////////////////////////////////////////////////////////////// function routingSuiteSingle () { - var errors = internal.errors; var cn = "_routing"; return { diff --git a/js/server/tests/shell-any.js b/js/server/tests/shell-any.js index ed54fdfd8c..44c976fd48 100644 --- a/js/server/tests/shell-any.js +++ b/js/server/tests/shell-any.js @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////////////////////////// -/// @brief test the collection interface +/// @brief test the random document selector /// /// @file /// @@ -28,7 +28,6 @@ var jsunity = require("jsunity"); var arangodb = require("org/arangodb"); -var internal = require("internal"); var db = arangodb.db; // ----------------------------------------------------------------------------- diff --git a/js/server/tests/shell-bitarray-index.js b/js/server/tests/shell-bitarray-index.js index 9ddcd22e07..628bcbee0f 100644 --- a/js/server/tests/shell-bitarray-index.js +++ b/js/server/tests/shell-bitarray-index.js @@ -35,7 +35,6 @@ var jsunity = require("jsunity"); var internal = require("internal"); -var console = require("console"); // ----------------------------------------------------------------------------- // --SECTION-- basic methods @@ -46,7 +45,6 @@ var console = require("console"); //////////////////////////////////////////////////////////////////////////////// function BitarrayIndexSuite() { - var ERRORS = internal.errors; var cn = "UnitTestsCollectionBitarray"; var collection = null; diff --git a/js/server/tests/shell-database.js b/js/server/tests/shell-database.js index a0a0dcbddb..ad9dbe4fde 100644 --- a/js/server/tests/shell-database.js +++ b/js/server/tests/shell-database.js @@ -27,8 +27,6 @@ var jsunity = require("jsunity"); var internal = require("internal"); -var arangodb = require("org/arangodb"); -var ERRORS = arangodb.errors; // ----------------------------------------------------------------------------- // --SECTION-- database methods diff --git a/js/server/tests/shell-foxx-base-middleware.js b/js/server/tests/shell-foxx-base-middleware.js index a28ae71a3d..019c4888a6 100644 --- a/js/server/tests/shell-foxx-base-middleware.js +++ b/js/server/tests/shell-foxx-base-middleware.js @@ -1,11 +1,9 @@ require("internal").flushModuleCache(); -var jsunity = require("jsunity"), - arangodb = require("org/arangodb"), - db = arangodb.db; +var jsunity = require("jsunity"); function BaseMiddlewareSpec () { - var BaseMiddleware, request, response, options, next; + var request, response, options, next; return { setUp: function () { diff --git a/js/server/tests/shell-foxx-preprocessor.js b/js/server/tests/shell-foxx-preprocessor.js index 812c001fa2..c3a0d7dfbd 100644 --- a/js/server/tests/shell-foxx-preprocessor.js +++ b/js/server/tests/shell-foxx-preprocessor.js @@ -51,7 +51,7 @@ function PreprocessSpec () { // Low level Spec Suite for the Transform prototype function PreprocessorSpec () { - var i, result, testFileWithSingleJSDoc, testFileWithJSDocAndMultiline, processedLineOne; + var i, testFileWithSingleJSDoc, testFileWithJSDocAndMultiline, processedLineOne; return { setUp: function () { diff --git a/js/server/tests/shell-foxx.js b/js/server/tests/shell-foxx.js index f41bcd2e2b..af9972371c 100644 --- a/js/server/tests/shell-foxx.js +++ b/js/server/tests/shell-foxx.js @@ -7,7 +7,6 @@ var jsunity = require("jsunity"), stub_and_mock = require("org/arangodb/stub_and_mock"), stub = stub_and_mock.stub, allow = stub_and_mock.allow, - expect = stub_and_mock.expect, mockConstructor = stub_and_mock.mockConstructor; fakeContext = { @@ -343,9 +342,7 @@ function DocumentationAndConstraintsSpec () { }, testAddBodyParam: function () { - var determinedName, - determinedType, - paramName = stub(), + var paramName = stub(), description = stub(), ModelPrototype = stub(), jsonSchema = { id: 'a', required: [], properties: {} }; @@ -366,9 +363,7 @@ function DocumentationAndConstraintsSpec () { }, testDefineBodyParamAddsJSONSchemaToModels: function () { - var determinedName, - determinedType, - paramName = stub(), + var paramName = stub(), description = stub(), ModelPrototype = stub(), jsonSchema = { id: 'a', required: [], properties: {} }; diff --git a/js/server/tests/shell-production.js b/js/server/tests/shell-production.js index 301318fa0c..fabb9d0166 100644 --- a/js/server/tests/shell-production.js +++ b/js/server/tests/shell-production.js @@ -25,7 +25,6 @@ /// @author Copyright 2013, triAGENS GmbH, Cologne, Germany //////////////////////////////////////////////////////////////////////////////// -var console = require("console"); var internal = require("internal"); var jsunity = require("jsunity"); diff --git a/js/server/tests/shell-skiplist-correctness.js b/js/server/tests/shell-skiplist-correctness.js index 4c098155f7..1c5809523b 100644 --- a/js/server/tests/shell-skiplist-correctness.js +++ b/js/server/tests/shell-skiplist-correctness.js @@ -30,8 +30,6 @@ var jsunity = require("jsunity"); var internal = require("internal"); -var console = require("console"); -var errors = internal.errors; // ----------------------------------------------------------------------------- // --SECTION-- basic methods @@ -42,7 +40,6 @@ var errors = internal.errors; //////////////////////////////////////////////////////////////////////////////// function SkipListCorrSuite() { - var ERRORS = internal.errors; var cn = "UnitTestsCollectionSkiplistCorr"; var coll = null; var helper = require("org/arangodb/aql-helper"); diff --git a/js/server/tests/shell-skiplist-index.js b/js/server/tests/shell-skiplist-index.js index f7faf228cf..88f13741fb 100644 --- a/js/server/tests/shell-skiplist-index.js +++ b/js/server/tests/shell-skiplist-index.js @@ -30,8 +30,6 @@ var jsunity = require("jsunity"); var internal = require("internal"); -var console = require("console"); -var errors = internal.errors; // ----------------------------------------------------------------------------- // --SECTION-- basic methods @@ -42,7 +40,6 @@ var errors = internal.errors; //////////////////////////////////////////////////////////////////////////////// function SkipListSuite() { - var ERRORS = internal.errors; var cn = "UnitTestsCollectionSkiplist"; var collection = null; diff --git a/js/server/tests/shell-skiplist-rm-performance.js b/js/server/tests/shell-skiplist-rm-performance.js index bdbc83e5e6..3f55a16d64 100644 --- a/js/server/tests/shell-skiplist-rm-performance.js +++ b/js/server/tests/shell-skiplist-rm-performance.js @@ -30,8 +30,6 @@ var jsunity = require("jsunity"); var internal = require("internal"); -var console = require("console"); -var errors = internal.errors; // ----------------------------------------------------------------------------- // --SECTION-- basic methods @@ -42,7 +40,6 @@ var errors = internal.errors; //////////////////////////////////////////////////////////////////////////////// function SkipListPerfSuite() { - var ERRORS = internal.errors; var cn = "UnitTestsCollectionSkiplistPerf"; var collection = null; diff --git a/js/server/tests/transactions.js b/js/server/tests/transactions.js index cfa1ab5427..e7681919ba 100644 --- a/js/server/tests/transactions.js +++ b/js/server/tests/transactions.js @@ -151,8 +151,6 @@ function transactionInvocationSuite () { //////////////////////////////////////////////////////////////////////////////// testReturnValues : function () { - var result; - var tests = [ { expected: 1, trx: { collections: { }, action: function () { return 1; } } }, { expected: undefined, trx: { collections: { }, action: function () { } } }, @@ -2850,8 +2848,6 @@ function transactionCountSuite () { write: [ cn1 ] }, action : function () { - var d1; - c1.save({ _key: "baz" }); assertEqual(3, c1.count()); @@ -2883,8 +2879,6 @@ function transactionCountSuite () { write: [ cn1 ] }, action : function () { - var d1; - c1.save({ _key: "baz" }); assertEqual(3, c1.count()); From 1e21d3750fa6214700a6489e91d016da221d6e9c Mon Sep 17 00:00:00 2001 From: Michael Hackstein Date: Sat, 1 Feb 2014 09:47:19 +0100 Subject: [PATCH 09/29] Fixed tests for graph previewer --- .../graphViewer/specGraphViewer/graphViewerPreviewSpec.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/js/apps/system/aardvark/test/specs/graphViewer/specGraphViewer/graphViewerPreviewSpec.js b/js/apps/system/aardvark/test/specs/graphViewer/specGraphViewer/graphViewerPreviewSpec.js index 6ead5d4339..ffc2a3d37d 100644 --- a/js/apps/system/aardvark/test/specs/graphViewer/specGraphViewer/graphViewerPreviewSpec.js +++ b/js/apps/system/aardvark/test/specs/graphViewer/specGraphViewer/graphViewerPreviewSpec.js @@ -170,7 +170,8 @@ jasmine.any(Object), { label: "label", - color: jasmine.any(Object) + color: jasmine.any(Object), + shape: jasmine.any(Object) } ); }); From d9bc39c5762259943819da4af82566dd06d7434a Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Sat, 1 Feb 2014 12:08:08 +0100 Subject: [PATCH 10/29] don't fail if body response is undefined --- js/server/modules/org/arangodb/foxx/base_middleware.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/js/server/modules/org/arangodb/foxx/base_middleware.js b/js/server/modules/org/arangodb/foxx/base_middleware.js index 996bc8d6e6..1ad1af34e2 100644 --- a/js/server/modules/org/arangodb/foxx/base_middleware.js +++ b/js/server/modules/org/arangodb/foxx/base_middleware.js @@ -1,4 +1,4 @@ -/*jslint indent: 2, nomen: true, maxlen: 120 */ +/*jslint indent: 2, nomen: true, maxlen: 120, vars: true */ /*global module, require, exports */ //////////////////////////////////////////////////////////////////////////////// @@ -209,11 +209,15 @@ BaseMiddleware = function () { if (trace) { if (response.hasOwnProperty("body")) { + var bodyLength = 0; + if (response.body !== undefined) { + bodyLength = parseInt(response.body.length, 10); + } console.log("%s, outgoing response with status %s of type %s, body length: %d", options.mount, response.responseCode, response.contentType, - parseInt(response.body.length, 10)); + bodyLength); } else if (response.hasOwnProperty("bodyFromFile")) { console.log("%s, outgoing response with status %s of type %s, body file: %s", options.mount, From 3db9bbe0ccb350f80c5d64984c4fc3a7679e5a8c Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Sat, 1 Feb 2014 17:02:42 +0100 Subject: [PATCH 11/29] evil mimetype detection attempt --- js/apps/system/aardvark/aardvark.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/js/apps/system/aardvark/aardvark.js b/js/apps/system/aardvark/aardvark.js index c09d46c75a..60b0f8ba9f 100644 --- a/js/apps/system/aardvark/aardvark.js +++ b/js/apps/system/aardvark/aardvark.js @@ -107,6 +107,12 @@ controller.put("/foxxes/:key", function (req, res) { controller.get("/foxxes/thumbnail/:app", function (req, res) { res.transformations = [ "base64decode" ]; res.body = foxxes.thumbnail(req.params("app")); + + // evil mimetype detection attempt... + var start = require("internal").base64Decode(res.body.substr(0, 8)); + if (start.indexOf("PNG") !== -1) { + res.contentType = "image/png"; + } }).pathParam("app", { description: "The appname which is used to identify the foxx in the list of available foxxes.", type: "string", From 7d29bfcf6afae867df42c99cf2d2d584ad3934a4 Mon Sep 17 00:00:00 2001 From: Claudius Weinberger Date: Sat, 1 Feb 2014 17:26:13 +0100 Subject: [PATCH 12/29] some ui improvements --- .../system/aardvark/frontend/css/buttons.css | 35 ++++++++++++------- .../frontend/css/collectionsItemView.css | 20 +++++------ .../aardvark/frontend/css/collectionsView.css | 7 ++-- .../aardvark/frontend/css/dashboardView.css | 18 +++++++--- .../system/aardvark/frontend/css/general.css | 2 +- .../aardvark/frontend/css/headerBar.css | 2 +- .../system/aardvark/frontend/css/layout.css | 4 +-- .../system/aardvark/frontend/css/nv.d3.css | 15 ++++---- .../js/templates/collectionsItemView.ejs | 2 +- .../frontend/js/views/dashboardView.js | 28 +++++++++------ 10 files changed, 79 insertions(+), 54 deletions(-) diff --git a/js/apps/system/aardvark/frontend/css/buttons.css b/js/apps/system/aardvark/frontend/css/buttons.css index fcd4a159d6..fefef5f4bd 100644 --- a/js/apps/system/aardvark/frontend/css/buttons.css +++ b/js/apps/system/aardvark/frontend/css/buttons.css @@ -40,21 +40,25 @@ ul.headerButtonList > li { a.headerButton { float: left; - margin-top: 0px; + margin-top: 2px; margin-left: 5px; - margin-right: 5px; - min-height: 19px; + margin-right: 3px; + min-height: 15px; border-radius: 3px; position: relative; box-shadow: none; - background: #8AA051 !important; - /* - background: #8f8d8c !important; - */ - color:#FFFFFF !important; - height:20px; - width:13px; - padding: 5px 11px 2px 9px; + background: #ddd; + color: #555; + height: 17px; + width: 9px; + padding: 4px 9px 2px 9px; + border: 1px solid #222; +} + +a.headerButton:hover { + background: #fff; + color: #000; + cursor: pointer; } a.paginationButton, ul.arangoPagination a { @@ -63,11 +67,16 @@ a.paginationButton, ul.arangoPagination a { /* better look of some icons */ a.headerButton .icon_arangodb_filter { - top: 1px !important; + top: 3px !important; } a.headerButton .icon_arangodb_import { - top: -1px !important; + top: 1px !important; +} + +a.headerButton .icon_arangodb_checklist { + top: 3px !important; + right: 5px; } a.headerButton .icon_arangodb_arrowleft, diff --git a/js/apps/system/aardvark/frontend/css/collectionsItemView.css b/js/apps/system/aardvark/frontend/css/collectionsItemView.css index 23be9f0c71..e304694452 100644 --- a/js/apps/system/aardvark/frontend/css/collectionsItemView.css +++ b/js/apps/system/aardvark/frontend/css/collectionsItemView.css @@ -16,7 +16,8 @@ .span3 h5 { font-family: 'Open Sans', sans-serif !important; - font-weight: 500; + font-weight: 300; + font-size: 12px; white-space: nowrap !important; overflow: hidden !important; text-overflow: ellipsis !important; @@ -42,29 +43,27 @@ .span3 .ICON { position: absolute; + right: 0px; margin-top: 5px; margin-right: 5px; opacity: 0.5; cursor: pointer; - font-size: 25px; + font-size: 18px; } + +.span3 .ICON:hover { + opacity: 1.0; +} + .span3 .glyphicon-edit { margin-top: 4px !important; font-size: 19.5px; } -.span3 .ICON{ - right: 0px; -} - .span3 .spanInfo { right: 25px; } -.span3 .ICON:hover { - opacity: 1.0; -} - .spanDisabled { right: 25px !important; opacity: 0.2 !important; @@ -81,4 +80,5 @@ .badge, .label, .btn { text-shadow: none !important; + font-size: 11px; } diff --git a/js/apps/system/aardvark/frontend/css/collectionsView.css b/js/apps/system/aardvark/frontend/css/collectionsView.css index 3f33451559..3f109864ba 100644 --- a/js/apps/system/aardvark/frontend/css/collectionsView.css +++ b/js/apps/system/aardvark/frontend/css/collectionsView.css @@ -9,7 +9,7 @@ #newCollection { position: relative; margin-left: 22px; - font-size: 28px; + font-size: 22px; margin-top: -5px; margin-right: 10px; } @@ -35,7 +35,8 @@ } .thumbnails li { - background-color: #f4f3f3; + background-color: rgba(0, 0, 0, 0.05); + /* #f4f3f3; */ } .thumbnails a.add { @@ -48,7 +49,7 @@ .thumbnails .icon { padding-right:5px; padding-left: 5px; - padding-top: 5px; + padding-top: 10px; cursor: pointer; } diff --git a/js/apps/system/aardvark/frontend/css/dashboardView.css b/js/apps/system/aardvark/frontend/css/dashboardView.css index 6434e3f5e2..a5ce2a705e 100644 --- a/js/apps/system/aardvark/frontend/css/dashboardView.css +++ b/js/apps/system/aardvark/frontend/css/dashboardView.css @@ -115,11 +115,11 @@ } .nv-axislabel { - margin-left: 20px; + margin-left: 0px; } .nv-axisMaxMin > text { - font: 10px sans-serif; + /* font: 10px 'Open Sans', sans-serif; */ } .svgCollections { @@ -128,7 +128,7 @@ } .svgClass { - height: 155px; + height: 142px; width: 300px; } @@ -166,7 +166,7 @@ li:hover h6, li.hover h6 { } .boxHeader h6 { - opacity: 0.8; + /* opacity: 0.8; */ padding-top: 0 !important; color: black; margin-left: 5px; @@ -207,7 +207,7 @@ li:hover h6, li.hover h6 { } .nv-x .nv-axislabel { - display: none; + display: none; } .nv-point { @@ -525,6 +525,12 @@ li:hover h6, li.hover h6 { font-weight: 400; } +#dbThumbnailsIn .dashboardH6 { + opacity: 1.0 !important; + font-size: 12px; + font-weight: 300; +} + @media screen and (-webkit-min-device-pixel-ratio:0) { .svgClass{margin-top: 10px !important;} .statSingleClient{margin-top: 10.5px !important;} @@ -532,8 +538,10 @@ li:hover h6, li.hover h6 { } .nvd3 .nv-axis .nv-axisMaxMin text { + /* font-weight: 400; font-size: 12px !important; + */ } .nvd3 .nv-wrap .nv-axis:last-child { diff --git a/js/apps/system/aardvark/frontend/css/general.css b/js/apps/system/aardvark/frontend/css/general.css index f922449d62..42de18918c 100644 --- a/js/apps/system/aardvark/frontend/css/general.css +++ b/js/apps/system/aardvark/frontend/css/general.css @@ -1,6 +1,6 @@ /* Sets the default values shared for content views*/ #content { - background-color: rgba(0, 0, 0, 0.15); + background-color: rgba(0, 0, 0, 0.0675); margin-top: 25px; margin-bottom: 33px; min-height: 80px; diff --git a/js/apps/system/aardvark/frontend/css/headerBar.css b/js/apps/system/aardvark/frontend/css/headerBar.css index ef3532f0f3..c4d18af83b 100644 --- a/js/apps/system/aardvark/frontend/css/headerBar.css +++ b/js/apps/system/aardvark/frontend/css/headerBar.css @@ -4,7 +4,7 @@ div.headerBar { margin-top: 5px; margin-left: 5px; margin-right: 5px; - margin-bottom: 0px; + margin-bottom: 5px; background-color: #686766; color: #FFFFFF; height: 36px; diff --git a/js/apps/system/aardvark/frontend/css/layout.css b/js/apps/system/aardvark/frontend/css/layout.css index 09bb396373..b2ecf7d4ec 100644 --- a/js/apps/system/aardvark/frontend/css/layout.css +++ b/js/apps/system/aardvark/frontend/css/layout.css @@ -259,9 +259,9 @@ button { } li a [class^="icon_arangodb"], li a [class*=" icon_arangodb"] { - font-size: 22px; + font-size: 18px; position: absolute; - right: 5px; + right: 4px; top: 2px; } diff --git a/js/apps/system/aardvark/frontend/css/nv.d3.css b/js/apps/system/aardvark/frontend/css/nv.d3.css index 560d9d352e..1de05ad68d 100644 --- a/js/apps/system/aardvark/frontend/css/nv.d3.css +++ b/js/apps/system/aardvark/frontend/css/nv.d3.css @@ -93,11 +93,15 @@ svg { svg text { - font: normal 12px Arial; + font-weight: 300; + font-size: 10px; + font-family: 'Open Sans', sans-serif; } svg .title { - font: bold 14px Arial; + font-weight: 400; + font-size: 14px; + font-family: 'Open Sans', sans-serif; } .nvd3 .nv-background { @@ -170,7 +174,6 @@ svg .title { } .nvd3 .nv-axis .nv-axisMaxMin text { - font-weight: bold; } .nvd3 .x .nv-axis .nv-axisMaxMin text, @@ -179,8 +182,6 @@ svg .title { text-anchor: middle } - - /********** * Brush */ @@ -278,7 +279,7 @@ svg .title { } .nvd3.nv-pie .hover path { - fill-opacity: .7; + fill-opacity: .8; /* stroke-width: 6px; stroke-opacity: 1; @@ -296,7 +297,7 @@ svg .title { .nvd3 .nv-groups path.nv-line { fill: none; - stroke-width: 2.5px; + stroke-width: 1.25px; /* stroke-linecap: round; shape-rendering: geometricPrecision; diff --git a/js/apps/system/aardvark/frontend/js/templates/collectionsItemView.ejs b/js/apps/system/aardvark/frontend/js/templates/collectionsItemView.ejs index 3d82fda52c..a2802c18b3 100644 --- a/js/apps/system/aardvark/frontend/js/templates/collectionsItemView.ejs +++ b/js/apps/system/aardvark/frontend/js/templates/collectionsItemView.ejs @@ -4,7 +4,7 @@
- +
<%= attributes.status %>
diff --git a/js/apps/system/aardvark/frontend/js/views/dashboardView.js b/js/apps/system/aardvark/frontend/js/views/dashboardView.js index 8c7c2671fe..340aff5005 100644 --- a/js/apps/system/aardvark/frontend/js/views/dashboardView.js +++ b/js/apps/system/aardvark/frontend/js/views/dashboardView.js @@ -505,32 +505,38 @@ if (self.detailGraph === identifier) { d3.select("#detailGraphChart svg") - .call(chart) - .datum([{ - values: self.seriesData[identifier].values, - key: identifier, - color: "#8AA051" - }]) - .transition().duration(500); + .call(chart) + .datum([{ + values: self.seriesData[identifier].values, + key: identifier, + color: "#8aa14c" + }]) + .attr("stroke-width", "0.5") + .transition().duration(500); } - + //disable ticks/label for small charts d3.select("#" + identifier + "Chart svg") .call(chart) .datum([ { values: self.seriesData[identifier].values, key: identifier, - color: "#8AA051" } + color: "#8aa14c" } ]) - .transition().duration(500); + .attr("stroke-width", "0.5") + .transition().duration(500); + + // Claudius: hide y-axis labels for small charts + $('#' + identifier + ' .nv-y.nv-axis text').attr('display', 'none'); }); this.loadGraphState(); - + // #8AA051 //fix position for last x-value label in detailgraph $('.nv-x.nv-axis .nvd3.nv-wrap.nv-axis:last-child text').attr('x','-5'); //fix position of small graphs $('.svgClass .nv-lineChart').attr('transform','translate(5,5)'); + }, calculateSeries: function (flush) { From f335999168df65c078124a70ee7db99c4d0a8286 Mon Sep 17 00:00:00 2001 From: Frank Celler Date: Sat, 1 Feb 2014 22:53:48 +0100 Subject: [PATCH 13/29] new engine --- etc/relative/arangod.conf | 1 + 1 file changed, 1 insertion(+) diff --git a/etc/relative/arangod.conf b/etc/relative/arangod.conf index 374c49c930..ab50384b13 100644 --- a/etc/relative/arangod.conf +++ b/etc/relative/arangod.conf @@ -14,6 +14,7 @@ threads = 3 [javascript] startup-directory = ./js app-path = ./js/apps +dev-app-path = ./js/devs [ruby] action-directory = ./mr/actions/system From 8ff6dc555560735ff0c3b4151042b0f31371a613 Mon Sep 17 00:00:00 2001 From: Frank Celler Date: Sat, 1 Feb 2014 22:55:06 +0100 Subject: [PATCH 14/29] new engine --- etc/relative/arangod.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/etc/relative/arangod.conf b/etc/relative/arangod.conf index ab50384b13..374c49c930 100644 --- a/etc/relative/arangod.conf +++ b/etc/relative/arangod.conf @@ -14,7 +14,6 @@ threads = 3 [javascript] startup-directory = ./js app-path = ./js/apps -dev-app-path = ./js/devs [ruby] action-directory = ./mr/actions/system From 545742a5fd9e1bfe0cf10a79dfe13be15b65c776 Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Sun, 2 Feb 2014 00:22:07 +0100 Subject: [PATCH 15/29] added option `--server.disable-authentication-unix-sockets` with this option, authentication can be disabled for all requests coming in via UNIX domain sockets, enabling clients located on the same host as the ArangoDB server to connect without authentication. Other connections (e.g. TCP/IP) are not affected by this option. The default value for this option is `false`. Note: this option is only supported on platforms that support Unix domain sockets. --- CHANGELOG | 11 +++++++++++ Documentation/UserManual/CommandLine.md | 4 ++++ Documentation/UserManual/CommandLineTOC.md | 1 + arangod/RestServer/ArangoServer.cpp | 19 ++++++++++++------- arangod/RestServer/ArangoServer.h | 20 ++++++++++++++++++++ arangod/RestServer/VocbaseContext.cpp | 13 +++++++++++++ arangod/V8Server/v8-vocbase.cpp | 5 +++++ arangod/VocBase/vocbase-defaults.c | 22 +++++++++++++++------- arangod/VocBase/vocbase-defaults.h | 1 + lib/Rest/ConnectionInfo.h | 5 +++++ lib/Scheduler/ListenTask.cpp | 1 + 11 files changed, 88 insertions(+), 14 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 1512382625..c9596a8c20 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,17 @@ v1.5.0 (XXXX-XX-XX) ------------------- +* added command-line option `--server.disable-authentication-unix-sockets` + + with this option, authentication can be disabled for all requests coming + in via UNIX domain sockets, enabling clients located on the same host as + the ArangoDB server to connect without authentication. + Other connections (e.g. TCP/IP) are not affected by this option. + + The default value for this option is `false`. + Note: this option is only supported on platforms that support Unix domain + sockets. + * fail if invalid `strategy`, `order` or `itemOrder` attribute values are passed to the AQL TRAVERSAL function. Omitting these attributes is not considered an error, but specifying an invalid value for any diff --git a/Documentation/UserManual/CommandLine.md b/Documentation/UserManual/CommandLine.md index 5ea12fe068..cd9fbaf31c 100644 --- a/Documentation/UserManual/CommandLine.md +++ b/Documentation/UserManual/CommandLine.md @@ -107,6 +107,10 @@ Command-Line Options for arangod {#CommandLineArangod} @anchor CommandLineArangoDisableAuthentication @copydetails triagens::arango::ArangoServer::_disableAuthentication +@CLEARPAGE +@anchor CommandLineArangoDisableAuthenticationUnixSockets +@copydetails triagens::arango::ArangoServer::_disableAuthenticationUnixSockets + @CLEARPAGE @anchor CommandLineArangoAuthenticateSystemOnly @copydetails triagens::arango::ArangoServer::_authenticateSystemOnly diff --git a/Documentation/UserManual/CommandLineTOC.md b/Documentation/UserManual/CommandLineTOC.md index 7e6041409d..d42996c37d 100644 --- a/Documentation/UserManual/CommandLineTOC.md +++ b/Documentation/UserManual/CommandLineTOC.md @@ -18,6 +18,7 @@ TOC {#CommandLineTOC} - @ref CommandLineConsole "console" - @ref CommandLineArangoEndpoint "server.endpoint" - @ref CommandLineArangoDisableAuthentication "server.disable-authentication" + - @ref CommandLineArangoDisableAuthenticationUnixSockets "server.disable-authentication-unix-sockets" - @ref CommandLineArangoAuthenticateSystemOnly "server.authenticate-system-only" - @ref CommandLineArangoKeepAliveTimeout "server.keep-alive-timeout" - @ref CommandLineArangoDefaultApiCompatibility "server.default-api-compatibility" diff --git a/arangod/RestServer/ArangoServer.cpp b/arangod/RestServer/ArangoServer.cpp index e6778cc4e9..296e5291e4 100644 --- a/arangod/RestServer/ArangoServer.cpp +++ b/arangod/RestServer/ArangoServer.cpp @@ -265,6 +265,7 @@ ArangoServer::ArangoServer (int argc, char** argv) _applicationV8(0), _authenticateSystemOnly(false), _disableAuthentication(false), + _disableAuthenticationUnixSockets(false), _dispatcherThreads(8), _dispatcherQueueSize(8192), _databasePath(), @@ -509,6 +510,9 @@ void ArangoServer::buildApplicationServer () { additional[ApplicationServer::OPTIONS_SERVER + ":help-admin"] ("server.authenticate-system-only", &_authenticateSystemOnly, "use HTTP authentication only for requests to /_api and /_admin") ("server.disable-authentication", &_disableAuthentication, "disable authentication for ALL client requests") +#ifdef TRI_HAVE_LINUX_SOCKETS + ("server.disable-authentication-unix-sockets", &_disableAuthenticationUnixSockets, "disable authentication for requests via UNIX domain sockets") +#endif ("server.disable-replication-logger", &_disableReplicationLogger, "start with replication logger turned off") ("server.disable-replication-applier", &_disableReplicationApplier, "start with replication applier turned off") ; @@ -1245,13 +1249,14 @@ void ArangoServer::openDatabases () { TRI_vocbase_defaults_t defaults; // override with command-line options - defaults.defaultMaximalSize = _defaultMaximalSize; - defaults.removeOnDrop = _removeOnDrop; - defaults.removeOnCompacted = _removeOnCompacted; - defaults.defaultWaitForSync = _defaultWaitForSync; - defaults.forceSyncProperties = _forceSyncProperties; - defaults.requireAuthentication = ! _disableAuthentication; - defaults.authenticateSystemOnly = _authenticateSystemOnly; + defaults.defaultMaximalSize = _defaultMaximalSize; + defaults.removeOnDrop = _removeOnDrop; + defaults.removeOnCompacted = _removeOnCompacted; + defaults.defaultWaitForSync = _defaultWaitForSync; + defaults.forceSyncProperties = _forceSyncProperties; + defaults.requireAuthentication = ! _disableAuthentication; + defaults.requireAuthenticationUnixSockets = ! _disableAuthenticationUnixSockets; + defaults.authenticateSystemOnly = _authenticateSystemOnly; assert(_server != 0); diff --git a/arangod/RestServer/ArangoServer.h b/arangod/RestServer/ArangoServer.h index 598dfaa716..f601d2d94c 100644 --- a/arangod/RestServer/ArangoServer.h +++ b/arangod/RestServer/ArangoServer.h @@ -262,6 +262,26 @@ namespace triagens { bool _disableAuthentication; +//////////////////////////////////////////////////////////////////////////////// +/// @brief disable authentication for requests via UNIX domain sockets +/// +/// @CMDOPT{\--server.disable-authentication-unix-sockets @CA{value}} +/// +/// Setting @CA{value} to true will turn off authentication on the server side +/// for requests coming in via UNIX domain sockets. With this flag enabled, +/// clients located on the same host as the ArangoDB server can use UNIX domain +/// sockets to connect to the server without authentication. +/// Requests coming in by other means (e.g. TCP/IP) are not affected by this +/// option. +/// +/// The default value is @LIT{false}. +/// +/// Note: this option is only available on platforms that support UNIX domain +/// sockets. +//////////////////////////////////////////////////////////////////////////////// + + bool _disableAuthenticationUnixSockets; + //////////////////////////////////////////////////////////////////////////////// /// @brief number of dispatcher threads for non-database worker /// diff --git a/arangod/RestServer/VocbaseContext.cpp b/arangod/RestServer/VocbaseContext.cpp index 09dccb22a1..a1f7484056 100644 --- a/arangod/RestServer/VocbaseContext.cpp +++ b/arangod/RestServer/VocbaseContext.cpp @@ -30,6 +30,7 @@ #include "BasicsC/common.h" #include "BasicsC/logging.h" #include "BasicsC/tri-strings.h" +#include "Rest/ConnectionInfo.h" #include "VocBase/auth.h" #include "VocBase/server.h" #include "VocBase/vocbase.h" @@ -101,6 +102,18 @@ HttpResponse::HttpResponseCode VocbaseContext::authenticate () { return HttpResponse::OK; } +#ifdef TRI_HAVE_LINUX_SOCKETS + // check if we need to run authentication for this type of + // endpoint + ConnectionInfo const& ci = _request->connectionInfo(); + + if (ci.endpointType == Endpoint::DOMAIN_UNIX && + ! _vocbase->_settings.requireAuthenticationUnixSockets) { + // no authentication required for unix socket domain connections + return HttpResponse::OK; + } +#endif + if (_vocbase->_settings.authenticateSystemOnly) { // authentication required, but only for /_api, /_admin etc. const char* path = _request->requestPath(); diff --git a/arangod/V8Server/v8-vocbase.cpp b/arangod/V8Server/v8-vocbase.cpp index 7d1506ccf8..b7e841dd89 100644 --- a/arangod/V8Server/v8-vocbase.cpp +++ b/arangod/V8Server/v8-vocbase.cpp @@ -7823,6 +7823,7 @@ static v8::Handle JS_CreateDatabase (v8::Arguments const& argv) { v8::Local keyDefaultWaitForSync = v8::String::New("defaultWaitForSync"); v8::Local keyForceSyncProperties = v8::String::New("forceSyncProperties"); v8::Local keyRequireAuthentication = v8::String::New("requireAuthentication"); + v8::Local keyRequireAuthenticationUnixSockets = v8::String::New("requireAuthenticationUnixSockets"); v8::Local keyAuthenticateSystemOnly = v8::String::New("authenticateSystemOnly"); // overwrite database defaults from argv[2] @@ -7852,6 +7853,10 @@ static v8::Handle JS_CreateDatabase (v8::Arguments const& argv) { if (options->Has(keyRequireAuthentication)) { defaults.requireAuthentication = options->Get(keyRequireAuthentication)->BooleanValue(); } + + if (options->Has(keyRequireAuthenticationUnixSockets)) { + defaults.requireAuthenticationUnixSockets = options->Get(keyRequireAuthenticationUnixSockets)->BooleanValue(); + } if (options->Has(keyAuthenticateSystemOnly)) { defaults.authenticateSystemOnly = options->Get(keyAuthenticateSystemOnly)->BooleanValue(); diff --git a/arangod/VocBase/vocbase-defaults.c b/arangod/VocBase/vocbase-defaults.c index e7e7e45043..7ea8556ffb 100644 --- a/arangod/VocBase/vocbase-defaults.c +++ b/arangod/VocBase/vocbase-defaults.c @@ -44,13 +44,14 @@ void TRI_ApplyVocBaseDefaults (TRI_vocbase_t* vocbase, TRI_vocbase_defaults_t const* defaults) { - vocbase->_settings.defaultMaximalSize = defaults->defaultMaximalSize; - vocbase->_settings.removeOnDrop = defaults->removeOnDrop; - vocbase->_settings.removeOnCompacted = defaults->removeOnCompacted; - vocbase->_settings.defaultWaitForSync = defaults->defaultWaitForSync; - vocbase->_settings.forceSyncProperties = defaults->forceSyncProperties; - vocbase->_settings.requireAuthentication = defaults->requireAuthentication; - vocbase->_settings.authenticateSystemOnly = defaults->authenticateSystemOnly; + vocbase->_settings.defaultMaximalSize = defaults->defaultMaximalSize; + vocbase->_settings.removeOnDrop = defaults->removeOnDrop; + vocbase->_settings.removeOnCompacted = defaults->removeOnCompacted; + vocbase->_settings.defaultWaitForSync = defaults->defaultWaitForSync; + vocbase->_settings.forceSyncProperties = defaults->forceSyncProperties; + vocbase->_settings.requireAuthentication = defaults->requireAuthentication; + vocbase->_settings.requireAuthenticationUnixSockets = defaults->requireAuthenticationUnixSockets; + vocbase->_settings.authenticateSystemOnly = defaults->authenticateSystemOnly; } //////////////////////////////////////////////////////////////////////////////// @@ -72,6 +73,7 @@ TRI_json_t* TRI_JsonVocBaseDefaults (TRI_memory_zone_t* zone, TRI_Insert3ArrayJson(zone, json, "waitForSync", TRI_CreateBooleanJson(zone, defaults->defaultWaitForSync)); TRI_Insert3ArrayJson(zone, json, "forceSyncProperties", TRI_CreateBooleanJson(zone, defaults->forceSyncProperties)); TRI_Insert3ArrayJson(zone, json, "requireAuthentication", TRI_CreateBooleanJson(zone, defaults->requireAuthentication)); + TRI_Insert3ArrayJson(zone, json, "requireAuthenticationUnixSockets", TRI_CreateBooleanJson(zone, defaults->requireAuthenticationUnixSockets)); TRI_Insert3ArrayJson(zone, json, "authenticateSystemOnly", TRI_CreateBooleanJson(zone, defaults->authenticateSystemOnly)); TRI_Insert3ArrayJson(zone, json, "defaultMaximalSize", TRI_CreateNumberJson(zone, (double) defaults->defaultMaximalSize)); @@ -120,6 +122,12 @@ void TRI_FromJsonVocBaseDefaults (TRI_vocbase_defaults_t* defaults, defaults->requireAuthentication = optionJson->_value._boolean; } + optionJson = TRI_LookupArrayJson(json, "requireAuthenticationUnixSockets"); + + if (TRI_IsBooleanJson(optionJson)) { + defaults->requireAuthenticationUnixSockets = optionJson->_value._boolean; + } + optionJson = TRI_LookupArrayJson(json, "authenticateSystemOnly"); if (TRI_IsBooleanJson(optionJson)) { diff --git a/arangod/VocBase/vocbase-defaults.h b/arangod/VocBase/vocbase-defaults.h index 72318c4e3a..212d68c5de 100644 --- a/arangod/VocBase/vocbase-defaults.h +++ b/arangod/VocBase/vocbase-defaults.h @@ -58,6 +58,7 @@ typedef struct TRI_vocbase_defaults_s { bool defaultWaitForSync; bool forceSyncProperties; bool requireAuthentication; + bool requireAuthenticationUnixSockets; bool authenticateSystemOnly; } TRI_vocbase_defaults_t; diff --git a/lib/Rest/ConnectionInfo.h b/lib/Rest/ConnectionInfo.h index 6338b657ef..12e8559d1d 100644 --- a/lib/Rest/ConnectionInfo.h +++ b/lib/Rest/ConnectionInfo.h @@ -32,6 +32,7 @@ #include "Basics/Common.h" #include "Basics/StringUtils.h" +#include "Rest/Endpoint.h" namespace triagens { namespace rest { @@ -48,6 +49,7 @@ namespace triagens { serverAddress(), clientAddress(), endpoint(), + endpointType(Endpoint::DOMAIN_UNKNOWN), sslContext(0) { } @@ -57,6 +59,7 @@ namespace triagens { serverAddress(that.serverAddress), clientAddress(that.clientAddress), endpoint(that.endpoint), + endpointType(that.endpointType), sslContext(that.sslContext) { } @@ -67,6 +70,7 @@ namespace triagens { serverAddress = that.serverAddress; clientAddress = that.clientAddress; endpoint = that.endpoint; + endpointType = that.endpointType; sslContext = that.sslContext; } @@ -81,6 +85,7 @@ namespace triagens { string serverAddress; string clientAddress; string endpoint; + Endpoint::DomainType endpointType; void* sslContext; }; diff --git a/lib/Scheduler/ListenTask.cpp b/lib/Scheduler/ListenTask.cpp index faa30969a7..0772548858 100644 --- a/lib/Scheduler/ListenTask.cpp +++ b/lib/Scheduler/ListenTask.cpp @@ -234,6 +234,7 @@ bool ListenTask::handleEvent (EventToken token, EventType revents) { info.serverAddress = _endpoint->getHost(); info.serverPort = _endpoint->getPort(); info.endpoint = _endpoint->getSpecification(); + info.endpointType = _endpoint->getDomainType(); return handleConnected(connectionSocket, info); } From 4339d5aab6281aa9a5ddfbb374d0b070b99e1142 Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Sun, 2 Feb 2014 09:21:43 +0100 Subject: [PATCH 16/29] removed unused variable --- js/apps/system/aardvark/frontend/js/bootstrap/module-internal.js | 1 - js/common/bootstrap/module-internal.js | 1 - 2 files changed, 2 deletions(-) diff --git a/js/apps/system/aardvark/frontend/js/bootstrap/module-internal.js b/js/apps/system/aardvark/frontend/js/bootstrap/module-internal.js index a717518f86..375b370ca9 100644 --- a/js/apps/system/aardvark/frontend/js/bootstrap/module-internal.js +++ b/js/apps/system/aardvark/frontend/js/bootstrap/module-internal.js @@ -52,7 +52,6 @@ // cannot use strict here as we are going to delete globals var exports = require("internal"); - var fs = require("fs"); // ----------------------------------------------------------------------------- // --SECTION-- Module "internal" diff --git a/js/common/bootstrap/module-internal.js b/js/common/bootstrap/module-internal.js index a717518f86..375b370ca9 100644 --- a/js/common/bootstrap/module-internal.js +++ b/js/common/bootstrap/module-internal.js @@ -52,7 +52,6 @@ // cannot use strict here as we are going to delete globals var exports = require("internal"); - var fs = require("fs"); // ----------------------------------------------------------------------------- // --SECTION-- Module "internal" From 18d872628e9ad23053f1ae339fa5c0322126d667 Mon Sep 17 00:00:00 2001 From: Jan Steemann Date: Sun, 2 Feb 2014 09:23:04 +0100 Subject: [PATCH 17/29] call global instance destructor --- arangod/RestServer/arango.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arangod/RestServer/arango.cpp b/arangod/RestServer/arango.cpp index 5fe590ec5d..e0452b9a59 100644 --- a/arangod/RestServer/arango.cpp +++ b/arangod/RestServer/arango.cpp @@ -458,6 +458,11 @@ int main (int argc, char* argv[]) { TRIAGENS_REST_SHUTDOWN; TRI_GlobalExitFunction(res, NULL); + if (ArangoInstance != 0) { + delete ArangoInstance; + ArangoInstance = 0; + } + return res; } From 08858d414b341fcdab48c6ba65c3f5e5f95aba8a Mon Sep 17 00:00:00 2001 From: Michael Hackstein Date: Mon, 3 Feb 2014 11:42:18 +0100 Subject: [PATCH 18/29] Added new version of graphViewer Icons --- .../system/aardvark/frontend/css/buttons.css | 46 + .../aardvark/frontend/css/font-awesome.css | 1338 +++++++++++++++++ .../aardvark/frontend/css/graphlayout.css | 8 - .../fonts/fontawesome/FontAwesome.otf | Bin 0 -> 62856 bytes .../fonts/fontawesome/fontawesome-webfont.eot | Bin 0 -> 38205 bytes .../fonts/fontawesome/fontawesome-webfont.svg | 414 +++++ .../fonts/fontawesome/fontawesome-webfont.ttf | Bin 0 -> 80652 bytes .../fontawesome/fontawesome-webfont.woff | Bin 0 -> 44432 bytes .../graphViewer/ui/eventDispatcherControls.js | 32 + .../js/graphViewer/ui/uiComponentsHelper.js | 32 +- js/apps/system/aardvark/manifest.json | 1 + 11 files changed, 1852 insertions(+), 19 deletions(-) create mode 100644 js/apps/system/aardvark/frontend/css/font-awesome.css create mode 100644 js/apps/system/aardvark/frontend/fonts/fontawesome/FontAwesome.otf create mode 100755 js/apps/system/aardvark/frontend/fonts/fontawesome/fontawesome-webfont.eot create mode 100755 js/apps/system/aardvark/frontend/fonts/fontawesome/fontawesome-webfont.svg create mode 100755 js/apps/system/aardvark/frontend/fonts/fontawesome/fontawesome-webfont.ttf create mode 100755 js/apps/system/aardvark/frontend/fonts/fontawesome/fontawesome-webfont.woff diff --git a/js/apps/system/aardvark/frontend/css/buttons.css b/js/apps/system/aardvark/frontend/css/buttons.css index 3ffaa7eddb..ccf92e2e12 100644 --- a/js/apps/system/aardvark/frontend/css/buttons.css +++ b/js/apps/system/aardvark/frontend/css/buttons.css @@ -75,6 +75,52 @@ a.headerButton .icon_arangodb_arrowleft, a.headerButton .icon_arangodb_arrowright { font-weight:bold; } +/* Graph Viewer */ + +div.toolbox > div.gv_action_button:first-child { + margin-top: 0px; +} + +div.toolbox > div.gv_action_button:last-child { + margin-bottom: 0px; +} + +div.gv_action_button { + text-align: center; + position: relative; + width: 50px; + height: 50px; + background-color: #333333; + color: white; + cursor: pointer; + margin-top: 2px; + margin-bottom: 2px; +} + +div.gv_action_button:hover { + +} + +div.gv_action_button.active { + background-color: #8AA051; +} + +h6.gv_icon_icon, +h6.gv_button_title { + position: absolute; + margin: 0px; + left: 0px; + right: 0px; +} + +h6.gv_icon_icon { + font-size: 22px; + top: 6px; +} + +h6.gv_button_title { + bottom: 1px; +} /* #documentsToolbar span { diff --git a/js/apps/system/aardvark/frontend/css/font-awesome.css b/js/apps/system/aardvark/frontend/css/font-awesome.css new file mode 100644 index 0000000000..46958c5a03 --- /dev/null +++ b/js/apps/system/aardvark/frontend/css/font-awesome.css @@ -0,0 +1,1338 @@ +/*! + * Font Awesome 4.0.3 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ +/* FONT PATH + * -------------------------- */ +@font-face { + font-family: 'FontAwesome'; + src: url('../fonts/fontawesome/fontawesome-webfont.eot?v=4.0.3'); + src: url('../fonts/fontawesome/fontawesome-webfont.eot?#iefix&v=4.0.3') format('embedded-opentype'), url('../fonts/fontawesome/fontawesome-webfont.woff?v=4.0.3') format('woff'), url('../fonts/fontawesome/fontawesome-webfont.ttf?v=4.0.3') format('truetype'), url('../fonts/fontawesome/fontawesome-webfont.svg?v=4.0.3#fontawesomeregular') format('svg'); + font-weight: normal; + font-style: normal; +} +.fa { + display: inline-block; + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* makes the font 33% larger relative to the icon container */ +.fa-lg { + font-size: 1.3333333333333333em; + line-height: 0.75em; + vertical-align: -15%; +} +.fa-2x { + font-size: 2em; +} +.fa-3x { + font-size: 3em; +} +.fa-4x { + font-size: 4em; +} +.fa-5x { + font-size: 5em; +} +.fa-fw { + width: 1.2857142857142858em; + text-align: center; +} +.fa-ul { + padding-left: 0; + margin-left: 2.142857142857143em; + list-style-type: none; +} +.fa-ul > li { + position: relative; +} +.fa-li { + position: absolute; + left: -2.142857142857143em; + width: 2.142857142857143em; + top: 0.14285714285714285em; + text-align: center; +} +.fa-li.fa-lg { + left: -1.8571428571428572em; +} +.fa-border { + padding: .2em .25em .15em; + border: solid 0.08em #eeeeee; + border-radius: .1em; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.fa.pull-left { + margin-right: .3em; +} +.fa.pull-right { + margin-left: .3em; +} +.fa-spin { + -webkit-animation: spin 2s infinite linear; + -moz-animation: spin 2s infinite linear; + -o-animation: spin 2s infinite linear; + animation: spin 2s infinite linear; +} +@-moz-keyframes spin { + 0% { + -moz-transform: rotate(0deg); + } + 100% { + -moz-transform: rotate(359deg); + } +} +@-webkit-keyframes spin { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@-o-keyframes spin { + 0% { + -o-transform: rotate(0deg); + } + 100% { + -o-transform: rotate(359deg); + } +} +@-ms-keyframes spin { + 0% { + -ms-transform: rotate(0deg); + } + 100% { + -ms-transform: rotate(359deg); + } +} +@keyframes spin { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +.fa-rotate-90 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1); + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); +} +.fa-rotate-180 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2); + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + -ms-transform: rotate(180deg); + -o-transform: rotate(180deg); + transform: rotate(180deg); +} +.fa-rotate-270 { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3); + -webkit-transform: rotate(270deg); + -moz-transform: rotate(270deg); + -ms-transform: rotate(270deg); + -o-transform: rotate(270deg); + transform: rotate(270deg); +} +.fa-flip-horizontal { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1); + -webkit-transform: scale(-1, 1); + -moz-transform: scale(-1, 1); + -ms-transform: scale(-1, 1); + -o-transform: scale(-1, 1); + transform: scale(-1, 1); +} +.fa-flip-vertical { + filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1); + -webkit-transform: scale(1, -1); + -moz-transform: scale(1, -1); + -ms-transform: scale(1, -1); + -o-transform: scale(1, -1); + transform: scale(1, -1); +} +.fa-stack { + position: relative; + display: inline-block; + width: 2em; + height: 2em; + line-height: 2em; + vertical-align: middle; +} +.fa-stack-1x, +.fa-stack-2x { + position: absolute; + left: 0; + width: 100%; + text-align: center; +} +.fa-stack-1x { + line-height: inherit; +} +.fa-stack-2x { + font-size: 2em; +} +.fa-inverse { + color: #ffffff; +} +/* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen + readers do not read off random characters that represent icons */ +.fa-glass:before { + content: "\f000"; +} +.fa-music:before { + content: "\f001"; +} +.fa-search:before { + content: "\f002"; +} +.fa-envelope-o:before { + content: "\f003"; +} +.fa-heart:before { + content: "\f004"; +} +.fa-star:before { + content: "\f005"; +} +.fa-star-o:before { + content: "\f006"; +} +.fa-user:before { + content: "\f007"; +} +.fa-film:before { + content: "\f008"; +} +.fa-th-large:before { + content: "\f009"; +} +.fa-th:before { + content: "\f00a"; +} +.fa-th-list:before { + content: "\f00b"; +} +.fa-check:before { + content: "\f00c"; +} +.fa-times:before { + content: "\f00d"; +} +.fa-search-plus:before { + content: "\f00e"; +} +.fa-search-minus:before { + content: "\f010"; +} +.fa-power-off:before { + content: "\f011"; +} +.fa-signal:before { + content: "\f012"; +} +.fa-gear:before, +.fa-cog:before { + content: "\f013"; +} +.fa-trash-o:before { + content: "\f014"; +} +.fa-home:before { + content: "\f015"; +} +.fa-file-o:before { + content: "\f016"; +} +.fa-clock-o:before { + content: "\f017"; +} +.fa-road:before { + content: "\f018"; +} +.fa-download:before { + content: "\f019"; +} +.fa-arrow-circle-o-down:before { + content: "\f01a"; +} +.fa-arrow-circle-o-up:before { + content: "\f01b"; +} +.fa-inbox:before { + content: "\f01c"; +} +.fa-play-circle-o:before { + content: "\f01d"; +} +.fa-rotate-right:before, +.fa-repeat:before { + content: "\f01e"; +} +.fa-refresh:before { + content: "\f021"; +} +.fa-list-alt:before { + content: "\f022"; +} +.fa-lock:before { + content: "\f023"; +} +.fa-flag:before { + content: "\f024"; +} +.fa-headphones:before { + content: "\f025"; +} +.fa-volume-off:before { + content: "\f026"; +} +.fa-volume-down:before { + content: "\f027"; +} +.fa-volume-up:before { + content: "\f028"; +} +.fa-qrcode:before { + content: "\f029"; +} +.fa-barcode:before { + content: "\f02a"; +} +.fa-tag:before { + content: "\f02b"; +} +.fa-tags:before { + content: "\f02c"; +} +.fa-book:before { + content: "\f02d"; +} +.fa-bookmark:before { + content: "\f02e"; +} +.fa-print:before { + content: "\f02f"; +} +.fa-camera:before { + content: "\f030"; +} +.fa-font:before { + content: "\f031"; +} +.fa-bold:before { + content: "\f032"; +} +.fa-italic:before { + content: "\f033"; +} +.fa-text-height:before { + content: "\f034"; +} +.fa-text-width:before { + content: "\f035"; +} +.fa-align-left:before { + content: "\f036"; +} +.fa-align-center:before { + content: "\f037"; +} +.fa-align-right:before { + content: "\f038"; +} +.fa-align-justify:before { + content: "\f039"; +} +.fa-list:before { + content: "\f03a"; +} +.fa-dedent:before, +.fa-outdent:before { + content: "\f03b"; +} +.fa-indent:before { + content: "\f03c"; +} +.fa-video-camera:before { + content: "\f03d"; +} +.fa-picture-o:before { + content: "\f03e"; +} +.fa-pencil:before { + content: "\f040"; +} +.fa-map-marker:before { + content: "\f041"; +} +.fa-adjust:before { + content: "\f042"; +} +.fa-tint:before { + content: "\f043"; +} +.fa-edit:before, +.fa-pencil-square-o:before { + content: "\f044"; +} +.fa-share-square-o:before { + content: "\f045"; +} +.fa-check-square-o:before { + content: "\f046"; +} +.fa-arrows:before { + content: "\f047"; +} +.fa-step-backward:before { + content: "\f048"; +} +.fa-fast-backward:before { + content: "\f049"; +} +.fa-backward:before { + content: "\f04a"; +} +.fa-play:before { + content: "\f04b"; +} +.fa-pause:before { + content: "\f04c"; +} +.fa-stop:before { + content: "\f04d"; +} +.fa-forward:before { + content: "\f04e"; +} +.fa-fast-forward:before { + content: "\f050"; +} +.fa-step-forward:before { + content: "\f051"; +} +.fa-eject:before { + content: "\f052"; +} +.fa-chevron-left:before { + content: "\f053"; +} +.fa-chevron-right:before { + content: "\f054"; +} +.fa-plus-circle:before { + content: "\f055"; +} +.fa-minus-circle:before { + content: "\f056"; +} +.fa-times-circle:before { + content: "\f057"; +} +.fa-check-circle:before { + content: "\f058"; +} +.fa-question-circle:before { + content: "\f059"; +} +.fa-info-circle:before { + content: "\f05a"; +} +.fa-crosshairs:before { + content: "\f05b"; +} +.fa-times-circle-o:before { + content: "\f05c"; +} +.fa-check-circle-o:before { + content: "\f05d"; +} +.fa-ban:before { + content: "\f05e"; +} +.fa-arrow-left:before { + content: "\f060"; +} +.fa-arrow-right:before { + content: "\f061"; +} +.fa-arrow-up:before { + content: "\f062"; +} +.fa-arrow-down:before { + content: "\f063"; +} +.fa-mail-forward:before, +.fa-share:before { + content: "\f064"; +} +.fa-expand:before { + content: "\f065"; +} +.fa-compress:before { + content: "\f066"; +} +.fa-plus:before { + content: "\f067"; +} +.fa-minus:before { + content: "\f068"; +} +.fa-asterisk:before { + content: "\f069"; +} +.fa-exclamation-circle:before { + content: "\f06a"; +} +.fa-gift:before { + content: "\f06b"; +} +.fa-leaf:before { + content: "\f06c"; +} +.fa-fire:before { + content: "\f06d"; +} +.fa-eye:before { + content: "\f06e"; +} +.fa-eye-slash:before { + content: "\f070"; +} +.fa-warning:before, +.fa-exclamation-triangle:before { + content: "\f071"; +} +.fa-plane:before { + content: "\f072"; +} +.fa-calendar:before { + content: "\f073"; +} +.fa-random:before { + content: "\f074"; +} +.fa-comment:before { + content: "\f075"; +} +.fa-magnet:before { + content: "\f076"; +} +.fa-chevron-up:before { + content: "\f077"; +} +.fa-chevron-down:before { + content: "\f078"; +} +.fa-retweet:before { + content: "\f079"; +} +.fa-shopping-cart:before { + content: "\f07a"; +} +.fa-folder:before { + content: "\f07b"; +} +.fa-folder-open:before { + content: "\f07c"; +} +.fa-arrows-v:before { + content: "\f07d"; +} +.fa-arrows-h:before { + content: "\f07e"; +} +.fa-bar-chart-o:before { + content: "\f080"; +} +.fa-twitter-square:before { + content: "\f081"; +} +.fa-facebook-square:before { + content: "\f082"; +} +.fa-camera-retro:before { + content: "\f083"; +} +.fa-key:before { + content: "\f084"; +} +.fa-gears:before, +.fa-cogs:before { + content: "\f085"; +} +.fa-comments:before { + content: "\f086"; +} +.fa-thumbs-o-up:before { + content: "\f087"; +} +.fa-thumbs-o-down:before { + content: "\f088"; +} +.fa-star-half:before { + content: "\f089"; +} +.fa-heart-o:before { + content: "\f08a"; +} +.fa-sign-out:before { + content: "\f08b"; +} +.fa-linkedin-square:before { + content: "\f08c"; +} +.fa-thumb-tack:before { + content: "\f08d"; +} +.fa-external-link:before { + content: "\f08e"; +} +.fa-sign-in:before { + content: "\f090"; +} +.fa-trophy:before { + content: "\f091"; +} +.fa-github-square:before { + content: "\f092"; +} +.fa-upload:before { + content: "\f093"; +} +.fa-lemon-o:before { + content: "\f094"; +} +.fa-phone:before { + content: "\f095"; +} +.fa-square-o:before { + content: "\f096"; +} +.fa-bookmark-o:before { + content: "\f097"; +} +.fa-phone-square:before { + content: "\f098"; +} +.fa-twitter:before { + content: "\f099"; +} +.fa-facebook:before { + content: "\f09a"; +} +.fa-github:before { + content: "\f09b"; +} +.fa-unlock:before { + content: "\f09c"; +} +.fa-credit-card:before { + content: "\f09d"; +} +.fa-rss:before { + content: "\f09e"; +} +.fa-hdd-o:before { + content: "\f0a0"; +} +.fa-bullhorn:before { + content: "\f0a1"; +} +.fa-bell:before { + content: "\f0f3"; +} +.fa-certificate:before { + content: "\f0a3"; +} +.fa-hand-o-right:before { + content: "\f0a4"; +} +.fa-hand-o-left:before { + content: "\f0a5"; +} +.fa-hand-o-up:before { + content: "\f0a6"; +} +.fa-hand-o-down:before { + content: "\f0a7"; +} +.fa-arrow-circle-left:before { + content: "\f0a8"; +} +.fa-arrow-circle-right:before { + content: "\f0a9"; +} +.fa-arrow-circle-up:before { + content: "\f0aa"; +} +.fa-arrow-circle-down:before { + content: "\f0ab"; +} +.fa-globe:before { + content: "\f0ac"; +} +.fa-wrench:before { + content: "\f0ad"; +} +.fa-tasks:before { + content: "\f0ae"; +} +.fa-filter:before { + content: "\f0b0"; +} +.fa-briefcase:before { + content: "\f0b1"; +} +.fa-arrows-alt:before { + content: "\f0b2"; +} +.fa-group:before, +.fa-users:before { + content: "\f0c0"; +} +.fa-chain:before, +.fa-link:before { + content: "\f0c1"; +} +.fa-cloud:before { + content: "\f0c2"; +} +.fa-flask:before { + content: "\f0c3"; +} +.fa-cut:before, +.fa-scissors:before { + content: "\f0c4"; +} +.fa-copy:before, +.fa-files-o:before { + content: "\f0c5"; +} +.fa-paperclip:before { + content: "\f0c6"; +} +.fa-save:before, +.fa-floppy-o:before { + content: "\f0c7"; +} +.fa-square:before { + content: "\f0c8"; +} +.fa-bars:before { + content: "\f0c9"; +} +.fa-list-ul:before { + content: "\f0ca"; +} +.fa-list-ol:before { + content: "\f0cb"; +} +.fa-strikethrough:before { + content: "\f0cc"; +} +.fa-underline:before { + content: "\f0cd"; +} +.fa-table:before { + content: "\f0ce"; +} +.fa-magic:before { + content: "\f0d0"; +} +.fa-truck:before { + content: "\f0d1"; +} +.fa-pinterest:before { + content: "\f0d2"; +} +.fa-pinterest-square:before { + content: "\f0d3"; +} +.fa-google-plus-square:before { + content: "\f0d4"; +} +.fa-google-plus:before { + content: "\f0d5"; +} +.fa-money:before { + content: "\f0d6"; +} +.fa-caret-down:before { + content: "\f0d7"; +} +.fa-caret-up:before { + content: "\f0d8"; +} +.fa-caret-left:before { + content: "\f0d9"; +} +.fa-caret-right:before { + content: "\f0da"; +} +.fa-columns:before { + content: "\f0db"; +} +.fa-unsorted:before, +.fa-sort:before { + content: "\f0dc"; +} +.fa-sort-down:before, +.fa-sort-asc:before { + content: "\f0dd"; +} +.fa-sort-up:before, +.fa-sort-desc:before { + content: "\f0de"; +} +.fa-envelope:before { + content: "\f0e0"; +} +.fa-linkedin:before { + content: "\f0e1"; +} +.fa-rotate-left:before, +.fa-undo:before { + content: "\f0e2"; +} +.fa-legal:before, +.fa-gavel:before { + content: "\f0e3"; +} +.fa-dashboard:before, +.fa-tachometer:before { + content: "\f0e4"; +} +.fa-comment-o:before { + content: "\f0e5"; +} +.fa-comments-o:before { + content: "\f0e6"; +} +.fa-flash:before, +.fa-bolt:before { + content: "\f0e7"; +} +.fa-sitemap:before { + content: "\f0e8"; +} +.fa-umbrella:before { + content: "\f0e9"; +} +.fa-paste:before, +.fa-clipboard:before { + content: "\f0ea"; +} +.fa-lightbulb-o:before { + content: "\f0eb"; +} +.fa-exchange:before { + content: "\f0ec"; +} +.fa-cloud-download:before { + content: "\f0ed"; +} +.fa-cloud-upload:before { + content: "\f0ee"; +} +.fa-user-md:before { + content: "\f0f0"; +} +.fa-stethoscope:before { + content: "\f0f1"; +} +.fa-suitcase:before { + content: "\f0f2"; +} +.fa-bell-o:before { + content: "\f0a2"; +} +.fa-coffee:before { + content: "\f0f4"; +} +.fa-cutlery:before { + content: "\f0f5"; +} +.fa-file-text-o:before { + content: "\f0f6"; +} +.fa-building-o:before { + content: "\f0f7"; +} +.fa-hospital-o:before { + content: "\f0f8"; +} +.fa-ambulance:before { + content: "\f0f9"; +} +.fa-medkit:before { + content: "\f0fa"; +} +.fa-fighter-jet:before { + content: "\f0fb"; +} +.fa-beer:before { + content: "\f0fc"; +} +.fa-h-square:before { + content: "\f0fd"; +} +.fa-plus-square:before { + content: "\f0fe"; +} +.fa-angle-double-left:before { + content: "\f100"; +} +.fa-angle-double-right:before { + content: "\f101"; +} +.fa-angle-double-up:before { + content: "\f102"; +} +.fa-angle-double-down:before { + content: "\f103"; +} +.fa-angle-left:before { + content: "\f104"; +} +.fa-angle-right:before { + content: "\f105"; +} +.fa-angle-up:before { + content: "\f106"; +} +.fa-angle-down:before { + content: "\f107"; +} +.fa-desktop:before { + content: "\f108"; +} +.fa-laptop:before { + content: "\f109"; +} +.fa-tablet:before { + content: "\f10a"; +} +.fa-mobile-phone:before, +.fa-mobile:before { + content: "\f10b"; +} +.fa-circle-o:before { + content: "\f10c"; +} +.fa-quote-left:before { + content: "\f10d"; +} +.fa-quote-right:before { + content: "\f10e"; +} +.fa-spinner:before { + content: "\f110"; +} +.fa-circle:before { + content: "\f111"; +} +.fa-mail-reply:before, +.fa-reply:before { + content: "\f112"; +} +.fa-github-alt:before { + content: "\f113"; +} +.fa-folder-o:before { + content: "\f114"; +} +.fa-folder-open-o:before { + content: "\f115"; +} +.fa-smile-o:before { + content: "\f118"; +} +.fa-frown-o:before { + content: "\f119"; +} +.fa-meh-o:before { + content: "\f11a"; +} +.fa-gamepad:before { + content: "\f11b"; +} +.fa-keyboard-o:before { + content: "\f11c"; +} +.fa-flag-o:before { + content: "\f11d"; +} +.fa-flag-checkered:before { + content: "\f11e"; +} +.fa-terminal:before { + content: "\f120"; +} +.fa-code:before { + content: "\f121"; +} +.fa-reply-all:before { + content: "\f122"; +} +.fa-mail-reply-all:before { + content: "\f122"; +} +.fa-star-half-empty:before, +.fa-star-half-full:before, +.fa-star-half-o:before { + content: "\f123"; +} +.fa-location-arrow:before { + content: "\f124"; +} +.fa-crop:before { + content: "\f125"; +} +.fa-code-fork:before { + content: "\f126"; +} +.fa-unlink:before, +.fa-chain-broken:before { + content: "\f127"; +} +.fa-question:before { + content: "\f128"; +} +.fa-info:before { + content: "\f129"; +} +.fa-exclamation:before { + content: "\f12a"; +} +.fa-superscript:before { + content: "\f12b"; +} +.fa-subscript:before { + content: "\f12c"; +} +.fa-eraser:before { + content: "\f12d"; +} +.fa-puzzle-piece:before { + content: "\f12e"; +} +.fa-microphone:before { + content: "\f130"; +} +.fa-microphone-slash:before { + content: "\f131"; +} +.fa-shield:before { + content: "\f132"; +} +.fa-calendar-o:before { + content: "\f133"; +} +.fa-fire-extinguisher:before { + content: "\f134"; +} +.fa-rocket:before { + content: "\f135"; +} +.fa-maxcdn:before { + content: "\f136"; +} +.fa-chevron-circle-left:before { + content: "\f137"; +} +.fa-chevron-circle-right:before { + content: "\f138"; +} +.fa-chevron-circle-up:before { + content: "\f139"; +} +.fa-chevron-circle-down:before { + content: "\f13a"; +} +.fa-html5:before { + content: "\f13b"; +} +.fa-css3:before { + content: "\f13c"; +} +.fa-anchor:before { + content: "\f13d"; +} +.fa-unlock-alt:before { + content: "\f13e"; +} +.fa-bullseye:before { + content: "\f140"; +} +.fa-ellipsis-h:before { + content: "\f141"; +} +.fa-ellipsis-v:before { + content: "\f142"; +} +.fa-rss-square:before { + content: "\f143"; +} +.fa-play-circle:before { + content: "\f144"; +} +.fa-ticket:before { + content: "\f145"; +} +.fa-minus-square:before { + content: "\f146"; +} +.fa-minus-square-o:before { + content: "\f147"; +} +.fa-level-up:before { + content: "\f148"; +} +.fa-level-down:before { + content: "\f149"; +} +.fa-check-square:before { + content: "\f14a"; +} +.fa-pencil-square:before { + content: "\f14b"; +} +.fa-external-link-square:before { + content: "\f14c"; +} +.fa-share-square:before { + content: "\f14d"; +} +.fa-compass:before { + content: "\f14e"; +} +.fa-toggle-down:before, +.fa-caret-square-o-down:before { + content: "\f150"; +} +.fa-toggle-up:before, +.fa-caret-square-o-up:before { + content: "\f151"; +} +.fa-toggle-right:before, +.fa-caret-square-o-right:before { + content: "\f152"; +} +.fa-euro:before, +.fa-eur:before { + content: "\f153"; +} +.fa-gbp:before { + content: "\f154"; +} +.fa-dollar:before, +.fa-usd:before { + content: "\f155"; +} +.fa-rupee:before, +.fa-inr:before { + content: "\f156"; +} +.fa-cny:before, +.fa-rmb:before, +.fa-yen:before, +.fa-jpy:before { + content: "\f157"; +} +.fa-ruble:before, +.fa-rouble:before, +.fa-rub:before { + content: "\f158"; +} +.fa-won:before, +.fa-krw:before { + content: "\f159"; +} +.fa-bitcoin:before, +.fa-btc:before { + content: "\f15a"; +} +.fa-file:before { + content: "\f15b"; +} +.fa-file-text:before { + content: "\f15c"; +} +.fa-sort-alpha-asc:before { + content: "\f15d"; +} +.fa-sort-alpha-desc:before { + content: "\f15e"; +} +.fa-sort-amount-asc:before { + content: "\f160"; +} +.fa-sort-amount-desc:before { + content: "\f161"; +} +.fa-sort-numeric-asc:before { + content: "\f162"; +} +.fa-sort-numeric-desc:before { + content: "\f163"; +} +.fa-thumbs-up:before { + content: "\f164"; +} +.fa-thumbs-down:before { + content: "\f165"; +} +.fa-youtube-square:before { + content: "\f166"; +} +.fa-youtube:before { + content: "\f167"; +} +.fa-xing:before { + content: "\f168"; +} +.fa-xing-square:before { + content: "\f169"; +} +.fa-youtube-play:before { + content: "\f16a"; +} +.fa-dropbox:before { + content: "\f16b"; +} +.fa-stack-overflow:before { + content: "\f16c"; +} +.fa-instagram:before { + content: "\f16d"; +} +.fa-flickr:before { + content: "\f16e"; +} +.fa-adn:before { + content: "\f170"; +} +.fa-bitbucket:before { + content: "\f171"; +} +.fa-bitbucket-square:before { + content: "\f172"; +} +.fa-tumblr:before { + content: "\f173"; +} +.fa-tumblr-square:before { + content: "\f174"; +} +.fa-long-arrow-down:before { + content: "\f175"; +} +.fa-long-arrow-up:before { + content: "\f176"; +} +.fa-long-arrow-left:before { + content: "\f177"; +} +.fa-long-arrow-right:before { + content: "\f178"; +} +.fa-apple:before { + content: "\f179"; +} +.fa-windows:before { + content: "\f17a"; +} +.fa-android:before { + content: "\f17b"; +} +.fa-linux:before { + content: "\f17c"; +} +.fa-dribbble:before { + content: "\f17d"; +} +.fa-skype:before { + content: "\f17e"; +} +.fa-foursquare:before { + content: "\f180"; +} +.fa-trello:before { + content: "\f181"; +} +.fa-female:before { + content: "\f182"; +} +.fa-male:before { + content: "\f183"; +} +.fa-gittip:before { + content: "\f184"; +} +.fa-sun-o:before { + content: "\f185"; +} +.fa-moon-o:before { + content: "\f186"; +} +.fa-archive:before { + content: "\f187"; +} +.fa-bug:before { + content: "\f188"; +} +.fa-vk:before { + content: "\f189"; +} +.fa-weibo:before { + content: "\f18a"; +} +.fa-renren:before { + content: "\f18b"; +} +.fa-pagelines:before { + content: "\f18c"; +} +.fa-stack-exchange:before { + content: "\f18d"; +} +.fa-arrow-circle-o-right:before { + content: "\f18e"; +} +.fa-arrow-circle-o-left:before { + content: "\f190"; +} +.fa-toggle-left:before, +.fa-caret-square-o-left:before { + content: "\f191"; +} +.fa-dot-circle-o:before { + content: "\f192"; +} +.fa-wheelchair:before { + content: "\f193"; +} +.fa-vimeo-square:before { + content: "\f194"; +} +.fa-turkish-lira:before, +.fa-try:before { + content: "\f195"; +} +.fa-plus-square-o:before { + content: "\f196"; +} diff --git a/js/apps/system/aardvark/frontend/css/graphlayout.css b/js/apps/system/aardvark/frontend/css/graphlayout.css index a43cf76ff2..0232f768f6 100644 --- a/js/apps/system/aardvark/frontend/css/graphlayout.css +++ b/js/apps/system/aardvark/frontend/css/graphlayout.css @@ -57,14 +57,6 @@ img.searchSubmit { background-size: 50px 50px; } -.toolbox > .btn:first-child { - margin-top: 0px; -} - -.toolbox > .btn:last-child { - margin-bottom: 0px; -} - .btn-icon { padding: 4px 4px; background-color: rgb(56, 52, 52); diff --git a/js/apps/system/aardvark/frontend/fonts/fontawesome/FontAwesome.otf b/js/apps/system/aardvark/frontend/fonts/fontawesome/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..8b0f54e47e1d356dcf1496942a50e228e0f1ee14 GIT binary patch literal 62856 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