Reorganization
parent
62e95a3309
commit
84a351c88d
@ -1,10 +1,10 @@
|
|||||||
app
|
app
|
||||||
window(each="{windows}", router="{router}", window-title="{title}", width=640, height=480, x="{x}", y="{y}", z=0, resizable="true", url="{url}")
|
window(each="{windowItem in windows}", router="{parent.router}", window-title="{windowItem.title}", width=640, height=480, x="{windowItem.x}", y="{windowItem.y}", z=0, resizable="true", url="{windowItem.url}")
|
||||||
|
|
||||||
script.
|
script.
|
||||||
const stateRouter = require("../../frontend/riot-state-router");
|
const stateRouter = require("../../lib/frontend/riot-state-router");
|
||||||
|
|
||||||
this.mixin(require("../../frontend/riot-on-child"));
|
this.mixin(require("../../lib/frontend/riot-on-child"));
|
||||||
this.mixin(require("riot-query").mixin);
|
this.mixin(require("riot-query").mixin);
|
||||||
|
|
||||||
this.windows = [
|
this.windows = [
|
@ -0,0 +1,9 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
require("../window");
|
||||||
|
|
||||||
|
require("../../views/riot/sample-view");
|
||||||
|
|
||||||
|
require("../../views/riot/node/create");
|
||||||
|
|
||||||
|
require("./component");
|
@ -0,0 +1,8 @@
|
|||||||
|
uikit-toolbar
|
||||||
|
div
|
||||||
|
!= "<yield/>"
|
||||||
|
|
||||||
|
style.
|
||||||
|
|
||||||
|
script.
|
||||||
|
this.mixin(require("../../../lib/riot/mixins/dockable"));
|
@ -1,9 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("../window");
|
|
||||||
|
|
||||||
require("../../views/sample-view");
|
|
||||||
|
|
||||||
require("../../views/node/create");
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,12 +1,12 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var $ = require("jquery");
|
const $ = require("jquery");
|
||||||
var riot = require("riot");
|
const riot = require("riot");
|
||||||
|
|
||||||
require("debug").enable("*");
|
require("debug").enable("*");
|
||||||
|
|
||||||
require("../components/app");
|
require("../../components/app");
|
||||||
|
|
||||||
$(function () {
|
$(() => {
|
||||||
riot.mount("*");
|
riot.mount("*");
|
||||||
});
|
});
|
@ -1,8 +1,8 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
change: function change(data) {
|
change: function(data) {
|
||||||
Object.assign(this, data);
|
Object.assign(this, data);
|
||||||
this.update();
|
this.update();
|
||||||
}
|
}
|
||||||
};
|
}
|
@ -1,11 +1,17 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
module.exports = function ($) {
|
module.exports = function($) {
|
||||||
$.fn.disableSelection = function () {
|
$.fn.disableSelection = function() {
|
||||||
return this.attr("unselectable", "on").css("user-select", "none").on("selectstart", false);
|
return this
|
||||||
};
|
.attr("unselectable", "on")
|
||||||
|
.css("user-select", "none")
|
||||||
|
.on("selectstart", false);
|
||||||
|
}
|
||||||
|
|
||||||
$.fn.enableSelection = function () {
|
$.fn.enableSelection = function() {
|
||||||
return this.removeAttr("unselectable").css("user-select", "auto").off("selectstart", false);
|
return this
|
||||||
};
|
.removeAttr("unselectable")
|
||||||
};
|
.css("user-select", "auto")
|
||||||
|
.off("selectstart", false);
|
||||||
|
}
|
||||||
|
}
|
@ -1,21 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
|
|
||||||
var router = require("express-promise-router")();
|
|
||||||
|
|
||||||
router.get("/", function (req, res) {
|
|
||||||
res.render("layout");
|
|
||||||
});
|
|
||||||
|
|
||||||
router.get("/node/:uuid", function (req, res) {
|
|
||||||
res.json({ uuid: req.params.uuid });
|
|
||||||
});
|
|
||||||
|
|
||||||
router.get("/test1", function (req, res) {
|
|
||||||
res.send("test ONE <a href='/test2'>go to 2 instead</a> <a href='/test2' target='_blank'>or in a new window</a>");
|
|
||||||
});
|
|
||||||
|
|
||||||
router.get("/test2", function (req, res) {
|
|
||||||
res.send("test TWO <a href='/test1'>go to 1 instead</a> <a href='/test1' target='_blank'>or in a new window</a>");
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = router;
|
|
@ -0,0 +1,7 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const createError = require("create-error");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
NotFoundError: createError("NotFoundError", {statusCode: 404})
|
||||||
|
};
|
@ -1,14 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("../../../components/uikit/frame");
|
|
||||||
require("../../../components/uikit/toolbar");
|
|
||||||
require("../../../components/uikit/button");
|
|
||||||
require("../../../components/uikit/form-section");
|
|
||||||
require("../../../components/uikit/input-spawner");
|
|
||||||
require("../../../components/uikit/input");
|
|
||||||
require("../../../components/uikit/textarea");
|
|
||||||
require("../../../components/uikit/autocomplete");
|
|
||||||
|
|
||||||
require("../../../components/window-meta");
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -0,0 +1,37 @@
|
|||||||
|
const Promise = require("bluebird");
|
||||||
|
const rfr = require("rfr");
|
||||||
|
const errors = rfr("lib/util/errors");
|
||||||
|
let router = require("express-promise-router")();
|
||||||
|
|
||||||
|
router.get("/", (req, res) => {
|
||||||
|
res.render("layout");
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get("/node/:uuid", (req, res) => {
|
||||||
|
return Promise.try(() => {
|
||||||
|
return db.Node.find(req.params.uuid);
|
||||||
|
}).then((node) => {
|
||||||
|
res.json(node);
|
||||||
|
}).catch(db.Node.NotFoundError, (err) => {
|
||||||
|
throw new errors.NotFoundError("Could not find a Node with that UUID");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
router.post("/autocomplete/type", (req, res) => {
|
||||||
|
return Promise.try(() => {
|
||||||
|
// FIXME: suggest, https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html
|
||||||
|
return elasticCloud.search({
|
||||||
|
index: "types"
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
router.get("/test1", (req, res) => {
|
||||||
|
res.send("test ONE <a href='/test2'>go to 2 instead</a> <a href='/test2' target='_blank'>or in a new window</a>");
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get("/test2", (req, res) => {
|
||||||
|
res.send("test TWO <a href='/test1'>go to 1 instead</a> <a href='/test1' target='_blank'>or in a new window</a>");
|
||||||
|
});
|
||||||
|
|
||||||
|
module.exports = router;
|
@ -0,0 +1,19 @@
|
|||||||
|
[{
|
||||||
|
"name": "Domain Name"
|
||||||
|
}, {
|
||||||
|
"name": "IP Address"
|
||||||
|
}, {
|
||||||
|
"name": "Person"
|
||||||
|
}, {
|
||||||
|
"name": "News Article"
|
||||||
|
}, {
|
||||||
|
"name": "Event"
|
||||||
|
}, {
|
||||||
|
"name": "MAC Address"
|
||||||
|
}, {
|
||||||
|
"name": "Organization"
|
||||||
|
}, {
|
||||||
|
"name": "Product"
|
||||||
|
}, {
|
||||||
|
"name": "Software"
|
||||||
|
}]
|
@ -0,0 +1,20 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
const fs = require("fs");
|
||||||
|
const Promise = require("bluebird");
|
||||||
|
const elasticSearch = new require("elasticsearch").Client({
|
||||||
|
host: "localhost:9200",
|
||||||
|
log: "trace"
|
||||||
|
});
|
||||||
|
|
||||||
|
let nodeTypes = JSON.parse(fs.readFileSync("./sample/elasticsearch-node-types.json"));
|
||||||
|
|
||||||
|
Promise.map(nodeTypes, (type) => {
|
||||||
|
return elasticSearch.create({
|
||||||
|
index: "node_types",
|
||||||
|
type: "node_type",
|
||||||
|
body: type
|
||||||
|
});
|
||||||
|
}).then((results) => {
|
||||||
|
console.log(results);
|
||||||
|
});
|
@ -1,9 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("../window");
|
|
||||||
|
|
||||||
require("../../views/sample-view");
|
|
||||||
|
|
||||||
require("../../views/node/create");
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,3 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,3 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,3 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,3 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,3 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,3 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,3 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,8 +0,0 @@
|
|||||||
uikit-toolbar
|
|
||||||
div
|
|
||||||
!= "<yield/>"
|
|
||||||
|
|
||||||
style.
|
|
||||||
|
|
||||||
script.
|
|
||||||
this.mixin(require("../../../riot/mixins/dockable"));
|
|
@ -1,3 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,3 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,3 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,5 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("../view-manager");
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,12 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const $ = require("jquery");
|
|
||||||
const riot = require("riot");
|
|
||||||
|
|
||||||
require("debug").enable("*");
|
|
||||||
|
|
||||||
require("../components/app");
|
|
||||||
|
|
||||||
$(() => {
|
|
||||||
riot.mount("*");
|
|
||||||
});
|
|
@ -1,8 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
change: function(data) {
|
|
||||||
Object.assign(this, data);
|
|
||||||
this.update();
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,58 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const riotQuery = require("riot-query");
|
|
||||||
const arrayDiff = require("arraydiff");
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
init: function() {
|
|
||||||
let knownTags = [];
|
|
||||||
let listeners = {};
|
|
||||||
|
|
||||||
function triggerEvent(action, query, item) {
|
|
||||||
if (listeners[query] != null && listeners[query][action] != null) {
|
|
||||||
listeners[query][action].forEach((handler) => {
|
|
||||||
handler(item);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this.on("updated", () => {
|
|
||||||
Object.keys(listeners).forEach((query) => {
|
|
||||||
let currentTags = riotQuery(this, query);
|
|
||||||
let diff = arrayDiff(knownTags, currentTags);
|
|
||||||
|
|
||||||
diff.forEach((item) => {
|
|
||||||
if (item.type === "remove") {
|
|
||||||
for (let i = item.index; i < (item.index + item.howMany); i++) {
|
|
||||||
triggerEvent("remove", query, knownTags[i]);
|
|
||||||
}
|
|
||||||
} else if (item.type === "move") {
|
|
||||||
for (let i = item.index; i < (item.from + item.howMany); i++) {
|
|
||||||
triggerEvent("move", query, knownTags[i]);
|
|
||||||
}
|
|
||||||
} else if (item.type === "insert") {
|
|
||||||
item.values.forEach((value) => {
|
|
||||||
triggerEvent("create", query, value);
|
|
||||||
})
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
knownTags = currentTags;
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
this.onChild = function(eventName, handler) {
|
|
||||||
let [action, query] = eventName.split(":", 2);
|
|
||||||
|
|
||||||
if (listeners[query] == null) {
|
|
||||||
listeners[query] = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (listeners[query][action] == null) {
|
|
||||||
listeners[query][action] = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
listeners[query][action].push(handler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,120 +0,0 @@
|
|||||||
const Promise = require("bluebird");
|
|
||||||
const pathToRegexp = require("path-to-regexp");
|
|
||||||
const url = require("url");
|
|
||||||
const xtend = require("xtend");
|
|
||||||
const defaultValue = require("default-value");
|
|
||||||
|
|
||||||
module.exports = function() {
|
|
||||||
let routes = [];
|
|
||||||
|
|
||||||
function addRoute(method, path, handler) {
|
|
||||||
// Mutable arguments? WTF.
|
|
||||||
let keys = [];
|
|
||||||
let regex = pathToRegexp(path, keys);
|
|
||||||
|
|
||||||
routes.push({ method, path, regex, keys, handler });
|
|
||||||
}
|
|
||||||
|
|
||||||
function getRoute(method, path) {
|
|
||||||
let matches;
|
|
||||||
let matchingRoute = routes.find((route) => route.method === method && (matches = route.regex.exec(path)));
|
|
||||||
|
|
||||||
if (matchingRoute == null) {
|
|
||||||
throw new Error("No matching routes found");
|
|
||||||
} else {
|
|
||||||
let params = {};
|
|
||||||
|
|
||||||
matchingRoute.keys.forEach((key, i) => {
|
|
||||||
params[key] = matches[i + 1];
|
|
||||||
});
|
|
||||||
|
|
||||||
return {
|
|
||||||
handler: matchingRoute.handler,
|
|
||||||
params: params
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function handle(method, uri, data) {
|
|
||||||
return Promise.try(() => {
|
|
||||||
let {path, query} = url.parse(uri, true);
|
|
||||||
let route = getRoute(method, path);
|
|
||||||
let tasks = [];
|
|
||||||
|
|
||||||
let req = {
|
|
||||||
path: path,
|
|
||||||
query: query,
|
|
||||||
body: data,
|
|
||||||
params: route.params,
|
|
||||||
pass: function(options = {}) {
|
|
||||||
// FIXME: window.fetch passthrough
|
|
||||||
},
|
|
||||||
passRender: function(viewName, options = {}) {
|
|
||||||
return Promise.try(() => {
|
|
||||||
return this.pass(options);
|
|
||||||
}).then((response) => {
|
|
||||||
let locals = defaultValue(options.locals, {});
|
|
||||||
let combinedLocals = xtend(locals, response.body);
|
|
||||||
|
|
||||||
res.render(viewName, combinedLocals, options);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let res = {
|
|
||||||
render: function(viewName, locals = {}, options = {}) {
|
|
||||||
tasks.push({
|
|
||||||
type: "render",
|
|
||||||
viewName, locals, options
|
|
||||||
});
|
|
||||||
},
|
|
||||||
open: function(path, options = {}) {
|
|
||||||
tasks.push({
|
|
||||||
type: "open",
|
|
||||||
path, options
|
|
||||||
});
|
|
||||||
},
|
|
||||||
close: function(options = {}) {
|
|
||||||
tasks.push({
|
|
||||||
type: "close",
|
|
||||||
options
|
|
||||||
});
|
|
||||||
},
|
|
||||||
notify: function(message, options = {}) {
|
|
||||||
tasks.push({
|
|
||||||
type: "notify",
|
|
||||||
message, options
|
|
||||||
});
|
|
||||||
},
|
|
||||||
error: function(error, context = {}) {
|
|
||||||
tasks.push({
|
|
||||||
type: "error",
|
|
||||||
error, context
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Promise.try(() => {
|
|
||||||
return route.handler(req, res);
|
|
||||||
}).then((result) => {
|
|
||||||
return {
|
|
||||||
result: result,
|
|
||||||
actions: tasks
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
let api = {
|
|
||||||
get: addRoute.bind(api, "get"),
|
|
||||||
post: addRoute.bind(api, "post"),
|
|
||||||
put: addRoute.bind(api, "put"),
|
|
||||||
delete: addRoute.bind(api, "delete"),
|
|
||||||
head: addRoute.bind(api, "head"),
|
|
||||||
patch: addRoute.bind(api, "patch"),
|
|
||||||
addRoute: addRoute,
|
|
||||||
handle: handle
|
|
||||||
}
|
|
||||||
|
|
||||||
return api;
|
|
||||||
}
|
|
@ -1,39 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const debounce = require("debounce");
|
|
||||||
const defaultValue = require("default-value");
|
|
||||||
|
|
||||||
const selectable = require("./selectable");
|
|
||||||
|
|
||||||
module.exports = function($) {
|
|
||||||
selectable($);
|
|
||||||
|
|
||||||
$.fn.draggable = function(options = {}) {
|
|
||||||
let debounceInterval = defaultValue(options.debounce, 10);
|
|
||||||
|
|
||||||
this.on("mousedown", (event) => {
|
|
||||||
let startX = event.pageX;
|
|
||||||
let startY = event.pageY;
|
|
||||||
|
|
||||||
let moveHandler = debounce((event) => {
|
|
||||||
this.trigger("draggable:move", [{
|
|
||||||
offsetX: event.pageX - startX,
|
|
||||||
offsetY: event.pageY - startY
|
|
||||||
}]);
|
|
||||||
}, debounceInterval);
|
|
||||||
|
|
||||||
$(document).on("mousemove", moveHandler);
|
|
||||||
|
|
||||||
$(document).one("mouseup", (event) => {
|
|
||||||
$(document).off("mousemove", moveHandler);
|
|
||||||
$(document).enableSelection();
|
|
||||||
|
|
||||||
this.trigger("draggable:end");
|
|
||||||
});
|
|
||||||
|
|
||||||
$(document).disableSelection();
|
|
||||||
|
|
||||||
this.trigger("draggable:start");
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,17 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
module.exports = function($) {
|
|
||||||
$.fn.disableSelection = function() {
|
|
||||||
return this
|
|
||||||
.attr("unselectable", "on")
|
|
||||||
.css("user-select", "none")
|
|
||||||
.on("selectstart", false);
|
|
||||||
}
|
|
||||||
|
|
||||||
$.fn.enableSelection = function() {
|
|
||||||
return this
|
|
||||||
.removeAttr("unselectable")
|
|
||||||
.css("user-select", "auto")
|
|
||||||
.off("selectstart", false);
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,130 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const elementSize = require("element-size");
|
|
||||||
const sortDockable = require("./util/sort-dockables");
|
|
||||||
|
|
||||||
function px(pixels) {
|
|
||||||
return `${pixels}px`;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
init: function() {
|
|
||||||
console.log("foo", this);
|
|
||||||
let dockableAPI = {
|
|
||||||
isActive: () => {
|
|
||||||
return (this.opts.dockableContainer != null);
|
|
||||||
},
|
|
||||||
stack: [],
|
|
||||||
fillElement: null,
|
|
||||||
recalculateLayout: () => {
|
|
||||||
dockableAPI.stack.forEach((item, i) => {
|
|
||||||
item.stackIndex = i;
|
|
||||||
});
|
|
||||||
|
|
||||||
let orderedStack = dockableAPI.stack.slice().sort(sortDockable);
|
|
||||||
|
|
||||||
let reservedLeft = 0;
|
|
||||||
let reservedRight = 0;
|
|
||||||
let reservedTop = 0;
|
|
||||||
let reservedBottom = 0;
|
|
||||||
|
|
||||||
orderedStack.forEach((item) => {
|
|
||||||
let element = item.tag.root;
|
|
||||||
|
|
||||||
/* We set the positioning to absolute *before* attempting
|
|
||||||
* to obtain the element size - this way, we can be sure
|
|
||||||
* that the element won't try to stretch to its container.
|
|
||||||
* Instead, it'll be auto-sized, which is exactly what we
|
|
||||||
* want. */
|
|
||||||
element.style.position = "absolute";
|
|
||||||
|
|
||||||
let [width, height] = elementSize(element);
|
|
||||||
|
|
||||||
if (item.heightHint != null) {
|
|
||||||
height = item.heightHint;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item.widthHint != null) {
|
|
||||||
width = item.widthHint;
|
|
||||||
}
|
|
||||||
|
|
||||||
// FIXME: Should the following really be errors?
|
|
||||||
if ((item.side === "left" || item.side === "right") && width === 0) {
|
|
||||||
throw new Error("Cannot horizontally dock an element without a width; you may need to specify a dock-width");
|
|
||||||
} else if ((item.side === "top" || item.side === "bottom") && height === 0) {
|
|
||||||
throw new Error("Cannot vertically dock an element without a height; you may need to specify a dock-height");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item.side === "left") {
|
|
||||||
Object.assign(element.style, {
|
|
||||||
left: px(reservedLeft),
|
|
||||||
top: px(reservedTop),
|
|
||||||
bottom: px(reservedBottom)
|
|
||||||
});
|
|
||||||
|
|
||||||
delete element.style.right;
|
|
||||||
|
|
||||||
reservedLeft += width;
|
|
||||||
} else if (item.side === "right") {
|
|
||||||
Object.assign(element.style, {
|
|
||||||
right: px(reservedRight),
|
|
||||||
top: px(reservedTop),
|
|
||||||
bottom: px(reservedBottom)
|
|
||||||
});
|
|
||||||
|
|
||||||
delete element.style.left;
|
|
||||||
|
|
||||||
reservedRight += width;
|
|
||||||
} else if (item.side === "top") {
|
|
||||||
Object.assign(element.style, {
|
|
||||||
left: px(reservedLeft),
|
|
||||||
right: px(reservedRight),
|
|
||||||
top: px(reservedTop)
|
|
||||||
});
|
|
||||||
|
|
||||||
delete element.style.bottom;
|
|
||||||
|
|
||||||
reservedTop += height;
|
|
||||||
} else if (item.side === "bottom") {
|
|
||||||
Object.assign(element.style, {
|
|
||||||
left: px(reservedLeft),
|
|
||||||
right: px(reservedRight),
|
|
||||||
bottom: px(reservedBottom)
|
|
||||||
});
|
|
||||||
|
|
||||||
delete element.style.top;
|
|
||||||
|
|
||||||
reservedBottom += height;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("reserved", reservedLeft, reservedRight, reservedTop, reservedBottom);
|
|
||||||
})
|
|
||||||
|
|
||||||
let item = dockableAPI.fillElement;
|
|
||||||
|
|
||||||
if (item != null) {
|
|
||||||
let element = item.root;
|
|
||||||
|
|
||||||
Object.assign(element.style, {
|
|
||||||
position: "absolute",
|
|
||||||
left: px(reservedLeft),
|
|
||||||
right: px(reservedRight),
|
|
||||||
top: px(reservedTop),
|
|
||||||
bottom: px(reservedBottom)
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("ordered stack", orderedStack);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
this._uikitDockableContainer = dockableAPI;
|
|
||||||
|
|
||||||
this.on("mount", () => {
|
|
||||||
console.log("dockable-container mounted");
|
|
||||||
if (dockableAPI.isActive()) {
|
|
||||||
dockableAPI.recalculateLayout();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,52 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
const inArray = require("in-array");
|
|
||||||
|
|
||||||
function findContainer(tag) {
|
|
||||||
let lastTag = tag;
|
|
||||||
let dockableContainer;
|
|
||||||
|
|
||||||
while (dockableContainer == null && lastTag != null) {
|
|
||||||
let candidate = lastTag.parent;
|
|
||||||
|
|
||||||
if (candidate != null && candidate._uikitDockableContainer != null && candidate._uikitDockableContainer.isActive()) {
|
|
||||||
dockableContainer = candidate;
|
|
||||||
} else {
|
|
||||||
lastTag = candidate;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (dockableContainer != null) {
|
|
||||||
return dockableContainer;
|
|
||||||
} else {
|
|
||||||
// FIXME: Better error reporting?
|
|
||||||
throw new Error("Could not find a dockable container for tag");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
init: function() {
|
|
||||||
if (this.opts.dock != null) {
|
|
||||||
let dockableContainer = findContainer(this);
|
|
||||||
let containerData = dockableContainer._uikitDockableContainer;
|
|
||||||
|
|
||||||
if (inArray(["bottom", "top", "left", "right"], this.opts.dock)) {
|
|
||||||
containerData.stack.push({
|
|
||||||
tag: this,
|
|
||||||
side: this.opts.dock,
|
|
||||||
order: this.opts.dockOrder,
|
|
||||||
widthHint: this.opts.dockWidth,
|
|
||||||
heightHint: this.opts.dockHeight
|
|
||||||
});
|
|
||||||
} else if (this.opts.dock === "fill") {
|
|
||||||
if (containerData.fillElement != null) {
|
|
||||||
throw new Error("There can be only one tag with a `dock` setting of `fill` within a dockable container");
|
|
||||||
} else {
|
|
||||||
containerData.fillElement = this;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
throw new Error("Invalid `dock` property; must be one of bottom, top, left, right, fill");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,35 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
module.exports = function(a, b) {
|
|
||||||
let aOrder, bOrder;
|
|
||||||
|
|
||||||
if (a.order != null) {
|
|
||||||
aOrder = parseInt(a.order);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (b.order != null) {
|
|
||||||
bOrder = parseInt(b.order);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (aOrder != null && bOrder == null) {
|
|
||||||
return -1;
|
|
||||||
} else if (aOrder == null && bOrder != null) {
|
|
||||||
return 1;
|
|
||||||
} else if (aOrder != null && bOrder != null) {
|
|
||||||
if (aOrder < bOrder) {
|
|
||||||
return -1;
|
|
||||||
} else if (aOrder > bOrder) {
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (a.stackIndex < b.stackIndex) {
|
|
||||||
return -1;
|
|
||||||
} else if (a.stackIndex > b.stackIndex) {
|
|
||||||
return 1;
|
|
||||||
} else {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,19 +0,0 @@
|
|||||||
let router = require("express-promise-router")();
|
|
||||||
|
|
||||||
router.get("/", (req, res) => {
|
|
||||||
res.render("layout");
|
|
||||||
});
|
|
||||||
|
|
||||||
router.get("/node/:uuid", (req, res) => {
|
|
||||||
res.json({uuid: req.params.uuid});
|
|
||||||
});
|
|
||||||
|
|
||||||
router.get("/test1", (req, res) => {
|
|
||||||
res.send("test ONE <a href='/test2'>go to 2 instead</a> <a href='/test2' target='_blank'>or in a new window</a>");
|
|
||||||
});
|
|
||||||
|
|
||||||
router.get("/test2", (req, res) => {
|
|
||||||
res.send("test TWO <a href='/test1'>go to 1 instead</a> <a href='/test1' target='_blank'>or in a new window</a>");
|
|
||||||
});
|
|
||||||
|
|
||||||
module.exports = router;
|
|
@ -1,14 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("../../../components/uikit/frame");
|
|
||||||
require("../../../components/uikit/toolbar");
|
|
||||||
require("../../../components/uikit/button");
|
|
||||||
require("../../../components/uikit/form-section");
|
|
||||||
require("../../../components/uikit/input-spawner");
|
|
||||||
require("../../../components/uikit/input");
|
|
||||||
require("../../../components/uikit/textarea");
|
|
||||||
require("../../../components/uikit/autocomplete");
|
|
||||||
|
|
||||||
require("../../../components/window-meta");
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -1,3 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
require("./component");
|
|
@ -0,0 +1,14 @@
|
|||||||
|
'use strict';
|
||||||
|
|
||||||
|
require("../../../../components/uikit/frame");
|
||||||
|
require("../../../../components/uikit/toolbar");
|
||||||
|
require("../../../../components/uikit/button");
|
||||||
|
require("../../../../components/uikit/form-section");
|
||||||
|
require("../../../../components/uikit/input-spawner");
|
||||||
|
require("../../../../components/uikit/input");
|
||||||
|
require("../../../../components/uikit/textarea");
|
||||||
|
require("../../../../components/uikit/autocomplete");
|
||||||
|
|
||||||
|
require("../../../../components/window-meta");
|
||||||
|
|
||||||
|
require("./component");
|
Loading…
Reference in New Issue