|
@@ -0,0 +1,2251 @@
|
|
|
+var EventEmitter = require("events").EventEmitter;
|
|
|
+
|
|
|
+var opath = require("opath");
|
|
|
+var async = require("async");
|
|
|
+
|
|
|
+var tool = require("tools2")();
|
|
|
+
|
|
|
+var getthezip = require("libs/getthezip");
|
|
|
+var unpackzip = require("libs/unpackzip");
|
|
|
+var generatezip = require("libs/generatezip");
|
|
|
+var random = require("sharedkey-thing").randoma(0xbadebabe)("#CHANGE BEFORE CHRISTMAS#");
|
|
|
+var _ = require("lodash");
|
|
|
+var templates = require("./templates");
|
|
|
+
|
|
|
+var ignores =
|
|
|
+ "_created _data _events _extends _hasa _inherits _isa _maxListeners _metas _references _relations _rootname addListener children data data2 domain emit emita emitas eventNames export export2 exportFlatSync exportSerialised exportSync exporta extends getMaxListeners getStuff getStuff2 getStuff3 inherits innerExport isa listenerCount listeners metas metas2 metas3 name on once parents path pickdeep pingup prependListener prependOnceListener rawListeners relatesAsToWith removeAllListeners removeListener setMaxListeners test unextends uninherits unisa withAll withAllSync"
|
|
|
+ .split(" ");
|
|
|
+
|
|
|
+function template_helpers(self) {
|
|
|
+ return {
|
|
|
+ "toTextArea": function(str) {
|
|
|
+ return '<textarea>' + str + '</textarea>'
|
|
|
+ },
|
|
|
+ "toWrap": function(str, tag, attr) {
|
|
|
+ return '<' + tag + ' ' + attr + '>' + str + '</' + tag + '>';
|
|
|
+ },
|
|
|
+ toLowerCase: function(str) {
|
|
|
+ return str.toLowerCase();
|
|
|
+ },
|
|
|
+ toUpperCase: function(str) {
|
|
|
+ return str.toUpperCase();
|
|
|
+ },
|
|
|
+ "pagecontent": function(obj) {
|
|
|
+ console.log("pagecontent", obj, arguments);
|
|
|
+ return self.template(obj._data.content, obj);
|
|
|
+ },
|
|
|
+ "siblings": function(obj) {
|
|
|
+ return [_.keys(obj.parents).shift()].map(function(parentpath) {
|
|
|
+ var ares = _.map(obj.parents[parentpath] ? obj.parents[parentpath].children : [], function(a) {
|
|
|
+ return a();
|
|
|
+ })
|
|
|
+ ares.sort(sorter(function(a) {
|
|
|
+ return a._metas.menu_order || 100
|
|
|
+ }, -1));
|
|
|
+ var ss = _.map(ares, function(child, name) {
|
|
|
+ return child.path
|
|
|
+ });
|
|
|
+ if (ss.length > 12) {
|
|
|
+ var cindex = ss.indexOf(obj.path);
|
|
|
+ cindex = cindex < 6 ? 6 : cindex;
|
|
|
+ var spp = _.map(ares, renderlin(obj))
|
|
|
+ var sasa = [].concat(spp.slice(cindex - 6, cindex + 7))
|
|
|
+ } else {
|
|
|
+ var sasa = _.map(ares, renderlin(obj))
|
|
|
+ }
|
|
|
+ return sasa.join("\n")
|
|
|
+ }).join("\n")
|
|
|
+ },
|
|
|
+ "parents": function(obj, ss_, sss_) {
|
|
|
+ if (typeof(ss_) !== "undefined" && typeof(sss_) !== "undefined") {
|
|
|
+ return gpath(obj, []).slice(parseInt(ss_), parseInt(sss_)).map(function(p, i) {
|
|
|
+ return '<a href="#' + p + '" elepath="' + p + '" class="ele elecontent button button-rounded button-' + (i == 0 ? 'small' : 'tiny') + ' button-royal">' +
|
|
|
+ self.oget(p +
|
|
|
+ "/._data.title", p) + '</a>';
|
|
|
+ }).join("\n");
|
|
|
+ } else {
|
|
|
+ return gpath(obj, []).slice(1).map(function(p, i) {
|
|
|
+ return '<a href="#' + p + '" elepath="' + p + '" class="ele elecontent button button-rounded button-' + (i == 0 ? 'small' : 'tiny') + ' button-royal">' +
|
|
|
+ self.oget(p +
|
|
|
+ "/._data.title", p) + '</a>';
|
|
|
+ }).join("\n");
|
|
|
+ }
|
|
|
+ },
|
|
|
+ "parent": function(obj) {
|
|
|
+ return _.map(obj.parents, function(par, nam) {
|
|
|
+ self.rendertemplate(par)
|
|
|
+ }).join("\n");
|
|
|
+ },
|
|
|
+ "children2": function(obj) {
|
|
|
+ var ret = [];
|
|
|
+ _.map(obj.children, function(child) {
|
|
|
+ var cho = typeof(child) === "function" ? child() : child;
|
|
|
+ ret.push(self.rendertemplate(cho))
|
|
|
+ })
|
|
|
+ return ret.join("\n")
|
|
|
+ },
|
|
|
+ "children": function(obj) {
|
|
|
+ var ret = [];
|
|
|
+ _.map(obj.children, function(child) {
|
|
|
+ var cho = typeof(child) === "function" ? child() : child;
|
|
|
+ ret.push(renderlin(cho)(cho, cho.name))
|
|
|
+ })
|
|
|
+ return ret.join("\n");
|
|
|
+ },
|
|
|
+ "relations": function(obj) {
|
|
|
+ var stash = [];
|
|
|
+ _.map(obj._relations, function(rels, relname) {
|
|
|
+ var relators = _.keys(rels);
|
|
|
+ var sss = relators.slice(0, 25).map(function(relator) {
|
|
|
+ return '<li elepath="' + relator + '"><a href="#' + relator + '" class="elecontent" title="' + JSON.stringify(rels[relator].context).toHtmlEntities() +
|
|
|
+ '">' + relator + '</a> </li> '
|
|
|
+ }).join("\n");;
|
|
|
+ stash.push([relname + "(" + relators.length + ")", sss]);
|
|
|
+ })
|
|
|
+ var ss = ('<div class="stash">' + stash.map(function(a) {
|
|
|
+ return '<div class="stt"> <div class="st1">' + (a[0] === false ? "" : a[0] + "") + '</div><div class="st2">' + a[1] +
|
|
|
+ '</div> </div>'
|
|
|
+ }).join("\n") + '</div>');
|
|
|
+ return ss
|
|
|
+ },
|
|
|
+ "grandchildren": function(obj) {
|
|
|
+ var ret = [];
|
|
|
+ _.map(obj.children, function(child) {
|
|
|
+ var cho = typeof(child) === "function" ? child() : child;
|
|
|
+ ret = [].concat.apply(ret, _.map(cho.children, renderlin(cho)))
|
|
|
+ })
|
|
|
+ return ret
|
|
|
+ },
|
|
|
+ "created": function(obj) {
|
|
|
+ return obj._created.toJSON();
|
|
|
+ },
|
|
|
+ "_isa": function(obj) {
|
|
|
+ return _.map(obj._isa, renderlin(obj)).join("\n")
|
|
|
+ },
|
|
|
+ "_isa2": function(obj) {
|
|
|
+ return _.map(obj._isa, function(o, n) {
|
|
|
+ return self.rendertemplate(o)
|
|
|
+ }).join("\n")
|
|
|
+ },
|
|
|
+ "_isa3": function(obj, a, b) {
|
|
|
+ console.log(";;;;;;;;;;;", a, b);
|
|
|
+ return _.map(obj._isa, function(o, n) {
|
|
|
+ return self.rendertemplate(o)
|
|
|
+ }).slice(parseInt(a), parseInt(b)).join("\n")
|
|
|
+ },
|
|
|
+ "_hasa": function(obj) {
|
|
|
+ return _.map(obj._hasa, renderlin(obj)).join("\n")
|
|
|
+ },
|
|
|
+ "findall": function(obj, withprop, target_) {
|
|
|
+ var target = target_ || "content";
|
|
|
+ var aa = []
|
|
|
+ _.keys(self.oo).filter(aa => ["trash", "system", ""].indexOf(aa) === -1 && typeof(self.oo[aa]) === "function").map(function(key) {
|
|
|
+
|
|
|
+ aa = [].concat.apply(aa, allchildren(self.oo[key]()).filter(function(a) {
|
|
|
+ return a._isdirty
|
|
|
+ }))
|
|
|
+ })
|
|
|
+ return aa.map(function(a) {
|
|
|
+ return renderlin2(obj, {
|
|
|
+ target: target
|
|
|
+ })(a, a.name)
|
|
|
+ }).join("\n");
|
|
|
+ },
|
|
|
+ "jsondata": function(obj) {
|
|
|
+ return JSON.stringify(obj._data, true, 2).toHtmlEntities();
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function gpath(cc, p) {
|
|
|
+ if (cc.parents) {
|
|
|
+ var k = _.keys(cc.parents).shift();
|
|
|
+ if (k) {
|
|
|
+ return gpath(cc.parents[k], p.concat(cc.path))
|
|
|
+ } else {
|
|
|
+ return p.concat(cc.path)
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function renderlin2(obj, opt) {
|
|
|
+ return function(child, name) {
|
|
|
+ var pp = typeof(child) === "function" ? child() : child;
|
|
|
+ return '<a href="#' + pp.path + '" elepath="' + pp.path + '" eletarget="' + opt.target + '" class="elecontent button button-rounded button-small button-' + (pp.path ==
|
|
|
+ obj.path ? 'royal' : 'inverse') +
|
|
|
+ '">' + (pp._data.title ?
|
|
|
+ pp._data.title : pp.name) +
|
|
|
+ '</a>'
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function renderlin(obj) {
|
|
|
+ return function(child, name) {
|
|
|
+ var pp = typeof(child) === "function" ? child() : child;
|
|
|
+ return '<a href="#' + pp.path + '" elepath="' + pp.path + '" class="elecontent button button-rounded button-small button-' + (pp.path == obj.path ? 'royal' : 'inverse') +
|
|
|
+ '">' + (pp._data.title ?
|
|
|
+ pp._data.title : pp.name) +
|
|
|
+ '</a>'
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function Asystem(oo) {
|
|
|
+ this.oo = oo;
|
|
|
+ this.name = "noname"
|
|
|
+ this._logs = [];
|
|
|
+ this._linked = {};
|
|
|
+ this._templatefunction = templates(this, template_helpers(this));
|
|
|
+}
|
|
|
+Asystem.prototype.__proto__ = EventEmitter.prototype;
|
|
|
+
|
|
|
+Asystem.prototype.slugger = function(str) {
|
|
|
+ var ret = ("" + str).replace(/\/+/g, '/').replace(/[^\x20-\x7E]/g, '')
|
|
|
+ // ret=decodeURIComponent(ret);
|
|
|
+ ret = ret.replace(/[\<\>]/g, '')
|
|
|
+ if (ret.indexOf("/") == ret.length - 1) {
|
|
|
+ ret = ret.substring(0, ret.length - 1);
|
|
|
+ }
|
|
|
+ return ret
|
|
|
+}
|
|
|
+
|
|
|
+Asystem.prototype.t_content = function(path) {
|
|
|
+ return this.oget(path)._data.content
|
|
|
+}
|
|
|
+
|
|
|
+Asystem.prototype.odelete = function(path) {
|
|
|
+ var self = this;
|
|
|
+ self.omove(path, "trash/" + path)
|
|
|
+ if (self.oo[path]) {
|
|
|
+ _.map(self.oo[path]().children, function(child, name) {
|
|
|
+ self.odelete(child().path)
|
|
|
+ })
|
|
|
+ delete self.oo[path]
|
|
|
+ }
|
|
|
+ self.emit("deleted", path)
|
|
|
+}
|
|
|
+Asystem.prototype.ozap = function(path) {
|
|
|
+ var t = path.split("/");
|
|
|
+ var ta = t.pop();
|
|
|
+ delete this.oget(t.join("/")).children[ta];
|
|
|
+ this.emit("deleted", path)
|
|
|
+}
|
|
|
+Asystem.prototype.omove = function(path, topath) {
|
|
|
+ var self = this;
|
|
|
+ var newa = self.oget(topath)
|
|
|
+ var olda = self.oget(path);
|
|
|
+ var ss = olda.exportSync();
|
|
|
+ if (!ss) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ ss.name = topath.split("/").pop();
|
|
|
+ ss.path = topath;
|
|
|
+ var np = topath.split("/")
|
|
|
+ np.pop();
|
|
|
+ _.map(olda._relations, function(rels, relsname) {
|
|
|
+ _.map(rels, function(rel, name) {
|
|
|
+ delete rel.ref._relations[rel.context.out]
|
|
|
+ })
|
|
|
+ delete olda._relations[relsname]
|
|
|
+ })
|
|
|
+ _.map(olda._isa, function(isa, name) {
|
|
|
+ delete isa._hasa[name]
|
|
|
+ delete olda._isa[name]
|
|
|
+ })
|
|
|
+ _.map(olda._hasa, function(hasa, name) {
|
|
|
+ delete hasa._isa[olda.path]
|
|
|
+ delete olda._hasa[name]
|
|
|
+ })
|
|
|
+ _.map(olda._inherits, function(inheri, name) {
|
|
|
+ delete inheri._extends[olda.path]
|
|
|
+ delete olda._inherits[name]
|
|
|
+ })
|
|
|
+ _.map(olda._extends, function(extendi, name) {
|
|
|
+ delete extendi._inherits[olda.path]
|
|
|
+ delete olda._extends[name]
|
|
|
+ })
|
|
|
+ _.map(olda.parents, function(par, nam) {
|
|
|
+ delete par.children[olda.name];
|
|
|
+ })
|
|
|
+ _.keys(olda.children, function(key) {
|
|
|
+ delete olda.children[key];
|
|
|
+ })
|
|
|
+ delete olda;
|
|
|
+ self.rev_conv2(ss, np.join("/"));
|
|
|
+ self.emit("moved", path, topath)
|
|
|
+}
|
|
|
+Asystem.prototype.oclone = function(path, topath) {
|
|
|
+ var self = this;
|
|
|
+ var newa = self.oget(topath)
|
|
|
+ var olda = self.oget(path);
|
|
|
+ var ss = olda.exportSync();
|
|
|
+ ss.name = topath.split("/").pop();
|
|
|
+ ss.path = topath;
|
|
|
+ var np = topath.split("/")
|
|
|
+ np.pop();
|
|
|
+ self.rev_conv2(ss, np.join("/"));
|
|
|
+ self.emit("cloned", path, topath)
|
|
|
+}
|
|
|
+Asystem.prototype.oset = function(path_, data) {
|
|
|
+ var self = this;
|
|
|
+ var path = self.slugger(path_);
|
|
|
+ var ar = path.split("/");
|
|
|
+ var first = ar.shift();
|
|
|
+ var prop, obj;
|
|
|
+ if (typeof(self.oo[first]) === "undefined") {
|
|
|
+ self.oo[first] = self.oo(first);
|
|
|
+ self.oo[first]()._isdirty = true;
|
|
|
+ self.emit("rootcreated", self.oo[first]())
|
|
|
+ }
|
|
|
+ if (ar.length > 0 && ar[ar.length - 1].indexOf(".") === 0) {
|
|
|
+ prop = ar.pop().substring(1);
|
|
|
+ }
|
|
|
+ path = ar.join("/")
|
|
|
+ if (path !== "") {
|
|
|
+ var exists = self.ofind(path_);
|
|
|
+ if (exists.remainder !== "") {
|
|
|
+ obj = self.oo[first](path)();
|
|
|
+ self.emit("created1", obj)
|
|
|
+ } else {
|
|
|
+ obj = self.oo[first](path)();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ obj = self.oo[first]()
|
|
|
+ }
|
|
|
+ if (prop) {
|
|
|
+ obj._isdirty = true;
|
|
|
+ opath.set(obj, prop, data);
|
|
|
+ //return obj[prop] || getpath(obj, prop)
|
|
|
+ self.emit("changed", obj.path + "/" + prop, data)
|
|
|
+ }
|
|
|
+ return obj;
|
|
|
+}
|
|
|
+Asystem.prototype.ogetsilent = function(path_, alternative) {
|
|
|
+ var self = this;
|
|
|
+ var path = self.slugger(path_);
|
|
|
+ var ar = path.split("/");
|
|
|
+ var first = ar.shift();
|
|
|
+ var prop, obj;
|
|
|
+ if (typeof(self.oo[first]) === "undefined") {
|
|
|
+ self.oo[first] = self.oo(first);
|
|
|
+ }
|
|
|
+ if (ar.length > 0 && ar[ar.length - 1].indexOf(".") === 0) {
|
|
|
+ prop = ar.pop().substring(1);
|
|
|
+ }
|
|
|
+ path = ar.join("/")
|
|
|
+ if (path !== "") {
|
|
|
+ var exists = self.ofind(path_);
|
|
|
+ if (exists.remainder !== "") {
|
|
|
+ obj = self.oo[first](path)();
|
|
|
+ } else {
|
|
|
+ obj = self.oo[first](path)();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ obj = self.oo[first]()
|
|
|
+ }
|
|
|
+ if (prop) {
|
|
|
+ return obj[prop] || opath.get(obj, prop) || alternative;
|
|
|
+ }
|
|
|
+ return obj;
|
|
|
+}
|
|
|
+Asystem.prototype.oget = function(path_, alternative) {
|
|
|
+ var self = this;
|
|
|
+ var path = self.slugger(path_);
|
|
|
+ var ar = path.split("/");
|
|
|
+ var first = ar.shift();
|
|
|
+ var prop, obj;
|
|
|
+ if (typeof(self.oo[first]) === "undefined") {
|
|
|
+ self.oo[first] = self.oo(first);
|
|
|
+ self.oo[first]()._isdirty = true;
|
|
|
+ self.emit("rootcreated", self.oo(first)())
|
|
|
+ }
|
|
|
+ if (ar.length > 0 && ar[ar.length - 1].indexOf(".") === 0) {
|
|
|
+ prop = ar.pop().substring(1);
|
|
|
+ }
|
|
|
+ path = ar.join("/")
|
|
|
+ if (path !== "") {
|
|
|
+ var exists = self.ofind(path_);
|
|
|
+ if (exists.remainder !== "" && exists.remainder.indexOf("/") > -1) {
|
|
|
+ obj = self.oo[first](path)();
|
|
|
+ obj._isdirty = true;
|
|
|
+ self.emit("created2", obj)
|
|
|
+ } else {
|
|
|
+ obj = self.oo[first](path)();
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ obj = self.oo[first]()
|
|
|
+ }
|
|
|
+ if (prop) {
|
|
|
+ return obj[prop] || opath.get(obj, prop) || alternative;
|
|
|
+ }
|
|
|
+ return obj;
|
|
|
+}
|
|
|
+Asystem.prototype.getele = function(action) {
|
|
|
+ var self = this;
|
|
|
+ action = self.slugger(action);
|
|
|
+ var a = action.split("/");
|
|
|
+ var roo = a.shift();
|
|
|
+ var ffu;
|
|
|
+ if (a[a.length - 1].indexOf(".") > -1) {
|
|
|
+ //function call;
|
|
|
+ ffu = a.pop().split(".").pop();
|
|
|
+ } else {
|
|
|
+ //straight
|
|
|
+ }
|
|
|
+ var name = a.join("/");
|
|
|
+ var eles = self.oo[roo](name)();
|
|
|
+
|
|
|
+ if (ffu && eles[ffu]) {
|
|
|
+ return {
|
|
|
+ ele: eles,
|
|
|
+ func: eles[ffu]
|
|
|
+ };
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ ele: eles
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+Asystem.prototype.ofind = function(path) {
|
|
|
+ /* returns {found: "spath"|false , remainder: "rest"|"" , obj: obj}*/
|
|
|
+ var self = this;
|
|
|
+ path = self.slugger(path);
|
|
|
+ var ar = path.split("/");
|
|
|
+ var first = ar.shift();
|
|
|
+ if (typeof(self.oo[first]) === "undefined") {
|
|
|
+ return {
|
|
|
+ found: false
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ var pa = self.oo[first]()
|
|
|
+ var ch = "";
|
|
|
+ var rest = [];
|
|
|
+ while (ar.length) {
|
|
|
+ ch = ar.shift();
|
|
|
+ if (pa.children[ch]) {
|
|
|
+ pa = pa.children[ch]();
|
|
|
+ } else {
|
|
|
+ rest.push(ch)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return {
|
|
|
+ found: pa.path,
|
|
|
+ /* is false if not found*/
|
|
|
+ remainder: rest.join("/"),
|
|
|
+ /* is not "" if not found rest of path*/
|
|
|
+ obj: pa /* the found object*/
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+Asystem.prototype.rev_conv = function(obj, path) {
|
|
|
+ if (typeof(obj) !== "object" || obj == null) {
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ var self = this;
|
|
|
+ var zzz = self.ogetsilent(obj.path);
|
|
|
+ zzz.data(obj.data)
|
|
|
+ zzz._created = new Date(obj.created);
|
|
|
+
|
|
|
+ zzz.metas(obj.meta);
|
|
|
+
|
|
|
+ if (_.size(obj.rel) > 0) {
|
|
|
+ _.map(obj.rel, function(rels, name) {
|
|
|
+ _.map(rels, function(dats, relator) {
|
|
|
+ if (name === dats.in) {} else {
|
|
|
+ // console.log("RR: ", obj.path, relator, name, dats.in, dats.out);
|
|
|
+ zzz.relatesAsToWith(dats.out, self.ogetsilent(relator), dats.in, dats)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (obj.inherits && obj.inherits.length) {
|
|
|
+ obj.inherits.map(function(alp) {
|
|
|
+ zzz.inherits(self.ogetsilent(alp))
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (obj.extends && obj.extends.length) {
|
|
|
+ obj.extends.map(function(alp) {
|
|
|
+ zzz.extends(self.ogetsilent(alp))
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (obj.isa && obj.isa.length) {
|
|
|
+ obj.isa.map(function(alp) {
|
|
|
+ zzz.isa(self.ogetsilent(alp))
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (obj.hasa && obj.hasa.length) {
|
|
|
+ obj.hasa.map(function(alp) {
|
|
|
+ self.ogetsilent(alp).isa(zzz)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ _.map(_.omit(obj, ["getStuff3", "name", "hasa", "meta", "data", "parents", "children", "path", "_rootname", "created", "rel", "inherits", "extends", "isa", "children",
|
|
|
+ "_isdirty"
|
|
|
+ ]),
|
|
|
+ function(
|
|
|
+ val,
|
|
|
+ ke) {
|
|
|
+ if (typeof(val) === "string" && val.indexOf("$$$FUNCTION$$$") === 0) {
|
|
|
+ if (zzz._metas && zzz._metas.protected && zzz._metas.protected[ke]) {} else {
|
|
|
+ var ttt = {};
|
|
|
+ try {
|
|
|
+ eval("(function(tt){ tt.func = " + val.split("$$$FUNCTION$$$").pop() + ";})(ttt)");
|
|
|
+ zzz[ke] = ttt.func;
|
|
|
+ } catch (ea) {
|
|
|
+ console.log("error func: ", ea)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (typeof(val) === "object") {
|
|
|
+ var r = {}
|
|
|
+ _.map(val, function(v, kp) {
|
|
|
+ if (typeof(v) === "string" && v.indexOf("$$$FUNCTION$$$") === 0) {
|
|
|
+ var ttt = {};
|
|
|
+ try {
|
|
|
+ eval("(function(tt){ tt.func = " + v.split("$$$FUNCTION$$$").pop() + ";})(ttt)");
|
|
|
+ r[kp] = ttt.func;
|
|
|
+ } catch (ea) {
|
|
|
+ console.log("error func: ", ea)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ r[kp] = v
|
|
|
+ }
|
|
|
+ })
|
|
|
+ zzz[ke] = r;
|
|
|
+ } else {
|
|
|
+ zzz[ke] = val
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ delete obj._isdirty;
|
|
|
+ if (obj.children && obj.children.length) {
|
|
|
+ obj.children.map(function(child) {
|
|
|
+ self.rev_conv(child)
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+Asystem.prototype.rev_conv2 = function(obj, path) {
|
|
|
+ var self = this;
|
|
|
+ var zzz = self.ogetsilent(path + "/" + obj.name);
|
|
|
+ zzz.data(obj.data)
|
|
|
+ zzz._created = new Date(obj.created);
|
|
|
+ zzz.metas(obj.meta);
|
|
|
+ if (_.size(obj.rel) > 0) {
|
|
|
+ _.map(obj.rel, function(rels, name) {
|
|
|
+ _.map(rels, function(dats, relator) {
|
|
|
+ if (name === dats.in) {} else {
|
|
|
+ // console.log("RR: ", obj.path, relator, name, dats.in, dats.out);
|
|
|
+ zzz.relatesAsToWith(dats.out, self.ogetsilent(relator), dats.in, dats)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (obj.inherits && obj.inherits.length) {
|
|
|
+ obj.inherits.map(function(alp) {
|
|
|
+ zzz.inherits(self.ogetsilent(alp))
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (obj.extends && obj.extends.length) {
|
|
|
+ obj.extends.map(function(alp) {
|
|
|
+ zzz.extends(self.ogetsilent(alp))
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (obj.isa && obj.isa.length) {
|
|
|
+ obj.isa.map(function(alp) {
|
|
|
+ zzz.isa(self.ogetsilent(alp))
|
|
|
+ })
|
|
|
+ }
|
|
|
+ if (obj.hasa && obj.hasa.length) {
|
|
|
+ obj.hasa.map(function(alp) {
|
|
|
+ self.ogetsilent(alp).isa(zzz)
|
|
|
+ })
|
|
|
+ }
|
|
|
+ _.map(_.omit(obj, ["getStuff3", "name", "hasa", "meta", "data", "parents", "children", "path", "_rootname", "created", "rel", "inherits", "extends", "isa", "children",
|
|
|
+ "_isdirty"
|
|
|
+ ]),
|
|
|
+ function(
|
|
|
+ val,
|
|
|
+ ke) {
|
|
|
+ if (typeof(val) === "string" && val.indexOf("$$$FUNCTION$$$") === 0) {
|
|
|
+ // console.log(val.split("$$$FUNCTION$$$").pop())
|
|
|
+ if (zzz._metas && zzz._metas.protected && zzz._metas.protected[ke]) {} else {
|
|
|
+ var ttt = {};
|
|
|
+ try {
|
|
|
+ eval("(function(tt){ tt.func = " + val.split("$$$FUNCTION$$$").pop() + ";})(ttt)");
|
|
|
+ zzz[ke] = ttt.func;
|
|
|
+ } catch (ea) {
|
|
|
+ console.log("error func: ", ea)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ if (typeof(val) === "object") {
|
|
|
+ var r = {}
|
|
|
+ _.map(val, function(v, kp) {
|
|
|
+ if (typeof(v) === "string" && v.indexOf("$$$FUNCTION$$$") === 0) {
|
|
|
+ var ttt = {};
|
|
|
+ try {
|
|
|
+ eval("(function(tt){ tt.func = " + v.split("$$$FUNCTION$$$").pop() + ";})(ttt)");
|
|
|
+ r[kp] = ttt.func;
|
|
|
+ } catch (ea) {
|
|
|
+ console.log("error func: ", ea)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ r[kp] = v
|
|
|
+ }
|
|
|
+ })
|
|
|
+ zzz[ke] = r;
|
|
|
+ } else {
|
|
|
+ zzz[ke] = val
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ delete obj._isdirty;
|
|
|
+ if (obj.children && obj.children.length) {
|
|
|
+ obj.children.map(function(child) {
|
|
|
+ self.rev_conv2(child, zzz.path)
|
|
|
+ })
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/*Asystem.prototype.save = function() {
|
|
|
+ var self = this;
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ $lib.exporter(self, function(err, data) {
|
|
|
+ $lib.generate_thezip(self.name + "-" + $lib.getTimedName() + ".zip",
|
|
|
+ $lib.arrayedToObject(data, "name"), function(err, zz) {
|
|
|
+ console.log(err);
|
|
|
+ resolve(zz)
|
|
|
+ })
|
|
|
+ })
|
|
|
+ })
|
|
|
+}
|
|
|
+*/
|
|
|
+
|
|
|
+Asystem.prototype.exporter = function(cb) {
|
|
|
+ var self = this;
|
|
|
+ var obj = self.oo;
|
|
|
+ var stores = _.keys(obj).filter(function(a) {
|
|
|
+ return typeof(obj[a]) === "function"
|
|
|
+ }).map(function(a) {
|
|
|
+ return obj[a]()
|
|
|
+ }).map(function(a) {
|
|
|
+ var da = a.exportSync("");
|
|
|
+ return da
|
|
|
+ });
|
|
|
+ stores.unshift({
|
|
|
+ "name": "namespace.manifest",
|
|
|
+ "data": {
|
|
|
+ "namespace": self.name
|
|
|
+ }
|
|
|
+ })
|
|
|
+ var ret = {}
|
|
|
+ stores.map(function(a) {
|
|
|
+ ret[a.name] = a;
|
|
|
+ })
|
|
|
+ cb(null, ret)
|
|
|
+}
|
|
|
+Asystem.prototype.log = function() {}
|
|
|
+Asystem.prototype.template = function() {
|
|
|
+ return this._templatefunction.apply(this, arguments)
|
|
|
+}
|
|
|
+Asystem.prototype.loadInto = function(url, callback, linked) {
|
|
|
+ var self = this;
|
|
|
+ getthezip(url, function(res) {
|
|
|
+ return res.json()
|
|
|
+ })
|
|
|
+ .then(function(obj) {
|
|
|
+ self.rev_conv(obj);
|
|
|
+ self.restart();
|
|
|
+
|
|
|
+ })
|
|
|
+
|
|
|
+}
|
|
|
+Asystem.prototype.loadZipLocal = function(blob, callback) {
|
|
|
+ var self = this;
|
|
|
+ var importer = self.importer_zip();
|
|
|
+ unpackzip(importer)(blob)
|
|
|
+ .then(
|
|
|
+ function() {
|
|
|
+ self.emit("status", "early ready yes yes")
|
|
|
+ if (self._loadqueue && self._loadqueue.length) {
|
|
|
+ var ff = self._loadqueue.shift()
|
|
|
+ self.ozap(importer.path);
|
|
|
+
|
|
|
+ self.loadZip(ff[1], callback, ff[0]);
|
|
|
+ } else {
|
|
|
+ if (self.name_imported) {
|
|
|
+ self.name = self.name_imported;
|
|
|
+ }
|
|
|
+ self.ozap(importer.path);
|
|
|
+ callback(null, self);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ).catch(console.log)
|
|
|
+}
|
|
|
+Asystem.prototype.loadZip = function(url, callback, linked) {
|
|
|
+ var self = this;
|
|
|
+ if (linked) {
|
|
|
+ self._linked[linked] = url;
|
|
|
+ }
|
|
|
+ getthezip(url)
|
|
|
+ .then(function(data) {
|
|
|
+ self.emit("status", "got data" + data.length)
|
|
|
+ var importer = self.importer_zip();
|
|
|
+ unpackzip(importer)(data)
|
|
|
+ .then(
|
|
|
+ function() {
|
|
|
+ self.emit("status", "early ready yes yes")
|
|
|
+ if (self._loadqueue && self._loadqueue.length) {
|
|
|
+ var ff = self._loadqueue.shift()
|
|
|
+ self.ozap(importer.path);
|
|
|
+
|
|
|
+ self.loadZip(ff[1], callback, ff[0]);
|
|
|
+ } else {
|
|
|
+ if (self.name_imported) {
|
|
|
+ self.name = self.name_imported;
|
|
|
+ }
|
|
|
+ self.ozap(importer.path);
|
|
|
+ callback(null, self);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ )
|
|
|
+ .catch(console.log)
|
|
|
+ })
|
|
|
+ .catch(console.log)
|
|
|
+}
|
|
|
+Asystem.prototype.saveZip = function() {
|
|
|
+ var self = this;
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ self.exporter(function(err, data) {
|
|
|
+ var seperate_save = _.keys(data).filter(function(name) {
|
|
|
+ return self._linked && self._linked[name + ".link"]
|
|
|
+ })
|
|
|
+ var ddata = _.omit(data, seperate_save);
|
|
|
+ seperate_save.map(function(om) {
|
|
|
+ var url = self._linked[om + ".link"].split("/");
|
|
|
+ url.pop();
|
|
|
+ url.push(self.name + "-" + om + ".zip");
|
|
|
+ ddata[om + ".link"] = url.join("/");
|
|
|
+ })
|
|
|
+ generatezip(self.name + "-" + "" + ".zip", ddata, function(err, zz) {
|
|
|
+ async.mapSeries(seperate_save, function(name, next) {
|
|
|
+ var dda = {};
|
|
|
+ dda[name] = data[name];
|
|
|
+ generatezip(self.name + "-" + name + ".zip", dda, next)
|
|
|
+ }, function(err, all) {
|
|
|
+ all.push(zz);
|
|
|
+ resolve(all)
|
|
|
+ })
|
|
|
+ })
|
|
|
+ })
|
|
|
+ })
|
|
|
+}
|
|
|
+Asystem.prototype.saveAsJS = function() {
|
|
|
+ var self = this;
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ self.exporterJS(function(err, data) {
|
|
|
+ var tm = {}
|
|
|
+ _.map(data, function(dat, name) {
|
|
|
+ if (typeof(dat.data) === "object" && dat.data.length) {
|
|
|
+ tm[name + ".js"] = {
|
|
|
+ data: dat.data.map(function(a) {
|
|
|
+ return '$E(' + JSON.stringify(a) + ');'
|
|
|
+ }).join("\n")
|
|
|
+ };
|
|
|
+ } else {
|
|
|
+ tm[name] = {
|
|
|
+ data: dat.data
|
|
|
+ };
|
|
|
+ }
|
|
|
+ })
|
|
|
+ generatezip(self.name + "-" + "" + ".zip", tm, function(err, zz) {
|
|
|
+ resolve(zz);
|
|
|
+ })
|
|
|
+ //console.log("TTTT",tm);
|
|
|
+ // console.log("DDD",data);
|
|
|
+ })
|
|
|
+ })
|
|
|
+}
|
|
|
+Asystem.prototype.exporterJS = function(cb) {
|
|
|
+ var self = this;
|
|
|
+ var obj = self.oo;
|
|
|
+ var stores = _.keys(obj).filter(function(a) {
|
|
|
+ return typeof(obj[a]) === "function"
|
|
|
+ }).map(function(a) {
|
|
|
+ return obj[a]()
|
|
|
+ }).map(function(a) {
|
|
|
+ var da = a.exportFlatSync(a.name);
|
|
|
+ return {
|
|
|
+ name: a.name,
|
|
|
+ data: da
|
|
|
+ }
|
|
|
+ });
|
|
|
+ stores.unshift({
|
|
|
+ "name": "namespace.manifest",
|
|
|
+ "data": {
|
|
|
+ "namespace": self.name
|
|
|
+ }
|
|
|
+ })
|
|
|
+ var ret = {}
|
|
|
+ stores.map(function(a) {
|
|
|
+ ret[a.name] = a;
|
|
|
+ })
|
|
|
+ cb(null, ret)
|
|
|
+}
|
|
|
+Asystem.prototype.importer_zip = function() {
|
|
|
+ var self = this;
|
|
|
+ self.oget("system/emmm").metas("_hide", true);
|
|
|
+ var emname = "system/emmm/a/" + random(0xffffff)
|
|
|
+ var emmm = self.oget(emname);
|
|
|
+ emmm.metas("unsaveable", true);
|
|
|
+ emmm.on("file", function(filename, data) {
|
|
|
+ if (filename.indexOf(".link") > -1) {
|
|
|
+ emmm.emit("link", data);
|
|
|
+ self._loadqueue = self._loadqueue || [];
|
|
|
+ self._loadqueue.push([filename, data])
|
|
|
+ self.emit("status", "gotlink", filename);
|
|
|
+ } else {
|
|
|
+ self.emit("status", "gotfile", filename + " : " + typeof(data) + " : " + data.substring(0, 20));
|
|
|
+ self.oget("folders/" + filename.indexOf("/") > -1 ? filename : "folders/" + filename).data("data", data);
|
|
|
+ }
|
|
|
+ })
|
|
|
+ emmm.on("json", function(filename, data) {
|
|
|
+ self.emit("status", "gotfile", filename);
|
|
|
+ self.rev_conv(data)
|
|
|
+ })
|
|
|
+ emmm.on("namespace", function(data, cont) {
|
|
|
+ self.emit("status", "gotnamespace", data.namespace);
|
|
|
+ self.name_imported = data.namespace;
|
|
|
+ cont();
|
|
|
+ })
|
|
|
+ emmm.on("nonamespace", function(cont) {
|
|
|
+ //self.name = url.split("/").pop().split(".").shift();
|
|
|
+ self.emit("status", "gotnonamespace", self.name);
|
|
|
+ cont();
|
|
|
+ })
|
|
|
+ return emmm
|
|
|
+}
|
|
|
+
|
|
|
+function createnav(rk, key) {
|
|
|
+ return '#' + key;
|
|
|
+}
|
|
|
+$linkstr2 = '<li class="{{liclass}}"><i class="{{iclass}}"></i> <a href="{{href}}" class="eletree">{{title}}</a> <em>{{size}}</em></li>';
|
|
|
+
|
|
|
+function allchildpaths(obj_) {
|
|
|
+ var obj = typeof(obj_) === "function" ? obj_() : obj_;
|
|
|
+ return [].concat.apply([obj.path], _.map(obj.children, allchildpaths))
|
|
|
+}
|
|
|
+
|
|
|
+function allchildren(obj_) {
|
|
|
+ var obj = typeof(obj_) === "function" ? obj_() : obj_;
|
|
|
+ return [].concat.apply([obj], _.map(obj.children, allchildren))
|
|
|
+}
|
|
|
+
|
|
|
+function sorter(prop, dir) {
|
|
|
+ return function(aa, bb) {
|
|
|
+ var a = prop(aa);
|
|
|
+ var b = prop(bb);
|
|
|
+ return a > b ? dir * -1 : a < b ? dir * 1 : 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+Asystem.prototype.t_icon = function(obj) {
|
|
|
+ var self = this;
|
|
|
+ if (obj._data.iconclass) {
|
|
|
+ var dd = self.oget(obj._data.iconclass)._data.data;
|
|
|
+ if (!dd) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+ if (dd.indexOf("data:") === 0) {
|
|
|
+
|
|
|
+ return '<i><img src="' + dd + '"></i>';
|
|
|
+ } else {
|
|
|
+ return '<i>' + dd + '</i>';
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return "<i> </i>"
|
|
|
+}
|
|
|
+Asystem.prototype.t_title = function(obj) {
|
|
|
+ var self = this;
|
|
|
+ //contexts;
|
|
|
+ return opath.get(obj._data, "title") || obj.name
|
|
|
+}
|
|
|
+
|
|
|
+Asystem.prototype.renderme = function(obj, maxlevels, atlevel, viewa) {
|
|
|
+ var self = this;
|
|
|
+ var ssi = _.size(obj.children);
|
|
|
+ var childas = obj;
|
|
|
+ if (ssi === 1) {
|
|
|
+ var ooj = obj.children[_.keys(obj.children).shift()]()
|
|
|
+ if (ooj._metas.skipme) {
|
|
|
+ childas = ooj;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ var ssia = allchildpaths(obj).length - 1;
|
|
|
+ //(ssi > 0 ? ssi : '') +
|
|
|
+ if (obj._metas.pickchild) {
|
|
|
+ childas = obj.children[obj._metas.pickchild]();
|
|
|
+ }
|
|
|
+ if (obj._metas.pickpath) {
|
|
|
+ childas = self.oget(obj._metas.pickpath);
|
|
|
+ }
|
|
|
+
|
|
|
+ var s = "";
|
|
|
+
|
|
|
+ if (viewa && typeof(viewa) === "function") {
|
|
|
+ s += "" + viewa(obj, atlevel);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (obj._metas._hide) {
|
|
|
+ return "";
|
|
|
+ }
|
|
|
+
|
|
|
+ s += '<div class="obj l' + atlevel + ' ' + (obj._metas.hide ? 'hidden' : '') + '" eleview="menulink" elepath="' + obj.path + '" atlevel="' + atlevel + '">'
|
|
|
+ s += '<a href="#' + obj.path + '" >' + self.t_icon(obj) + self.t_title(obj) + '<em>' + (ssia > 0 ? ssia : '') + '</em></a>'
|
|
|
+ if (atlevel < maxlevels) {
|
|
|
+ if (ssi > 0) {
|
|
|
+ var xxx = _.map(childas.children, function(cc) {
|
|
|
+ return cc()
|
|
|
+ })
|
|
|
+ xxx.sort(sorter(function(a) {
|
|
|
+ return a._metas.menu_order || 100
|
|
|
+ }, -1));
|
|
|
+
|
|
|
+ var aa = xxx.slice(0, 25).map(function(cc) {
|
|
|
+ return self.renderme(cc, maxlevels, atlevel + 1, viewa)
|
|
|
+ }).join("\n")
|
|
|
+ return s + '<div class="children">' + aa + '</div></div>'
|
|
|
+
|
|
|
+
|
|
|
+ } else {
|
|
|
+ return s + '</div>';
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ return s + '</div>'
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+Asystem.prototype.render = function() {
|
|
|
+ var self = this;
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ var rooten = self.oget("root");
|
|
|
+ var ss = [self.template('<div id="{{_data.id}}" class="obj root" eleview="" elepath="">', rooten)];
|
|
|
+ // ss.push('<pre onclick="$lib.toggle_admin()">' + self.oget("root/._data.title") + '</pre><hr>')
|
|
|
+
|
|
|
+
|
|
|
+ /* var kka = _.keys(self.oo).filter(aa => ["trash", "system", "root"].indexOf(aa) === -1 && typeof(self.oo[aa]) === "function")
|
|
|
+ kka.sort(function(aa, bb) {
|
|
|
+ var a = self.oo[aa]()._metas.menu_order;
|
|
|
+ var b = self.oo[bb]()._metas.menu_order;
|
|
|
+ return a > b ? 1 : a < b ? -1 : 0
|
|
|
+ })
|
|
|
+*/
|
|
|
+
|
|
|
+ var kkas = _.filter(self.oo, function(sto) {
|
|
|
+ return typeof(sto) === "function"
|
|
|
+ }).map(function(sto, nam) {
|
|
|
+ return sto();
|
|
|
+ })
|
|
|
+
|
|
|
+ kkas.sort(sorter(function(a) {
|
|
|
+ return a._metas.menu_order || 100
|
|
|
+ }, -1));
|
|
|
+
|
|
|
+ var privates = [];
|
|
|
+ var publics = [];
|
|
|
+
|
|
|
+ kkas.filter(function(obj) {
|
|
|
+ return obj._metas.public !== true
|
|
|
+ }).map(function(obj) {
|
|
|
+ privates.push(self.rendera("menulink", obj, 0, 0));
|
|
|
+ })
|
|
|
+ kkas.filter(function(obj) {
|
|
|
+ return obj._metas.public === true
|
|
|
+ }).map(function(obj) {
|
|
|
+ publics.push(self.rendera("menulink", obj, 2, 0));
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+ publics.map(function(a) {
|
|
|
+ ss.push(a);
|
|
|
+ })
|
|
|
+
|
|
|
+ /* kka.map(function(key) {
|
|
|
+ ss.push(self.rendera("menulink", self.oo[key](), 0, 0));
|
|
|
+ })
|
|
|
+*/
|
|
|
+ ss.push('</div>')
|
|
|
+
|
|
|
+ ss.push('<div id="editorlinks">');
|
|
|
+
|
|
|
+ ss.push('<div id="mmme" class="obj root" eleview="" elepath="">');
|
|
|
+
|
|
|
+ privates.map(function(a) {
|
|
|
+ ss.push(a);
|
|
|
+ })
|
|
|
+ ss.push('</div>');
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ ss.push('</div>')
|
|
|
+ resolve(ss.join("\n"));
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+Asystem.prototype.render_editorlinks = function(levels) {
|
|
|
+ var self = this;
|
|
|
+ var kkas = _.filter(self.oo, function(sto) {
|
|
|
+ return typeof(sto) === "function"
|
|
|
+ }).map(function(sto, nam) {
|
|
|
+ return sto();
|
|
|
+ })
|
|
|
+
|
|
|
+ kkas.sort(sorter(function(a) {
|
|
|
+ return a._metas.menu_order || 100
|
|
|
+ }, -1));
|
|
|
+
|
|
|
+ return kkas.map(function(obj) {
|
|
|
+ return self.renderme(obj, levels || 0, 0);
|
|
|
+ }).join("\n");
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+Asystem.prototype.rendermenu = function(obj, levels) {
|
|
|
+ var self = this;
|
|
|
+
|
|
|
+ var temps = obj.getStuff3("_data.menuobj", function(a) {
|
|
|
+ return a
|
|
|
+ }, "_data.menuobj")
|
|
|
+ console.log("TEMenu", temps);
|
|
|
+ if (temps.length > 0) {
|
|
|
+ return self.renderme(self.oget(temps[0].data), levels || 0, 0);
|
|
|
+ }
|
|
|
+ return self.renderme(obj, levels || 0, 0);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+Asystem.prototype.renderq = function(kkey) {
|
|
|
+ var self = this;
|
|
|
+ return new Promise(function(resolve, reject) {
|
|
|
+ var rooten = self.oget("root");
|
|
|
+ var ss = [self.template('<div id="{{_data.id}}" class="obj root" eleview="" elepath="">', rooten)];
|
|
|
+ // ss.push('<pre onclick="$lib.toggle_admin()">' + self.oget("root/._data.title") + '</pre><hr>')
|
|
|
+
|
|
|
+ if (!self.oo[kkey]) {
|
|
|
+ self.oget(kkey);
|
|
|
+ }
|
|
|
+ ss.push(self.rendera("menulink", self.oo[kkey](), 1, 0));
|
|
|
+
|
|
|
+ ss.push('</div>')
|
|
|
+ resolve(ss.join("\n"));
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+Asystem.prototype.rendera = function(template) {
|
|
|
+ var args = Array.prototype.slice.apply(arguments, [1]);
|
|
|
+
|
|
|
+ if (template == "view") {
|
|
|
+ return "VIEW"
|
|
|
+ }
|
|
|
+ if (template == "menulink") {
|
|
|
+ return this.renderme.apply(this, args);
|
|
|
+ }
|
|
|
+ if (template == "editor") {
|
|
|
+ return this.renderEditorTools(args[0], "editor");
|
|
|
+ }
|
|
|
+
|
|
|
+ return "NOT VIEW " + template
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+//
|
|
|
+Asystem.prototype.renderEditorTools = function(obj, state) {
|
|
|
+ var buts = [];
|
|
|
+
|
|
|
+ if (obj.path.indexOf("trash") == 0) {
|
|
|
+ buts.push('<button class="elerestore"><i class="fa fa-undo-alt"></i></button>')
|
|
|
+ }
|
|
|
+
|
|
|
+ if (state == "editor") {
|
|
|
+
|
|
|
+ buts.push('<button class="eleview"><i class="fa fa-eye"></i></button>')
|
|
|
+
|
|
|
+ if (!(obj._metas.nochildren)) {
|
|
|
+ buts.push('<button class="eleplus"><i class="fa fa-plus-circle"></i></button>')
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (obj.path.indexOf("trash") == -1 && !(obj._metas.undeletable)) {
|
|
|
+ buts.push('<button class="eledelete"><i class="fa fa-trash-alt"></i></button>')
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ buts.push('<button class="eleexport"><i class="fa fa-file-export"></i></button>')
|
|
|
+
|
|
|
+
|
|
|
+ } else {
|
|
|
+ buts.push('<button class="eleeditor"><i class="fa fa-edit"></i></button>')
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ return '<div id="editor" elepath="' + obj.path + '" eleview="editor" class="editorline" ><div class="buttons">' + buts.map(function(a) {
|
|
|
+ return a
|
|
|
+ }).join(" ") + '</div><div id="editor_context"></div></div>'
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+tool.add_filters("editor_sections", function(arr, obj) {
|
|
|
+ arr.push({
|
|
|
+ title: "Template",
|
|
|
+ content: function() {
|
|
|
+ return "<div class=\"status\">x</div> <textarea class=htmleditor data-id=\"" + obj.path + "/._data.template\">" + obj._data.template + '</textarea>'
|
|
|
+ }
|
|
|
+ })
|
|
|
+ return arr;
|
|
|
+}, 100, "Template")
|
|
|
+
|
|
|
+function wrap(tag, obj, content) {
|
|
|
+ var args = Array.prototype.slice.apply(arguments, [2]);
|
|
|
+ return '<' + tag + ' ' + _.map(obj, (val, prop) => prop + '="' + val + '"').join(" ") + '>' + args.join("\n") + '</' + tag + '>'
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+Asystem.prototype.renderEditor = function(obj) {
|
|
|
+ var self = this;
|
|
|
+ var ss = "";
|
|
|
+ //"<div class=\"status\">x</div> <textarea class=htmleditor data-id=\"" + obj.path + "/._data.content\">" + obj._data.content + '</textarea>'
|
|
|
+
|
|
|
+ // ss += self.template(self.oget("system/editor")._data.template,obj);
|
|
|
+
|
|
|
+ var self = this;
|
|
|
+ var aa = []
|
|
|
+ _.keys(self.oo).filter(aa => ["trash", ""].indexOf(aa) === -1 && typeof(self.oo[aa]) === "function").map(function(key) {
|
|
|
+ aa = [].concat.apply(aa, allchildren(self.oo[key]()).filter(function(a) {
|
|
|
+ return a.editor_function
|
|
|
+ }))
|
|
|
+ })
|
|
|
+
|
|
|
+ ss += aa.map(function(a) {
|
|
|
+ return wrap("div", {
|
|
|
+ elepath: a.path,
|
|
|
+ class: "editor_module"
|
|
|
+ }, wrap("h3", {}, a.name), wrap("div", {}, a._metas.help), wrap("div", {}, a.editor_function(obj)))
|
|
|
+ }).join("\n")
|
|
|
+
|
|
|
+
|
|
|
+ // return aa.map( function(a){ return renderlin(a)(a,a.name) } ).join("\n");
|
|
|
+
|
|
|
+
|
|
|
+ ss += '<hr>'
|
|
|
+ ss += self.renderEditor2(obj);
|
|
|
+ return ss
|
|
|
+}
|
|
|
+
|
|
|
+String.prototype.toHtmlEntities = function() {
|
|
|
+ return this.replace(/./gm, function(s) {
|
|
|
+ return "&#" + s.charCodeAt(0) + ";";
|
|
|
+ });
|
|
|
+};
|
|
|
+
|
|
|
+/**
|
|
|
+ * Create string from HTML entities
|
|
|
+ */
|
|
|
+String.fromHtmlEntities = function(string) {
|
|
|
+ return (string + "").replace(/&#\d+;/gm, function(s) {
|
|
|
+ return String.fromCharCode(s.match(/\d+/gm)[0]);
|
|
|
+ })
|
|
|
+};
|
|
|
+
|
|
|
+Asystem.prototype.uniq_relnames = function() {
|
|
|
+ var self = this;
|
|
|
+
|
|
|
+
|
|
|
+ var rels = {}
|
|
|
+
|
|
|
+ self.allchildren().map(function(c) {
|
|
|
+ _.keys(c._relations).map(function(relname) {
|
|
|
+ rels[relname] = rels[relname] || 0;
|
|
|
+ rels[relname] = rels[relname] + 1;
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ return _.keys(rels).map(function(a) {
|
|
|
+ return {
|
|
|
+ name: a,
|
|
|
+ cnt: rels[a]
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+function mmb(t, d) {
|
|
|
+ return '<div class="mb"><h3>' + t + '</h3>' + d + '</div>';
|
|
|
+}
|
|
|
+
|
|
|
+Asystem.prototype.addEditorContext = function(conobj) {
|
|
|
+ this.editorContexts = this.editorContexts || [];
|
|
|
+ this.editorContexts.push(conobj);
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+Asystem.prototype.renderEditor2 = function(obj) {
|
|
|
+ var self = this;
|
|
|
+ var types = self.editorTypes();
|
|
|
+ var tabs_links = '<ul class="tabs">' + self.editorContexts.filter(function(con) {
|
|
|
+ return con.filter ? con.filter(obj) : true;
|
|
|
+ }).map(function(con) {
|
|
|
+ return self.template('<li data-id="{{name}}" class="tablink {{active}}">{{name}}</li>', {
|
|
|
+ name: con.name,
|
|
|
+ active: (self.current_tab === con.name ? 'active' : '')
|
|
|
+ });
|
|
|
+ }).join("\n") + '</ul>';
|
|
|
+
|
|
|
+ /* var tabs_content = _.map(self.editorContexts,function(con, name){
|
|
|
+ return self.template('<div id="t_{{name}}" class="tab-content">{{body}}</li>', {body: con(), name: name, });
|
|
|
+ }).join("\n");
|
|
|
+ */
|
|
|
+ var str = "";
|
|
|
+ if (self.current_tab) {} else {
|
|
|
+ self.current_tab = self.editorContexts[0].name;
|
|
|
+ }
|
|
|
+ str = self.editorContexts.filter((con) => con.name === self.current_tab).pop().func(obj, types);
|
|
|
+
|
|
|
+ return tabs_links + '<div id="etabcontent">' + str + '</div>';
|
|
|
+}
|
|
|
+Asystem.prototype.editorTypes = function() {
|
|
|
+ var self = this;
|
|
|
+ var types = {
|
|
|
+ jsfuncs: function(obj, fiels) {
|
|
|
+ var qq = [];
|
|
|
+ _.map(_.omit(obj, ignores), function(val, prop) {
|
|
|
+ if (typeof(val) === "function") {
|
|
|
+ qq.push(["JS " + prop + '<li><button class="deletefunc" data-id="' + obj.path + "/." + prop + '">Delete</button></li>',
|
|
|
+ "<div class=\"status\"></div> <textarea class=jseditor data-id=\"" + obj.path + "/." + prop + "\">" + (obj[prop] + "") +
|
|
|
+ '</textarea> '
|
|
|
+ ]);
|
|
|
+
|
|
|
+ }
|
|
|
+ })
|
|
|
+ qq.push(["JS ", "<input class=\"createfunc\" data-id=\"" + obj.path + "\"> "]);
|
|
|
+
|
|
|
+ var ss = ('<div class="sas">' + qq.map(function(a) {
|
|
|
+ return '<div class="sa"><div class="inn"><div class="saa">' + (a[0] === false ? "" : a[0] + "") + '</div><div class="sab">' + a[1] +
|
|
|
+ '</div></div></div>'
|
|
|
+ }).join("\n") + '</div>');
|
|
|
+ return ss
|
|
|
+
|
|
|
+
|
|
|
+ },
|
|
|
+ relations: function(obj, field) {
|
|
|
+ var s = "";
|
|
|
+
|
|
|
+ var ss = []
|
|
|
+ _.map(obj._relations, function(rels, relname) {
|
|
|
+ var relators = _.keys(rels);
|
|
|
+ var sss = relators.slice(0, 25).map(function(relator) {
|
|
|
+ return '<li elepath="' + relator + '"><a href="#' + relator + '" class="elecontent" title="' + JSON.stringify(rels[relator].context).toHtmlEntities() +
|
|
|
+ '">' + relator + '</a> <button class="btn unrelate" data-id="' + obj
|
|
|
+ .path + '" data-rel="' + relname + '" data-rela="' + relator + '" >X</button></li> '
|
|
|
+
|
|
|
+ }).join("\n");;
|
|
|
+ ss.push([relname + "(" + relators.length + ")", sss]);
|
|
|
+ });
|
|
|
+ s += ss.map(function(a) {
|
|
|
+ return '<div><h3>' + a[0] + '</h3><div>' + a[1] + '</div></div>'
|
|
|
+
|
|
|
+ }).join("\n")
|
|
|
+
|
|
|
+
|
|
|
+ return s;
|
|
|
+ },
|
|
|
+ relationsadd: function(obj, field) {
|
|
|
+ var s = "";
|
|
|
+
|
|
|
+
|
|
|
+ s += '<li class="relationseditor" data-id="' + obj.path +
|
|
|
+ '"><input class="relout" type="text" placeholder="is what " /><em><select class=uniq_relnames target=".relout"></select>' +
|
|
|
+ '</em><hr> to: <input class="relaeditor" placeholder="find obj"><hr> as: <input type="text" class=relin data-id="' +
|
|
|
+ obj.path +
|
|
|
+ '" placeholder="as what " /> <select class=uniq_relnames target=".relin"></select><hr> with: <input class="what" type="text" > <button class="relateasto">Relate</button></li>';
|
|
|
+ return s;
|
|
|
+ },
|
|
|
+ templatepaths: function(obj, field) {
|
|
|
+ return "<div class=\"status\"></div>" + _.map(self.getRenderTemplate(obj), function(a) {
|
|
|
+ return '<li elepath="' + a.name + '" ><a href="#' + a.name + '" class="elecontent" title="' + a.from + ": " + a.data.toHtmlEntities() + '" > ' +
|
|
|
+ a.name +
|
|
|
+ '</a></li>'
|
|
|
+ }).join("\n");
|
|
|
+ },
|
|
|
+ visa: function(obj, field) {
|
|
|
+
|
|
|
+ function mkaa(obja) {
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ setTimeout(function() {
|
|
|
+ var cols = {
|
|
|
+ parent: "#000000",
|
|
|
+ child: "#ff00ff",
|
|
|
+ extends: "#00ff00",
|
|
|
+ inherits: "#ff0000",
|
|
|
+ isa: "#ff9900",
|
|
|
+ hasa: "#00ff99"
|
|
|
+ }
|
|
|
+
|
|
|
+ function lokup(tp) {
|
|
|
+ return cols[tp];
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ var graph = Viva.Graph.graph();
|
|
|
+ var graphics = Viva.Graph.View.svgGraphics(),
|
|
|
+ nodeSize = 10;
|
|
|
+
|
|
|
+
|
|
|
+ self.allchildren().filter(function(c) {
|
|
|
+ return c.path.indexOf("trash/") === -1 && c.path.indexOf("folders/") === -1 && c.path.indexOf("blobs/") === -1
|
|
|
+ }).slice(0, 100).map(function(c) {
|
|
|
+ graph.addNode(c.path);
|
|
|
+ _.map(c.children, function(child, name) {
|
|
|
+ graph.addLink(c.path, child().path, 'child')
|
|
|
+ });
|
|
|
+ _.map(c._isa, function(child, name) {
|
|
|
+ graph.addLink(c.path, child.path, 'isa')
|
|
|
+ });
|
|
|
+ _.map(c._hasa, function(child, name) {
|
|
|
+ graph.addLink(c.path, child.path, 'hasa')
|
|
|
+ });
|
|
|
+
|
|
|
+ _.map(c._extends, function(child, name) {
|
|
|
+ graph.addLink(c.path, child.path, 'extends')
|
|
|
+
|
|
|
+ });
|
|
|
+ _.map(c._inherits, function(child, name) {
|
|
|
+ graph.addLink( c.path,child.path, 'inherits')
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ _.map(c._relations, function(rels, relname) {
|
|
|
+ _.map(rels, function(child, name) {
|
|
|
+ graph.addLink(c.path, name, relname)
|
|
|
+ })
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var a = obj.path
|
|
|
+ //graph.addNode(a, '91bad8ceeec43ae303790f8fe238164b');
|
|
|
+
|
|
|
+ /* _.map(obj.parents, function(parent, name) {
|
|
|
+ graph.addNode(name, '');
|
|
|
+ graph.addLink(name, a, 'parent')
|
|
|
+ });
|
|
|
+*/
|
|
|
+ /*
|
|
|
+
|
|
|
+ var ogs = gpath(obj, []);
|
|
|
+ console.log("OOOOOOOOOOOO", ogs);
|
|
|
+ var roo = obj.path,
|
|
|
+ nexta;
|
|
|
+
|
|
|
+ graph.addNode(roo, '');
|
|
|
+ while (ogs.length) {
|
|
|
+ nexta = ogs.shift();
|
|
|
+ graph.addLink(roo, nexta, 'parent')
|
|
|
+ roo = nexta;
|
|
|
+ }
|
|
|
+
|
|
|
+ roo = obj.path
|
|
|
+
|
|
|
+ _.map(obj.children, function(child, name) {
|
|
|
+ graph.addNode(name, '');
|
|
|
+ graph.addLink(roo, name, 'child')
|
|
|
+ });
|
|
|
+ _.map(obj._isa, function(child, name) {
|
|
|
+ graph.addNode(name, '');
|
|
|
+ graph.addLink(roo, name, 'isa')
|
|
|
+ });
|
|
|
+ _.map(obj._hasa, function(child, name) {
|
|
|
+ graph.addNode(name, '');
|
|
|
+ graph.addLink(roo, name, 'hasa')
|
|
|
+ });
|
|
|
+
|
|
|
+ _.map(obj._extends, function(child, name) {
|
|
|
+ graph.addNode(name, '');
|
|
|
+ graph.addLink(roo, name, 'extends')
|
|
|
+ });
|
|
|
+ _.map(obj._inherits, function(child, name) {
|
|
|
+ graph.addNode(name, '');
|
|
|
+ graph.addLink(name, roo, 'inherits')
|
|
|
+ });
|
|
|
+ */
|
|
|
+ var idas = 1;
|
|
|
+ var ida = function(){
|
|
|
+ return "ida"+(idas++)
|
|
|
+ }
|
|
|
+
|
|
|
+ graphics.node(function(node) {
|
|
|
+ var ui = Viva.Graph.svg('g');
|
|
|
+
|
|
|
+
|
|
|
+ var circle = Viva.Graph.svg('circle')
|
|
|
+ .attr('cx', 2)
|
|
|
+ .attr('cy', 2)
|
|
|
+ .attr('r', 2)
|
|
|
+ .attr('fill', obj.path === node.id ? "#ff0000" : "#dadada");
|
|
|
+ ui.append(circle);
|
|
|
+
|
|
|
+ var svgText = Viva.Graph.svg('text').attr('font-size', '12px').attr('y', '4px').text(node.id.split("/").pop());
|
|
|
+ ui.append(svgText);
|
|
|
+ return ui;
|
|
|
+ }).placeNode(function(nodeUI, pos) {
|
|
|
+ nodeUI.attr('transform',
|
|
|
+ 'translate(' +
|
|
|
+ (pos.x - nodeSize / 2) + ',' + (pos.y - nodeSize / 2) +
|
|
|
+ ')');
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ var createMarker = function(id) {
|
|
|
+ return Viva.Graph.svg('marker')
|
|
|
+ .attr('id', id)
|
|
|
+ .attr('viewBox', "0 0 10 10")
|
|
|
+ .attr('refX', "10")
|
|
|
+ .attr('refY', "5")
|
|
|
+ .attr('markerUnits', "strokeWidth")
|
|
|
+ .attr('markerWidth', "10")
|
|
|
+ .attr('markerHeight', "5")
|
|
|
+ .attr('orient', "auto");
|
|
|
+ },
|
|
|
+
|
|
|
+ marker = createMarker('Triangle');
|
|
|
+ marker.append('path').attr('d', 'M 0 0 L 10 5 L 0 10 z');
|
|
|
+
|
|
|
+ // Marker should be defined only once in <defs> child element of root <svg> element:
|
|
|
+ var defs = graphics.getSvgRoot().append('defs');
|
|
|
+ defs.append(marker);
|
|
|
+
|
|
|
+ var geom = Viva.Graph.geom();
|
|
|
+
|
|
|
+ graphics.link(function(link) {
|
|
|
+ // Notice the Triangle marker-end attribe:
|
|
|
+
|
|
|
+ var isParent = (link.data === 'parent');
|
|
|
+
|
|
|
+ var ui = Viva.Graph.svg('g');
|
|
|
+ var p = Viva.Graph.svg('path')
|
|
|
+ .attr('stroke', lokup(link.data) || "#000000")
|
|
|
+ .attr('fill', 'none')
|
|
|
+ .attr('marker-end', 'url(#Triangle)')
|
|
|
+ .attr('id', ida() )
|
|
|
+ ui.isParent = isParent; // remember for future.
|
|
|
+ ui.linka = link.data;
|
|
|
+ ui.ry = 50 //- (Math.random() * 100);
|
|
|
+
|
|
|
+ ui.pp = p;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var svgText = Viva.Graph.svg('text').attr("dy",-4).attr("class","slabel");
|
|
|
+
|
|
|
+ var textPath = Viva.Graph.svg("textPath");
|
|
|
+ textPath.attr("href","#"+p.id).attr("startOffset","25%").text( link.data+ " >");
|
|
|
+
|
|
|
+ svgText.append(textPath)
|
|
|
+ ui.tt = svgText;
|
|
|
+
|
|
|
+ ////<textPath xlink:href="#'+link.id+'">
|
|
|
+
|
|
|
+// svgText.attr('xlink', link.id);
|
|
|
+
|
|
|
+
|
|
|
+ ui.append(svgText)
|
|
|
+
|
|
|
+ ui.append(p);
|
|
|
+
|
|
|
+ return ui;
|
|
|
+
|
|
|
+
|
|
|
+ }).placeLink(function(linkUI, fromPos, toPos) {
|
|
|
+ // using arc command: http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands
|
|
|
+ //var data = 'M' + fromPos.x + ',' + fromPos.y +
|
|
|
+ // ' A 4,' + linkUI.ry + ',-' + linkUI.ry + ',0,1,' + toPos.x + ',' + toPos.y;
|
|
|
+
|
|
|
+ var data = 'M' + fromPos.x + ',' + fromPos.y +
|
|
|
+ ' C ' + (fromPos.x+50)+' '+(fromPos.y+10)+','+ (toPos.x-50) + ' ' +(toPos.y-10) + ',' +toPos.x + ' ' + toPos.y ;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ linkUI.pp.attr("d", data);
|
|
|
+
|
|
|
+ return;
|
|
|
+ // linkUI.tt.attr("y", ((fromPos.y + toPos.y) / 2) - linkUI.ry);
|
|
|
+ // linkUI.tt.attr("x", ((fromPos.x + toPos.x) / 2) );
|
|
|
+
|
|
|
+ if (linkUI.isParent) {
|
|
|
+ /* var ry = linkUI.isParent ? 4 : 0,
|
|
|
+ // using arc command: http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands
|
|
|
+ data = 'M' + fromPos.x + ',' + fromPos.y +
|
|
|
+ ' A 4,' + ry + ',-4,0,1,' + toPos.x + ',' + toPos.y;
|
|
|
+
|
|
|
+ linkUI.attr("d", data);
|
|
|
+*/
|
|
|
+ var data = 'M' + fromPos.x + ',' + fromPos.y +
|
|
|
+ 'L' + toPos.x + ',' + toPos.y;
|
|
|
+ linkUI.pp.attr("d", data);
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ if (linkUI.linka === 'isa') {
|
|
|
+ var data = 'M' + fromPos.x + ',' + fromPos.y +
|
|
|
+ 'L' + toPos.x + ',' + toPos.y;
|
|
|
+ linkUI.pp.attr("d", data);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (linkUI.linka === 'hasa') {
|
|
|
+ // var data = 'M' + fromPos.x + ',' + fromPos.y +
|
|
|
+ // 'L' + toPos.x + ',' + toPos.y;
|
|
|
+
|
|
|
+ var ry = 4;
|
|
|
+ // using arc command: http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands
|
|
|
+ var data = 'M' + fromPos.x + ',' + fromPos.y +
|
|
|
+ ' A 4,' + ry + ',-4,0,1,' + toPos.x + ',' + toPos.y;
|
|
|
+
|
|
|
+
|
|
|
+ linkUI.pp.attr("d", data);
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ if (linkUI.linka === 'inherits') {
|
|
|
+ var data = 'M' + fromPos.x + ',' + fromPos.y +
|
|
|
+ 'L' + toPos.x + ',' + toPos.y;
|
|
|
+ linkUI.pp.attr("d", data);
|
|
|
+ }
|
|
|
+ if (linkUI.linka === 'extends') {
|
|
|
+ var data = 'M' + fromPos.x + ',' + fromPos.y +
|
|
|
+ 'L' + toPos.x + ',' + toPos.y;
|
|
|
+ linkUI.pp.attr("d", data);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (linkUI.linka === 'child') {
|
|
|
+
|
|
|
+ var toNodeSize = nodeSize,
|
|
|
+ fromNodeSize = nodeSize;
|
|
|
+
|
|
|
+ var from = geom.intersectRect(
|
|
|
+ // rectangle:
|
|
|
+ fromPos.x - fromNodeSize / 2, // left
|
|
|
+ fromPos.y - fromNodeSize / 2, // top
|
|
|
+ fromPos.x + fromNodeSize / 2, // right
|
|
|
+ fromPos.y + fromNodeSize / 2, // bottom
|
|
|
+ // segment:
|
|
|
+ fromPos.x, fromPos.y, toPos.x, toPos.y) || fromPos; // if no intersection found - return center of the node
|
|
|
+
|
|
|
+ var to = geom.intersectRect(
|
|
|
+ // rectangle:
|
|
|
+ toPos.x - toNodeSize / 2, // left
|
|
|
+ toPos.y - toNodeSize / 2, // top
|
|
|
+ toPos.x + toNodeSize / 2, // right
|
|
|
+ toPos.y + toNodeSize / 2, // bottom
|
|
|
+ // segment:
|
|
|
+ toPos.x, toPos.y, fromPos.x, fromPos.y) || toPos; // if no intersection found - return center of the node
|
|
|
+
|
|
|
+ var data = 'M' + from.x + ',' + from.y +
|
|
|
+ 'L' + to.x + ',' + to.y;
|
|
|
+ linkUI.pp.attr("d", data);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ // graph.addNode( b, 'd43e8ea63b61e7669ded5b9d3c2e980f');
|
|
|
+ // graph.addLink(a, b);
|
|
|
+ /*
|
|
|
+ graphics.link(function(link) {
|
|
|
+ var isParent = (link.data === 'parent'),
|
|
|
+ ui = Viva.Graph.svg('path')
|
|
|
+ .attr('stroke', isParent ? 'red' : 'blue')
|
|
|
+ .attr('fill', 'none');
|
|
|
+ ui.isParent = isParent; // remember for future.
|
|
|
+ return ui;
|
|
|
+ }).placeLink(function(linkUI, fromPos, toPos) {
|
|
|
+ // linkUI - is the object returend from link() callback above.
|
|
|
+ var ry = linkUI.isParent ? 10 : 0,
|
|
|
+ // using arc command: http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands
|
|
|
+ data = 'M' + fromPos.x + ',' + fromPos.y +
|
|
|
+ ' A 10,' + ry + ',-30,0,1,' + toPos.x + ',' + toPos.y;
|
|
|
+ // 'Path data' (http://www.w3.org/TR/SVG/paths.html#DAttribute )
|
|
|
+ // is a common way of rendering paths in SVG:
|
|
|
+ linkUI.attr("d", data);
|
|
|
+ });
|
|
|
+
|
|
|
+*/
|
|
|
+
|
|
|
+
|
|
|
+ var layout = Viva.Graph.Layout.forceDirected(graph, {
|
|
|
+ springLength: 80,
|
|
|
+ springCoeff: 0.00001,
|
|
|
+ dragCoeff: 0.001,
|
|
|
+ gravity: -1.2
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var renderer = Viva.Graph.View.renderer(graph, {
|
|
|
+ graphics: graphics,
|
|
|
+ container: document.getElementById('visagraf'),
|
|
|
+ layout: layout
|
|
|
+ });
|
|
|
+ renderer.run();
|
|
|
+ }, 200)
|
|
|
+ return '<div id="visagraf" class="svga">v</div>'
|
|
|
+ },
|
|
|
+ meta: function(obj, field) {
|
|
|
+
|
|
|
+ return "<div class=\"status\"></div> <textarea class=dataeditor data-id=\"" + obj.path + "/._metas\">" + JSON.stringify(obj._metas, true, 2) + '</textarea>'
|
|
|
+
|
|
|
+ },
|
|
|
+ data: function(obj, field) {
|
|
|
+
|
|
|
+ return "<div class=\"status\"></div> <textarea class=dataeditor data-id=\"" + obj.path + "/._data\">" + JSON.stringify(obj._data, true, 2) + '</textarea>'
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ hasas: function(obj, field) {
|
|
|
+ return '<div class="hasas">' + _.map(obj._hasa, function(tob, name) {
|
|
|
+ return self.template(
|
|
|
+ '<li elepath="{{tob.path}}" pelepath="{{obj.path}}" ><a href="#{{name}}" class="elecontent">{{name}}</a> <button class="btn unhasa">X</button></li>', {
|
|
|
+ tob: tob,
|
|
|
+ obj: obj,
|
|
|
+ name: name
|
|
|
+ });
|
|
|
+ }).join("\n") + '</div>'
|
|
|
+ },
|
|
|
+ isas: function(obj, field) {
|
|
|
+ return '<div class="isas">' + _.map(obj._isa, function(tob, name) {
|
|
|
+ return self.template(
|
|
|
+ '<li elepath="{{tob.path}}" pelepath="{{obj.path}}" ><a href="#{{name}}" class="elecontent">{{name}}</a> <button class="btn unisa">X</button></li>', {
|
|
|
+ tob: tob,
|
|
|
+ obj: obj,
|
|
|
+ name: name
|
|
|
+ });
|
|
|
+ }).join("\n") + '</div>' + self.template('<input class=isaeditor data-id="{{obj.path}}" placeholder="find isas here.." />', {
|
|
|
+ obj: obj
|
|
|
+ });
|
|
|
+ },
|
|
|
+ extends: function(obj, field) {
|
|
|
+ return '<div class="extends">' + _.map(obj._extends, function(tob, name) {
|
|
|
+ return self.template(
|
|
|
+ '<li elepath="{{tob.path}}" pelepath="{{obj.path}}" ><a href="#{{name}}" class="elecontent">{{name}}</a> <button class="btn unextend">X</button></li>', {
|
|
|
+ tob: tob,
|
|
|
+ obj: obj,
|
|
|
+ name: name
|
|
|
+ });
|
|
|
+ }).join("\n") + '</div>' + self.template('<input class=extendeditor data-id="{{obj.path}}" placeholder="find inheritants here.." />', {
|
|
|
+ obj: obj
|
|
|
+ });
|
|
|
+ },
|
|
|
+ inherits: function(obj, field) {
|
|
|
+ return '<div class="inherits">' + _.map(obj._inherits, function(tob, name) {
|
|
|
+ return self.template(
|
|
|
+ '<li elepath="{{tob.path}}" pelepath="{{obj.path}}" ><a href="#{{name}}" class="elecontent">{{name}}</a> <button class="btn uninherit">X</button></li>', {
|
|
|
+ tob: tob,
|
|
|
+ obj: obj,
|
|
|
+ name: name
|
|
|
+ });
|
|
|
+ }).join("\n") + '</div>' + self.template('<input class=inheriteditor data-id="{{obj.path}}" placeholder="find extenders here.." />', {
|
|
|
+ obj: obj
|
|
|
+ });
|
|
|
+
|
|
|
+ },
|
|
|
+ children: function(obj, field) {
|
|
|
+ var s = '';
|
|
|
+ s += mmb("Add child", "<input type=\"text\" class=addchildeditor data-id=\"" + obj.path + "\" value=\"" + '"> ');
|
|
|
+
|
|
|
+ s += '<div class="children">' + _.map(obj.children, function(a) {
|
|
|
+ return a().path
|
|
|
+ }).map(function(k) {
|
|
|
+ return '<li elepath="' + k + '" pelepath="' + obj.path + '"><a href="#' + k + '" class="elecontent" > ' + k +
|
|
|
+ '</a> '
|
|
|
+ }).join("\n") + '</div>'
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ return s;
|
|
|
+
|
|
|
+ },
|
|
|
+ info: function(obj, field) {
|
|
|
+
|
|
|
+ return "Path: " + obj.path
|
|
|
+ },
|
|
|
+ upload: function(obj, field) {
|
|
|
+ return (
|
|
|
+ '<div class="upload-btn-wrapper"><button class="btn" onclick="$(\'#myupload\').click()">Upload files</button><input id="myupload" type="file" class="afile" style="opacity: 0;" name="file1" multiple data-id="' +
|
|
|
+ obj.path +
|
|
|
+ '" data-action="browser_handlefilen" data-emit="filesloaded" /></div> ');
|
|
|
+ },
|
|
|
+ content: function(obj, field) {
|
|
|
+ var content_type = "<div><input type=\"text\" class=propeditor data-id=\"" + obj.path + "/._metas.type\" value=\"" +
|
|
|
+ obj._metas.type +
|
|
|
+ '">' + "<select class=propselector data-id=\"" + obj.path + "/._metas.type\"></select></div>";
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var s = '';
|
|
|
+
|
|
|
+ s += mmb("Title", types.propeditor(obj, {
|
|
|
+ "path": "_data.title"
|
|
|
+ }))
|
|
|
+
|
|
|
+ if (obj._metas.type && obj._metas.type == "html") {
|
|
|
+ s += mmb("Content", "<div class=\"adj\"><div class=\"status\"></div> <textarea class=mceeditor data-id=\"" + obj.path + "/._data.content\">" + obj._data.content +
|
|
|
+ '</textarea></div>')
|
|
|
+ } else {
|
|
|
+ s += mmb("Body", "<div class=\"adj\"><div class=\"status\"></div> <textarea class=htmleditor data-id=\"" + obj.path + "/._data.content\">" + obj._data.content +
|
|
|
+ '</textarea></div>')
|
|
|
+ }
|
|
|
+ s += mmb("Type", content_type);
|
|
|
+ return s;
|
|
|
+
|
|
|
+ },
|
|
|
+
|
|
|
+ template: function(obj, field) {
|
|
|
+ return "<textarea class=htmleditor data-id=\"" + obj.path + "/._data.template\">" + obj._data.template +
|
|
|
+ '</textarea>'
|
|
|
+ },
|
|
|
+ texteditor: function(obj, field) {
|
|
|
+ var s = "";
|
|
|
+ s += '<textarea data-id="' + obj.path + '">' + opath.get(obj, field.path) + '</textarea>'
|
|
|
+ return s
|
|
|
+ },
|
|
|
+ propeditor: function(obj, field) {
|
|
|
+ var s = "";
|
|
|
+ s += '<input class="propeditor" data-id="' + obj.path + '/.' + field.path + '" value="' + opath.get(obj, field.path) + '">'
|
|
|
+ return s
|
|
|
+ },
|
|
|
+ lookup: function(obj, field) {
|
|
|
+ var temps = obj.getStuff3(field.path, function(a) {
|
|
|
+ return a
|
|
|
+ }, field.path)
|
|
|
+ var current_name = "",
|
|
|
+ current_data = "";
|
|
|
+ if (temps.length > 0) {
|
|
|
+ current_name = temps[0].name
|
|
|
+ current_data = temps[0].data;
|
|
|
+ }
|
|
|
+
|
|
|
+ var s = ''; //' <input type="text" data-id="'+obj.path+'/.'+field.path+'" value="' + opath.get(obj,field.path) + '">'
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var path = opath.get(obj, field.path);
|
|
|
+
|
|
|
+
|
|
|
+ if (current_name !== "" && !path) {
|
|
|
+ path = opath.get(self.oget(current_name), field.path);
|
|
|
+ s += ' inherit <a elepath="' + path + '" href="#' + path + '" class="elecontent" > ' + path + '</a>';
|
|
|
+ s += ' from ' + '<a elepath="' + current_name + '" href="#' + current_name + '" class="elecontent" > ' + current_name + '</a>'
|
|
|
+ } else {
|
|
|
+ if (!path) {
|
|
|
+ s += 'no object selected'
|
|
|
+ } else {
|
|
|
+ s += 'Current: <li> <a elepath="' + path + '" href="#' + path + '" class="elecontent" > ' + path + '</a> <button class="btn unset" data-id="' + obj.path +
|
|
|
+ '" ele-prop="' + field.path + '">X</button> </li>';
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ s += "<br><input class=\"propselector22\" ele-has=\"" + field.has + "\" ele-list=\"" + field.lookup + "\" ele-pick=\"" + field.pick + "\" data-id=\"" + obj.path +
|
|
|
+ "\" ele-prop=\"" + field.path + "\" >";
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ return s;
|
|
|
+ },
|
|
|
+ lookup2: function(obj, field) {
|
|
|
+ var temps = obj.getStuff3(field.path, function(a) {
|
|
|
+ return a
|
|
|
+ }, field.path)
|
|
|
+ var current_name = "",
|
|
|
+ current_data = "";
|
|
|
+ if (temps.length > 0) {
|
|
|
+ current_name = temps[0].name
|
|
|
+ current_data = temps[0].data;
|
|
|
+ }
|
|
|
+
|
|
|
+ var s = ''; //' <input type="text" data-id="'+obj.path+'/.'+field.path+'" value="' + opath.get(obj,field.path) + '">'
|
|
|
+ s += "<select class=propselector2 data-has=\"" + field.has + "\" data-list=\"" + field.lookup + "\" data-pick=\"" + field.pick + "\" data-id=\"" +
|
|
|
+ obj.path + "/." +
|
|
|
+ field.path + "\"></select>";
|
|
|
+
|
|
|
+ var path = opath.get(obj, field.path);
|
|
|
+
|
|
|
+
|
|
|
+ if (current_name !== "" && !path) {
|
|
|
+ path = opath.get(self.oget(current_name), field.path);
|
|
|
+ s += ' inherit <a elepath="' + path + '" href="#' + path + '" class="elecontent" > ' + path + '</a>';
|
|
|
+ s += ' from ' + '<a elepath="' + current_name + '" href="#' + current_name + '" class="elecontent" > ' + current_name + '</a>'
|
|
|
+ } else {
|
|
|
+ s += '<a elepath="' + path + '" href="#' + path + '" class="elecontent" > ' + path + '</a>';
|
|
|
+ }
|
|
|
+
|
|
|
+ return s;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ return types;
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+Asystem.prototype.renderEditor2a = function(obj) {
|
|
|
+ var self = this;
|
|
|
+ var stash = [];
|
|
|
+
|
|
|
+ // stash.push(["Parent", '<div class="parents">' + self.template("{{parents::}}", obj) + '</div>']);
|
|
|
+
|
|
|
+ // stash.push(["Path", "<input type=\"text\" class=patheditor data-id=\"" + obj.path + "\" value=\"" + obj.path + '">']);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /* stash.push(["Title", "<div class=\"status\"></div> <input type=\"text\" class=propeditor data-id=\"" + obj.path + "/._data.title\" value=\"" + obj._data.title +
|
|
|
+ '">'
|
|
|
+ ]);
|
|
|
+
|
|
|
+*/
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /* if (obj.name !== "root") {
|
|
|
+ (self.oget("root")._metas.fields || []).map(function(field) {
|
|
|
+ stash.push([field.title, types[field.type](obj, field)]);
|
|
|
+ })
|
|
|
+
|
|
|
+ }*/
|
|
|
+
|
|
|
+ /*
|
|
|
+ if (obj._metas && obj.name !== "root") {
|
|
|
+ (obj._metas.fields || []).map(function(field) {
|
|
|
+ stash.push([field.title, types[field.type](obj, field)]);
|
|
|
+ })
|
|
|
+ }*/
|
|
|
+
|
|
|
+ function mkmod(obj, field) {
|
|
|
+ var data = "";
|
|
|
+ if (types[field.type]) {
|
|
|
+ data = types[field.type](obj, field)
|
|
|
+ } else {
|
|
|
+ data = field.data;
|
|
|
+ }
|
|
|
+ var s = '<div class="module ' + field.type + '" ><div class="head">' + field.title + '</div><div class="content">' + data + '</div></div>'
|
|
|
+ return s
|
|
|
+ }
|
|
|
+
|
|
|
+ function mkmodg(name, title, data) {
|
|
|
+ var s = '<div id="m_' + name + '" class="modulegroup" ><div class="head">' + title + '</div><div class="content">' + data + '</div></div>'
|
|
|
+ return s
|
|
|
+ }
|
|
|
+
|
|
|
+ function mktab() {
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ var xx = []
|
|
|
+ if (obj._metas.notself) {} else {
|
|
|
+
|
|
|
+ var fff = obj.getStuff("_metas.fields", function(a) {
|
|
|
+ return a
|
|
|
+ }, "fi");
|
|
|
+ fff.map(function(ff) {
|
|
|
+ ff.data.map(function(field) {
|
|
|
+ xx.push(mkmod(obj, field));
|
|
|
+ })
|
|
|
+
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ stash.push([" ", mkmodg("info", " ", [mkmod(obj, {
|
|
|
+ "type": "info",
|
|
|
+ "title": "Info",
|
|
|
+ "data": "Path: " + obj.path
|
|
|
+ }), '<div id="editorbuttons" class="buttons"></div>'].join("\n"))]);
|
|
|
+
|
|
|
+
|
|
|
+ /* var qq = []
|
|
|
+ qq.push(mkmod(obj, {
|
|
|
+ "title": "Path",
|
|
|
+ "data": "<input type=\"text\" class=patheditor data-id=\"" + obj.path + "\" value=\"" + obj.path + '">'
|
|
|
+ }));
|
|
|
+ qq.push(mkmod(obj, {
|
|
|
+ "title": "Parents",
|
|
|
+ "data": self.template("{{parents::}}", obj)
|
|
|
+ }));
|
|
|
+
|
|
|
+ stash.push([" ", mkmodg("content", " ", qq.join("\n"))]);
|
|
|
+*/
|
|
|
+
|
|
|
+ stash.push([" ", mkmodg("content", " ", xx.join("\n"))]);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var left = [];
|
|
|
+ var right = [];
|
|
|
+ right.push(mkmod(obj, {
|
|
|
+ "type": "children",
|
|
|
+ "title": "Children"
|
|
|
+ }));
|
|
|
+ left.push(mkmod(obj, {
|
|
|
+ "type": "inherits",
|
|
|
+ "title": "Inherits"
|
|
|
+ }));
|
|
|
+ left.push(mkmod(obj, {
|
|
|
+ "type": "extends",
|
|
|
+ "title": "Extends"
|
|
|
+ }));
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ stash.push([" ", '<div class="dleft">' + mkmodg("x", " ", left.join("\n")) + '</div><div class="dright">' + mkmodg("y", " ", right.join("\n")) + '</div>']);
|
|
|
+
|
|
|
+
|
|
|
+ stash.push([" ", '<div class="toolsa">' + mkmodg("tools", " ", [mkmod(obj, {
|
|
|
+ "type": "upload",
|
|
|
+ "title": "Upload"
|
|
|
+ }), mkmod(obj, {
|
|
|
+ "type": "clone",
|
|
|
+ "title": "Clone",
|
|
|
+ "data": "<div class=\"status\"></div> <input type=\"text\" class=cloneeditor data-id=\"" + obj.path + "\" value=\"" + '"> '
|
|
|
+ }), mkmod(obj, {
|
|
|
+ "type": "delete",
|
|
|
+ "title": "Delete",
|
|
|
+ "data": '<li> <button class="deleteele" data-id="' + obj.path + '">Trash</button> <button class="zapele" data-id="' + obj.path +
|
|
|
+ '">Delete Permanently</button></li>'
|
|
|
+ })].join("\n")) + '</div>']);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var left = [];
|
|
|
+ var right = [];
|
|
|
+
|
|
|
+ left.push(mkmod(obj, {
|
|
|
+ "type": "isas",
|
|
|
+ "title": "Is a thing"
|
|
|
+ }))
|
|
|
+
|
|
|
+ right.push(mkmod(obj, {
|
|
|
+ "type": "hasas",
|
|
|
+ "title": "Is thing to something"
|
|
|
+ }))
|
|
|
+
|
|
|
+ stash.push([" ", '<div class="dleft">' + mkmodg("xx", " ", left.join("\n")) + '</div><div class="dright">' + mkmodg(",yy", " ", right.join("\n")) + '</div>']);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var xx = [];
|
|
|
+
|
|
|
+ xx.push(mkmod(obj, {
|
|
|
+ "type": "template",
|
|
|
+ "title": "Template"
|
|
|
+ }))
|
|
|
+
|
|
|
+ xx.push(mkmod(obj, {
|
|
|
+ "type": "templatepaths",
|
|
|
+ "title": "Paths"
|
|
|
+ }))
|
|
|
+
|
|
|
+ stash.push([" ", mkmodg("x", "Template", xx.join("\n"))]);
|
|
|
+
|
|
|
+
|
|
|
+ stash.push([" ", "<hr>"]);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /* stash.push(["Icon", "<div class=\"status\"></div> <input type=\"text\" class=iconselecter data-id=\"" + obj.path + "/._data.iconclass\" value=\"" + obj._data.iconclass +
|
|
|
+ '"> '
|
|
|
+ ]);
|
|
|
+*/
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ if (obj._data.data && obj._data.data.length > 8192) {
|
|
|
+ stash.push(["Data too big", obj._data.data.length + " :" + obj._data.data.substring(0, 200)])
|
|
|
+ } else {
|
|
|
+ stash.push(["Data", "<div class=\"status\"></div> <textarea class=dataeditor data-id=\"" + obj.path + "/._data\">" + JSON.stringify(obj._data, true, 2) +
|
|
|
+ '</textarea>'
|
|
|
+ ]);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ stash.push(["Meta", "<div class=\"status\"></div> <textarea class=dataeditor data-id=\"" + obj.path + "/._metas\">" + JSON.stringify(obj._metas, true, 2) +
|
|
|
+ '</textarea>'
|
|
|
+ ]);
|
|
|
+
|
|
|
+
|
|
|
+ _.map(_.omit(obj, ignores), function(val, prop) {
|
|
|
+ if (typeof(val) === "function") {
|
|
|
+ stash.push(["JS " + prop + '<li><button class="deletefunc" data-id="' + obj.path + "/." + prop + '">Delete</button></li>',
|
|
|
+ "<div class=\"status\"></div> <textarea class=jseditor data-id=\"" + obj.path + "/." + prop + "\">" + (obj[prop] + "") +
|
|
|
+ '</textarea> '
|
|
|
+ ]);
|
|
|
+
|
|
|
+ }
|
|
|
+ })
|
|
|
+ stash.push(["JS ", "<input class=\"createfunc\" data-id=\"" + obj.path + "\"> "]);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ var ss = ('<div class="stash">' + stash.map(function(a) {
|
|
|
+ return '<div class="stt"><div class="inn"><div class="st1">' + (a[0] === false ? "" : a[0] + "") + '</div><div class="st2">' + a[1] +
|
|
|
+ '</div></div></div>'
|
|
|
+ }).join("\n") + '</div>');
|
|
|
+ return ss
|
|
|
+}
|
|
|
+Asystem.prototype.renderEditor3 = function(obj) {
|
|
|
+ var self = this;
|
|
|
+ var stash = [];
|
|
|
+
|
|
|
+ var prot = {}
|
|
|
+ var meta = {}
|
|
|
+ allchildren(obj).map(function(c) {
|
|
|
+ var arr = opath.flatten(c._data, "");
|
|
|
+ arr.map(function(a) {
|
|
|
+ prot[a[0]] = prot[a[0]] || {}
|
|
|
+ prot[a[0]][a[1]] = prot[a[0]][a[1]] || 0
|
|
|
+ prot[a[0]][a[1]] += 1;
|
|
|
+ })
|
|
|
+
|
|
|
+ var arr = opath.flatten(c._metas, "");
|
|
|
+ arr.map(function(a) {
|
|
|
+ if (a[0].indexOf('_wp_attachment_backup_sizes') > -1) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ meta[a[0]] = meta[a[0]] || {}
|
|
|
+ meta[a[0]][a[1]] = meta[a[0]][a[1]] || 0
|
|
|
+ meta[a[0]][a[1]] += 1;
|
|
|
+ })
|
|
|
+ });
|
|
|
+ var prota = _.map(prot, function(vala, nama) {
|
|
|
+ return nama + " : " + _.size(vala)
|
|
|
+ });
|
|
|
+ var metas = _.map(meta, function(vala, nama) {
|
|
|
+ return nama + " : " + _.size(vala)
|
|
|
+ });
|
|
|
+
|
|
|
+ stash.push(["Data Properties", '<pre>' + JSON.stringify(prota, true, 2) + '</pre>'])
|
|
|
+ stash.push(["Meta Properties", '<pre>' + JSON.stringify(metas, true, 2) + '</pre>'])
|
|
|
+
|
|
|
+ var ss = ('<div class="stash">' + stash.map(function(a) {
|
|
|
+ return '<div class="stt"><div class="st1">' + (a[0] === false ? "" : a[0] + "") + '</div><div class="st2">' + a[1] + '</div></div>'
|
|
|
+ }).join("\n") + '</div>');
|
|
|
+ return ss
|
|
|
+}
|
|
|
+
|
|
|
+Asystem.prototype.getRenderTemplate = function(obj) {
|
|
|
+ var self = this;
|
|
|
+ var stash = [];
|
|
|
+ var templates = []
|
|
|
+
|
|
|
+ var temps = obj.getStuff3("_data.template", function(a) {
|
|
|
+ return a
|
|
|
+ }, "_data.template")
|
|
|
+ var myself;
|
|
|
+
|
|
|
+ var x = {};
|
|
|
+ temps.map(function(a) {
|
|
|
+ x[a.name] = a
|
|
|
+ });
|
|
|
+ temps = _.map(x, function(a) {
|
|
|
+ return a
|
|
|
+ });
|
|
|
+ return temps
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+Asystem.prototype.rendertemplate2 = function(obj) {
|
|
|
+ var self = this;
|
|
|
+ var stash = [];
|
|
|
+ var templates = []
|
|
|
+
|
|
|
+ var temps = obj.getStuff3("_data.template", function(a) {
|
|
|
+ return a
|
|
|
+ }, "_data.template")
|
|
|
+ var myself;
|
|
|
+
|
|
|
+ var x = {};
|
|
|
+ temps.map(function(a) {
|
|
|
+ x[a.name] = a
|
|
|
+ });
|
|
|
+ temps = _.map(x, function(a) {
|
|
|
+ return a
|
|
|
+ });
|
|
|
+
|
|
|
+ var ss = '<div eletemplate="' + obj.path + '"> ' + self.template(obj._data.template, obj) + ' </div>'
|
|
|
+ return ss;
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+Asystem.prototype.rendertemplate = function(obj) {
|
|
|
+ var self = this;
|
|
|
+ var stash = [];
|
|
|
+ var templates = []
|
|
|
+
|
|
|
+ var temps = obj.getStuff3("_data.template", function(a) {
|
|
|
+ return a
|
|
|
+ }, "_data.template")
|
|
|
+ var myself;
|
|
|
+
|
|
|
+ var x = {};
|
|
|
+ temps.map(function(a) {
|
|
|
+ x[a.name] = a
|
|
|
+ });
|
|
|
+ temps = _.map(x, function(a) {
|
|
|
+ return a
|
|
|
+ });
|
|
|
+ if (obj._data.template && obj._data.template.indexOf("{{output}}") > -1) {
|
|
|
+ myself = temps.shift();
|
|
|
+ }
|
|
|
+
|
|
|
+ var outer = temps.filter(function(a) {
|
|
|
+ return a.data.indexOf("{{output}}") > -1
|
|
|
+ })
|
|
|
+ var otemp = "{{output}}"
|
|
|
+ var outera = "";
|
|
|
+ if (outer.length) {
|
|
|
+ outera = outer[0];
|
|
|
+ otemp = outer[0].data;
|
|
|
+ }
|
|
|
+ var output = temps.filter(function(a) {
|
|
|
+ return a.data.indexOf("{{output}}") === -1 && a.name.indexOf("menu") === -1 && a.name.indexOf("header") === -1 && a.from.indexOf("isa_") === -1
|
|
|
+ }).map(function(tmp) {
|
|
|
+ return '<div eletemplate="' + tmp.name + '"> ' + self.template(tmp.data, obj) + ' </div>';
|
|
|
+ }).join("\n")
|
|
|
+
|
|
|
+ var menus = temps.filter(function(a) {
|
|
|
+ return a.name.indexOf("menu") > -1
|
|
|
+ }).slice(0, 1).map(function(tmp) {
|
|
|
+ return '<div eletemplate="' + tmp.name + '"> ' + self.template(tmp.data, obj) + ' </div>';
|
|
|
+ }).join("\n")
|
|
|
+
|
|
|
+
|
|
|
+ var headers = temps.filter(function(a) {
|
|
|
+ return a.name.indexOf("header") > -1
|
|
|
+ }).slice(0, 1).map(function(tmp) {
|
|
|
+ return '<div eletemplate="' + tmp.name + '"> ' + self.template(tmp.data, obj) + ' </div>';
|
|
|
+ }).join("\n")
|
|
|
+ /*
|
|
|
+ var isas = temps.filter(function(a) {
|
|
|
+ return a.from.indexOf("isa_") > -1
|
|
|
+ }).map(function(tmp) {
|
|
|
+ console.log("ISA,",tmp);
|
|
|
+ if(tmp.inas.length>2){
|
|
|
+ var tma=tmp.inas.pop();
|
|
|
+ tma=tmp.inas.pop();
|
|
|
+ return '<div eletemplate="' + tmp.name + '">IIS ' + self.template(tmp.data, self.oget(tma)) + ' </div>';
|
|
|
+
|
|
|
+ }else{
|
|
|
+ return '<div eletemplate="' + tmp.name + '">IIS ' + self.template(tmp.data, self.oget(tmp.name)) + ' </div>';
|
|
|
+
|
|
|
+ }
|
|
|
+ }).join("\n")
|
|
|
+*/
|
|
|
+ if (myself) {
|
|
|
+ var ai = Object.assign({
|
|
|
+ "output": output,
|
|
|
+ "menu": menus,
|
|
|
+ "header": headers,
|
|
|
+ "selfie": JSON.stringify(temps, true, 2)
|
|
|
+ }, obj);
|
|
|
+
|
|
|
+ var ss = '<div eletemplate="' + myself.name + '"> ' + self.template(myself.data, ai) + ' </div>'
|
|
|
+
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ var ai = Object.assign({
|
|
|
+ "output": output,
|
|
|
+ "menu": menus,
|
|
|
+ "header": headers,
|
|
|
+ "selfie": JSON.stringify(temps, true, 2)
|
|
|
+ }, obj);
|
|
|
+
|
|
|
+ var ss = '<div eletemplate="' + outer.name + '"> ' + self.template(otemp, ai) + ' </div>'
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ return ss
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+Asystem.prototype.allchildren = function(ronly) {
|
|
|
+ var self = this;
|
|
|
+ var arr = [];
|
|
|
+ if (ronly) {
|
|
|
+ return [].concat.apply(arr, allchildren(self.oo[ronly]))
|
|
|
+ }
|
|
|
+ _.keys(self.oo).filter((k) => typeof(self.oo[k]) === "function").map(function(key) {
|
|
|
+ arr = [].concat.apply(arr, allchildren(self.oo[key]))
|
|
|
+ })
|
|
|
+ return arr;
|
|
|
+}
|
|
|
+Asystem.prototype.allchildpaths = function(ronly) {
|
|
|
+ var self = this;
|
|
|
+ var arr = [];
|
|
|
+ _.keys(self.oo).filter((k) => typeof(self.oo[k]) === "function").map(function(key) {
|
|
|
+ ronly ? (ronly === key ? arr = [].concat.apply(arr, allchildpaths(self.oo[key])) : null) : arr = [].concat.apply(arr, allchildpaths(self.oo[key]))
|
|
|
+ })
|
|
|
+ return arr;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+module.exports = Asystem;
|