editor_types.js 78 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191
  1. module.exports = function(self) {
  2. function mmb(t, d) {
  3. return '<div class="mb"><h3>' + t + '</h3>' + d + '</div>';
  4. }
  5. function allchildren(obj_) {
  6. var obj = typeof(obj_) === "function" ? obj_() : obj_;
  7. return [].concat.apply([obj], _.map(obj.children, allchildren))
  8. }
  9. var _ = require("lodash");
  10. var opath = require("opath");
  11. var types = {}
  12. types.allmodules = function(obj, field) {
  13. return '<pre>' + self.allchildren().filter(function(a) {
  14. return a._metas.modules ? true : false
  15. }).map(function(a) {
  16. return _.repeat(" ", a.path.split("/").length) + '<a href="#" elepath="' + a.path + '" class="elecontent ' + (a.path === obj.path ? 'active' : '') +
  17. '">' + a.path + '</a>'
  18. }).join("\n") + '</pre>';
  19. }
  20. types.availablemodules = function(obj, field) {
  21. var s = '<pre>' + _.map(self.editorTypes(), function(func, name) {
  22. return name;
  23. }).join("\n");
  24. s += "\n";
  25. s += self.allchildren().filter(function(a) {
  26. return a.modulefunc
  27. }).map(function(child) {
  28. return '<a href="#" class="elecontent" elepath="' + child.path + '">' + child.path + '.modulefunc</a>';
  29. }).join("\n");
  30. s += '</pre>';
  31. return s;
  32. }
  33. types.layouttabedit = function(obj, field) {
  34. field.excludekeys = field.excludekeys || ["layouts"];
  35. return types.alineedit(obj, field);
  36. }
  37. types.alineedit = function(obj, field) {
  38. var oa = opath.get(obj, field.path);
  39. /*if(!oa){
  40. opath.set(obj, field.path,{})
  41. }
  42. */
  43. var excludekeys = ["type", "modules"].concat(field.excludekeys || []);
  44. console.log("EEEEEEEEEEEEEEEEEEEEEE",excludekeys);
  45. var tmp = {}
  46. var s = _.keys(oa).filter(function(key) {
  47. return excludekeys.indexOf(key) === -1;
  48. }).map(function(key) {
  49. if (_.isArray(oa[key])) {
  50. return _.map(oa[key], function(tab, i) {
  51. return '<div class="' + key + '"><label>' + key + '</label><div class="subs">' + types.alineedit(obj, {
  52. path: field.path + "." + key + "." + i
  53. }) + '</div></div>'
  54. }).join("\n");
  55. } else {
  56. if (typeof(oa[key]) === "function") {
  57. tmp[obj.path + '/.' + field.path + '.' + key] = true;
  58. return '<div class="' + key + '"><label>' + key + '</label> <textarea class="mini " data-id="' + obj.path + '/.' + field.path + '.' +
  59. key + '" name="' + key + '" >' + oa[key] + '</textarea>' + ((oa.type && types[oa.type] && types[oa.type].settings && types[oa.type].settings[
  60. key]) ? types[oa.type].settings[key].info + ' def:' + types[oa.type].settings[key].default : '') + '</div>';
  61. }
  62. if (_.isObject(oa[key])) {
  63. return '<div class="' + key + '"><label>' + key + '</label><div class="subs">' + _.map(oa[key], function(taba, i) {
  64. return '<span>' + i + '</span>' + (typeof(taba) === "boolean" ? types.truefalse(obj, {
  65. path: field.path + "." + key + "." + i
  66. }) : '<input class="mini" value="' + taba + '">')
  67. }).join("\n") + '</div></div>';
  68. } else {
  69. if (key === "type") {
  70. return '<div class="' + key + '"><label>' + key + '</label> <select data-id="' + obj.path + '/.' + field.path + '.' + key + '" class="changetype">' +
  71. _.map(types, function(func, name) {
  72. return '<option value="' + name + '" ' + (name === oa[key] ? 'selected' : '') + '>' + name + '</option>'
  73. }).join("\n") + '</select>' + (types[oa[key]] ? types[oa[key]].help : 'na') + '</div>';
  74. } else {
  75. if (key.indexOf("data") === 0) {
  76. tmp[obj.path + '/.' + field.path + '.' + key] = true;
  77. return '<div class="' + key + '"><label>' + key + '</label> <textarea class="mini htmleditor" data-id="' + obj.path + '/.' + field.path + '.' +
  78. key + '" name="' + key + '">' + oa[key] + '</textarea>' + ((oa.type && types[oa.type] && types[oa.type].settings && types[oa.type].settings[
  79. key]) ? types[oa.type].settings[key].info + ' def:' + types[oa.type].settings[key].default : '') + '</div>';
  80. } else {
  81. tmp[obj.path + '/.' + field.path + '.' + key] = true;
  82. return '<div class="' + key + '"><label>' + key + '</label> <input class="mini propeditor" data-id="' + obj.path + '/.' + field.path + '.' +
  83. key + '" name="' + key + '" value="' + oa[key] + '">' + ((oa.type && types[oa.type] && types[oa.type].settings && types[oa.type].settings[
  84. key]) ? types[oa.type].settings[key].info + ' def:' + types[oa.type].settings[key].default : '') + '</div>';
  85. }
  86. }
  87. }
  88. }
  89. }).join("\n");
  90. if (types[oa.type]) {
  91. s = '<div class="type"><label>type</label> <select data-id="' + obj.path + '/.' + field.path + '.type" class="changetype" >' + _.map(types, function(func, name) {
  92. return '<option value="' + name + '" ' + (name === oa.type ? 'selected' : '') + '>' + name + '</option>'
  93. }).join("\n") + '</select>' + (types[oa.type] ? types[oa.type].help : 'na') + '</div>' + s
  94. s += _.map(types[oa.type].settings || {}, function(val, key) {
  95. if (tmp[obj.path + '/.' + field.path + '.' + key]) {
  96. return "";
  97. }
  98. return '<div class="' + key + '"><label>' + key + '</label> <input class="mini propeditor" data-id="' + obj.path + '/.' + field.path + '.' + key +
  99. '" name="' + key + '" value="' + (oa[key] || val.default) + '"> ' + (val.info ? val.info + ' def:' + val.default : '') + '</div>';
  100. })
  101. } else {
  102. s = '<div class="type"><label>type</label> <select data-id="' + obj.path + '/.' + field.path + '.type" class="changetype" >' + _.map(types, function(func, name) {
  103. return '<option value="' + name + '" ' + (name === oa.type ? 'selected' : '') + '>' + name + '</option>'
  104. }).join("\n") + '</select>' + (types[oa.type] ? types[oa.type].help : 'na') + '</div>' + s
  105. }
  106. s += '<div class="newprop" data-id="' + obj.path + '/.' + field.path +
  107. '"><input class="newprop_prop" type="text" placeholder="key" ><input type="text" placeholder="value" class="newprop_value"></div>'
  108. return s;
  109. }
  110. types.elementseditor = function(obj, field) {
  111. console.log("FFFF", field);
  112. var template_tab = ""
  113. template_tab += '<li data-id="{{path}}" data-prop="{{childrenpath}}" class="{{clss}}">';
  114. if ((!field.show) ||
  115. (field.show && field.show.tool !== false)
  116. ) {
  117. template_tab += '<div class="tool">';
  118. template_tab += '<span class="expand"> </span>';
  119. if ((!field.show) ||
  120. (field.show && field.show.mover !== false)
  121. ) {
  122. template_tab += '<span class="hh"> </span>';
  123. }
  124. if ((!field.show) ||
  125. (field.show && field.show.add !== false)
  126. ) {
  127. template_tab += '<button tab-index=-1 data-id="{{path}}.{{childrenpath}}" class="addelement">Add</button>';
  128. }
  129. if ((!field.show) ||
  130. (field.show && field.show.modules !== false)
  131. ) {
  132. template_tab += '<button tab-index=-1 data-id="{{path}}.modules" class="addmodules">Add module</button>';
  133. }
  134. if ((!field.show) ||
  135. (field.show && field.show.delete !== false)
  136. ) {
  137. template_tab += '<button tab-index=-1 data-id="{{path}}" class="deletetab">Delete</button>';
  138. }
  139. if ((!field.show) ||
  140. (field.show && field.show.title !== false)
  141. ) {
  142. template_tab += '<input class="mini propeditor" rerender=true data-id="{{path}}.title" value="{{tab.title}}" >';
  143. }
  144. if ((!field.show) ||
  145. (field.show && field.show.name !== false)
  146. ) {
  147. template_tab += '<input class="mini propeditor" rerender=true data-id="{{path}}.name" value="{{tab.name}}" >';
  148. }
  149. template_tab += '</div>'
  150. }
  151. if ((!field.show) ||
  152. (field.show && field.show.editor !== false)
  153. ) {
  154. if (field.defaults) {
  155. template_tab += '<div class="dde">' + _.map(field.defaults, function(d, k) {
  156. return '<input type="text" '
  157. }).join("\n") + '</div>'
  158. }
  159. template_tab += '<div class="edi">{{xtypeselect}}{{alinee}}</div>'
  160. }
  161. if ((!field.show) ||
  162. (field.show && field.show.modules !== false)
  163. ) {
  164. template_tab += '<ol class="moda" data-id="{{path}}.modules">{{mods}}</ol>'
  165. } else {
  166. if (field.allsamemodule) {
  167. template_tab += '<ol class="moda" data-id="{{path}}.modules">{{mods}}</ol>'
  168. }
  169. }
  170. if ((!field.show) ||
  171. (field.show && field.show.children !== false)
  172. ) {
  173. template_tab += '<ol class="tubu" data-id="{{path}}.{{childrenpath}}">{{content}}</ol>'
  174. }
  175. template_tab += '</li>'
  176. var template_module = '<li data-id="{{path}}.modules.{{index}}">';
  177. if ((!field.show) ||
  178. (field.show && field.show.tool !== false)
  179. ) {
  180. template_module += '<div class="tool">'
  181. template_module += '<span class="expandm"> </span>'
  182. template_module += '<span class="hh"> </span>'
  183. template_module += '{{xtypeselect}}'
  184. template_module += '<span class="deletemod">Delete</span>'
  185. template_module += '<div class="title">{{mod.type}} {{mod.name}} {{mod.title}}</div>'
  186. template_module += '</div>'
  187. }
  188. template_module += '<div class="modcon"></div>'
  189. template_module += '</li>'
  190. var ta3 =
  191. `<div >
  192. <div class="tool"><button data-id="{{obj.path}}/.{{fieldpath}}" data-name="{{dataname}}" class="addelement">Add</button></div>
  193. <ol class="tibi" data-id="{{obj.path}}/.{{fieldpath}}">
  194. {{basecontent}}
  195. </ol>
  196. </div>`;
  197. function rec_go(arr, prop, path, func, level_) {
  198. var level = level_ || 0;
  199. return _.map((arr || []), function(a, i) {
  200. if (a[prop] && _.isArray(a[prop])) {
  201. return func(a, path + "." + i, rec_go(a[prop], prop, path + "." + i + "." + prop, func, level + 1));
  202. } else {
  203. return func(a, path + "." + i)
  204. }
  205. }).join("\n");
  206. }
  207. function gmods(tab, path) {
  208. var arrr = (tab.modules || []);
  209. return _.map(arrr, function(m, mi) {
  210. return self.template(template_module, {
  211. tab: tab,
  212. path: path,
  213. mod: m,
  214. /* datas: types[m.type] ? types[m.type](obj, m) : "na",*/
  215. typeselect: '<select data-id="' + path + '.modules.' + mi + '.type" class="changetype" >' + _.keys(types).filter(
  216. function(
  217. name) {
  218. return name.indexOf("element_") > -1
  219. }).map(function(name) {
  220. return '<option value="' + name + '" ' + (name === m.type ? 'selected' : '') + '>' + name + '</option>'
  221. }).join("\n") + '</select>',
  222. index: mi
  223. })
  224. }).join("\n")
  225. }
  226. var zearr = opath.get(obj, field.path);
  227. if (field.find) {
  228. /* zearr = zearr.filter(function(a) {
  229. return a.name.indexOf(field.find) > -1
  230. })*/
  231. }
  232. return self.template(ta3, {
  233. dataname: field.dataname,
  234. obj: obj,
  235. childrenpath: field.childrenpath,
  236. fieldpath: field.path,
  237. basecontent: rec_go(zearr, field.childrenpath, obj.path + "/." + field.path, function(tab, path, content) {
  238. /* if(field.find && tab.name.indexOf(field.find)===-1){
  239. return "xx:"+field.find+":"+tab.name;
  240. }*/
  241. return self.template(template_tab, {
  242. clss: field.find && tab.name.indexOf(field.find) === -1 ? "hidden" : "show",
  243. tab: tab,
  244. path: path,
  245. typeselect: '<select data-id="' + path + '.type" class="changetype" >' + _.keys(types).filter(function(name) {
  246. return name.indexOf("element_") > -1
  247. }).map(function(name) {
  248. return '<option value="' + name + '" ' + (name === tab.type ? 'selected' : '') + '>' + name + '</option>'
  249. }).join("\n") + '</select>',
  250. childrenpath: field.childrenpath,
  251. alinee: types.alineedit(obj, {
  252. path: path.split("/.").pop(),
  253. excludekeys: [field.childrenpath]
  254. }),
  255. mods: gmods(tab, path),
  256. content: content
  257. })
  258. })
  259. });
  260. }
  261. types.elementseditor.help = "elementseditor help";
  262. types.elementseditor.settings = {
  263. "path": {
  264. default: "_data.elements",
  265. "info": "path to array"
  266. },
  267. "childrenpath": {
  268. default: "elements",
  269. "info": "array name"
  270. },
  271. "show": {
  272. default: {
  273. "tool": true,
  274. "mover": true,
  275. "add": true,
  276. "modules": true,
  277. "children": true,
  278. "delete": true,
  279. "editor": true
  280. },
  281. "info": "shows"
  282. }
  283. };
  284. types.elementstree = function(obj, field) {
  285. var ta1 =
  286. `<li data-id="{{path}}" data-prop="{{childrenpath}}">
  287. <div class="tool">
  288. <div class="title">{{tab.title}}</div>
  289. </div>
  290. <div class="edi">
  291. </div>
  292. <ol class="moda" data-id="{{path}}.modules">
  293. {{mods}}
  294. </ol>
  295. <ol class="tubu" data-id="{{path}}.{{childrenpath}}">
  296. {{content}}
  297. </ol>
  298. </li>`;
  299. var ta2 =
  300. `<li data-id="{{path}}.modules.{{index}}">
  301. <div class="title">{{mod.title}}</div>
  302. <div>
  303. {{datas}}
  304. </div>
  305. </li>`;
  306. var ta3 =
  307. `<div class="t_{{obj.name}} {{field.unc}}">
  308. <ol class="tibi" data-id="{{obj.path}}/.{{fieldpath}}">
  309. {{basecontent}}
  310. </ol>
  311. </div>`;
  312. function rec_go(arr, prop, path, func, level_) {
  313. var level = level_ || 0;
  314. return _.map((arr || []), function(a, i) {
  315. if (a[prop] && _.isArray(a[prop])) {
  316. return func(a, path + "." + i, rec_go(a[prop], prop, path + "." + i + "." + prop, func, level + 1));
  317. } else {
  318. return func(a, path + "." + i)
  319. }
  320. }).join("\n");
  321. }
  322. return self.template(ta3, {
  323. obj: obj,
  324. childrenpath: field.childrenpath,
  325. fieldpath: field.path,
  326. field: field,
  327. basecontent: rec_go(opath.get(obj, field.path), field.childrenpath, obj.path + "/." + field.path, function(tab, path, content) {
  328. return self.template(ta1, {
  329. tab: tab,
  330. path: path,
  331. childrenpath: field.childrenpath,
  332. mods: _.map((tab.modules || []), function(m, mi) {
  333. return self.template(ta2, {
  334. tab: tab,
  335. path: path,
  336. mod: m,
  337. datas: types[m.type] ? types[m.type](obj, m) : "na",
  338. index: mi
  339. })
  340. }).join("\n"),
  341. content: content
  342. })
  343. })
  344. });
  345. }
  346. types.elementstree.help = "elements view";
  347. types.elementstree.settings = {
  348. "path": {
  349. default: "_data.elements",
  350. "info": "path to array"
  351. },
  352. "childrenpath": {
  353. default: "elements",
  354. "info": "array name"
  355. }
  356. };
  357. types.get_renders = function(obj, field) {
  358. var layouts = obj.getStuff3(field.path, function(a) {
  359. return a
  360. }, field.path);
  361. var yy = {}
  362. while (layouts.length) {
  363. var ta = layouts.pop();
  364. ta.data.map(function(tta) {
  365. var t = _.cloneDeep(tta);
  366. t.froma = ta.name;
  367. var tname = t.name;
  368. if (t.target) {
  369. tname = t.target
  370. }
  371. if (t.method) {
  372. if (t.method == "replace") {
  373. if (yy[tname]) {
  374. var tt = yy[tname].froma;
  375. yy[tname] = t;
  376. yy[tname].froma_replaced = tt;
  377. } else {
  378. yy[tname] = t;
  379. }
  380. }
  381. if (t.method == "append") {
  382. if (yy[tname]) {
  383. yy[tname].content = yy[tname].content || []
  384. yy[tname].content.push(t);
  385. } else {
  386. yy[tname] = t;
  387. }
  388. }
  389. if (t.method == "prepend") {
  390. if (yy[tname]) {
  391. yy[tname].content = yy[tname].content || []
  392. yy[tname].content.unshift(t);
  393. } else {
  394. yy[tname] = t;
  395. }
  396. }
  397. } else {
  398. if (yy[tname]) {
  399. yy[tname].content = yy[tname].content || []
  400. yy[tname].content.push(t);
  401. } else {
  402. yy[tname] = t;
  403. }
  404. }
  405. })
  406. }
  407. return yy;
  408. }
  409. types.renderlayout = function(obj, field) {
  410. console.log("FFFFFFFFFFFFFFFFFFFFFFFFFFFFF", field);
  411. function rega(a) {
  412. return self.template(field.data ? field.data : '<div class="{{keya}}" data-froma="{{val.froma}}">{{mods}}{{content}}</div>', {
  413. keya: a.name,
  414. val: a,
  415. mods: (a.modules || []).map(function(m) {
  416. return types[m.type] ? types[m.type](obj, m) : self.template(m.data, {
  417. obj: obj,
  418. m: m,
  419. tab: a
  420. })
  421. }).join("\n"),
  422. content: a[field.childrenpath] ? a[field.childrenpath].map(rega).join("\n") : a.data
  423. })
  424. }
  425. function kmap(a, pa) {
  426. var s = _.map(a, function(val, key) {
  427. return self.template(field.data ? (field.data_before + field.data + field.data_after) :
  428. '<div id="{{key}}" data-froma="{{val.froma}}">{{selfa}}{{mods}}{{content}}</div>', {
  429. key: key,
  430. val: val,
  431. mods: (val.modules || []).map(function(m) {
  432. console.log("MMMM", m)
  433. return types[m.type] ? types[m.type](obj, m) : self.template(m.data, {
  434. obj: obj,
  435. m: m,
  436. tab: val
  437. })
  438. }).join("\n"),
  439. selfa: val.data ? self.template(val.data, obj) : "",
  440. content: (val[field.childrenpath] || []).map(rega).join("\n") + (val.content || []).map(rega).join("\n")
  441. });
  442. }).join("\n");
  443. return s;
  444. }
  445. var yy = types.get_renders(obj, field);
  446. var ssa = "";
  447. if (field.debug) {
  448. var cont = JSON.stringify(yy, true, 2)
  449. ssa = '<div style="width: 100%; float: left;">' + '<textarea cols="80" rows="80" style="width: 600px; font-size: 8px;">' + kmap(yy, []) +
  450. '</textarea>' + '<hr><textarea cols="80" rows="80" style="width: 600px; font-size: 8px;">' + cont +
  451. '</textarea></div>'
  452. }
  453. return self.template(kmap(yy, []).replace("%%CONTENT%%", field.content), obj) + ssa
  454. console.log("YYYYYYYYYYYYYYY", yy);
  455. return JSON.stringify(yy, true, 2);
  456. /*
  457. var layouts = [];
  458. var x = obj.getStuff3("_data.layouts", function(a) {
  459. return a
  460. }, "_data.layouts").map(function(a) {
  461. layouts = layouts.concat(a.data);
  462. return a;
  463. });
  464. console.log(layouts, x)
  465. function rec_go(arr, prop, path, func, level_) {
  466. var level = level_ || 0;
  467. return _.map((arr || []), function(a, i) {
  468. if (a[prop] && _.isArray(a[prop])) {
  469. return func(a, path.concat(a.name).join("."), rec_go(a[prop], prop, path.length === 0 && !a.name ? path : path.concat(a.name), func, level + 1));
  470. } else {
  471. return func(a, path.concat(a.name).join("."))
  472. }
  473. }).join("\n");
  474. }
  475. var s = "";
  476. var cont = "";
  477. var obja = {};
  478. var ps = {};
  479. var alle = [];
  480. x.reverse();
  481. var ind = 0;
  482. while (x.length) {
  483. var t = x.shift();
  484. console.log("TTTTTTTTTT_", t.data, t);
  485. if (ind === 0) {
  486. //first
  487. t.data.map(function(ta) {
  488. obja[ta.name] = {
  489. data: ta.data,
  490. name: ta.name,
  491. modules: ta.modules
  492. }
  493. })
  494. } else {
  495. t.data.map(function(ta) {
  496. if (obja[ta.name]) {
  497. obja[ta.name].layouts = obja[ta.name].layouts || []
  498. obja[ta.name].layouts.push(ta);
  499. } else {
  500. //obja[ta.name] = ta
  501. console.log("NAAAAAAA", ta.name);
  502. }
  503. })
  504. }
  505. ind++
  506. //
  507. var nn = t.name.split("/").pop();
  508. rec_go([{
  509. layouts: t.data
  510. }], "layouts", [], function(taba, path, content) {
  511. var ta = _.omit(taba, ["layouts"]);
  512. ta.path = path;
  513. ta.from = t.name + "/." + t.from
  514. alle.push(ta)
  515. })
  516. }
  517. cont = JSON.stringify(obja, true, 2)
  518. function kmap(a, pa) {
  519. return _.map(a, function(val, key) {
  520. return _.repeat(" ", pa.length) + '<div class="' + pa.concat(key).join("-") + (pa.length > 0 ? ' ' + key : '') + '" >\n' + _.repeat(" ", pa.length) + (
  521. typeof(val) === "object" ? kmap(val, pa.concat(key)) : (["content", "data"].indexOf(key) > -1 ? self.template(val, obj) : val)) + '\n' + _.repeat(
  522. " ", pa.length) +
  523. '</div>'
  524. }).join("\n");
  525. }
  526. var ssa = '<div style="width: 100%; float: left;">' + '<textarea cols="80" rows="80" style="width: 600px; font-size: 8px;">' + kmap(obja, []) +
  527. '</textarea>' + '<hr><textarea cols="80" rows="80" style="width: 600px; font-size: 8px;">' + cont +
  528. '</textarea></div>'
  529. return self.template(kmap(obja, []).replace("%%CONTENT%%", field.content), obj) + ssa
  530. return s;
  531. return rec_go(layouts, "layouts", "layouts", function(tab, path, content) {
  532. return tab.title + " " + path;
  533. })
  534. return layouts.map(function(a) {
  535. return a.name === obj.path ? types.renderlayout_t(self.oget(a.name), {}) : types.renderlayout_t(self.oget(a.name), {});
  536. }).join("\n");
  537. */
  538. }
  539. types.renderlayout22 = function(obj, field) {
  540. var layouts = [];
  541. var x = obj.getStuff3("_data.layouts", function(a) {
  542. return a
  543. }, "_data.layouts").map(function(a) {
  544. layouts = layouts.concat(a.data);
  545. return a;
  546. });
  547. console.log(layouts, x)
  548. function rec_go(arr, prop, path, func, level_) {
  549. var level = level_ || 0;
  550. return _.map((arr || []), function(a, i) {
  551. if (a[prop] && _.isArray(a[prop])) {
  552. return func(a, path + "." + a.name, rec_go(a[prop], prop, path + "." + a.name, func, level + 1));
  553. } else {
  554. return func(a, path + "." + a.name)
  555. }
  556. }).join("\n");
  557. }
  558. var s = "";
  559. var cont = "";
  560. var obja = {};
  561. while (x.length) {
  562. var t = x.pop();
  563. console.log("T", t.name);
  564. t.data.map(function(tab) {
  565. if (tab.target) {} else {
  566. console.log("mmmmmmmm ", tab.name, tab);
  567. obja[tab.name] = {
  568. "data": tab.data,
  569. "modules": tab.modules
  570. };
  571. rec_go(tab.layouts, "layouts", tab.name, function(taba, path, content) {
  572. if (taba.target && !obja[taba.target]) {
  573. // console.log("TTTTT ", path, taba);
  574. } else {
  575. // console.log(":::::::::::", path, taba);
  576. opath.set(obja, path + ".data", taba.data);
  577. opath.set(obja, path + ".modules", taba.modules);
  578. }
  579. })
  580. // obja[tab.name] = tab;
  581. }
  582. })
  583. t.data.map(function(tab) {
  584. rec_go(tab.layouts, "layouts", tab.name, function(taba, path, content) {
  585. if (taba.target) {
  586. opath.set(obja, taba.target + "." + tab.name + ".data", tab.data);
  587. opath.set(obja, taba.target + "." + tab.name + ".modules", tab.modules);
  588. }
  589. })
  590. })
  591. t.data.map(function(tab) {
  592. if (tab.target) {
  593. opath.set(obja, tab.target + "." + tab.name + ".data", tab.data);
  594. opath.set(obja, tab.target + "." + tab.name + ".modules", tab.modules);
  595. rec_go(tab.layouts, "layouts", tab.name, function(taba, path, content) {
  596. if (taba.target) {
  597. console.log("TTTTT ", path, taba);
  598. } else {
  599. opath.set(obja, tab.target + "." + path + ".data", taba.data);
  600. opath.set(obja, tab.target + "." + path + ".modules", taba.modules);
  601. console.log(":::::::::::", tab.target + "." + path, taba);
  602. }
  603. })
  604. }
  605. })
  606. /*t.data.map(function(tab){
  607. if(obja[tab.name]){
  608. }else{
  609. if(tab.target){
  610. obja[tab.target] = obja[tab.target] || [];
  611. obja[tab.target].push(tab);
  612. }else{
  613. obja[tab.name]=[tab]
  614. }
  615. }
  616. })*/
  617. }
  618. /*
  619. løb over 2-3 gange ...obja[name] = [] ..push.
  620. */
  621. cont = '<pre>' + JSON.stringify(obja, true, 2) + '</pre>'
  622. function kmap(a, pa) {
  623. return _.map(a, function(val, key) {
  624. return _.repeat(" ", pa.length) + '<div class="' + pa.concat(key).join("-") + (pa.length > 0 ? ' ' + key : '') + '" >\n' + _.repeat(" ", pa.length) + (
  625. typeof(val) === "object" ? kmap(val, pa.concat(key)) : (key === "content" ? self.template(val, obj) : val)) + '\n' + _.repeat(" ", pa.length) +
  626. '</div>'
  627. }).join("\n");
  628. }
  629. return self.template(kmap(obja, []).replace("%%CONTENT%%", field.content), obj) + ' ' + '<textarea cols="80" rows="120" style="width: 600px;">' + kmap(obja, []) +
  630. '</textarea>'
  631. return s;
  632. return rec_go(layouts, "layouts", "layouts", function(tab, path, content) {
  633. return tab.title + " " + path;
  634. })
  635. return layouts.map(function(a) {
  636. return a.name === obj.path ? types.renderlayout_t(self.oget(a.name), {}) : types.renderlayout_t(self.oget(a.name), {});
  637. }).join("\n");
  638. }
  639. types.renderlayout_t = function(obj, field) {
  640. var ta1 =
  641. `<li data-id="{{path}}" data-prop="{{childrenpath}}">
  642. <div class="tool">
  643. <div class="title">{{tab.name}} {{tab.id}} {{tab.title}} {{tab.title}}</div>
  644. </div>
  645. <div class="edi">
  646. </div>
  647. <ol class="moda" data-id="{{path}}.modules">
  648. {{mods}}
  649. </ol>
  650. <ol class="tubu" data-id="{{path}}.{{childrenpath}}">
  651. {{content}}
  652. </ol>
  653. </li>`;
  654. var ta2 =
  655. `<li data-id="{{path}}.modules.{{index}}">
  656. <div class="title">{{mod.title}}</div>
  657. <div>
  658. {{datas}}
  659. </div>
  660. </li>`;
  661. var ta3 =
  662. `<div class="t_{{obj.name}} {{field.unc}}">
  663. <ol class="tibi" data-id="{{obj.path}}/.{{fieldpath}}">
  664. {{basecontent}}
  665. </ol>
  666. </div>`;
  667. function rec_go(arr, prop, path, func, level_) {
  668. var level = level_ || 0;
  669. return _.map((arr || []), function(a, i) {
  670. if (a[prop] && _.isArray(a[prop])) {
  671. return func(a, path + "." + i, rec_go(a[prop], prop, path + "." + i + "." + prop, func, level + 1));
  672. } else {
  673. return func(a, path + "." + i)
  674. }
  675. }).join("\n");
  676. }
  677. field.childrenpath = "layouts";
  678. field.path = "_data.layouts";
  679. return self.template(ta3, {
  680. obj: obj,
  681. childrenpath: field.childrenpath,
  682. fieldpath: field.path,
  683. field: field,
  684. basecontent: rec_go(opath.get(obj, field.path), field.childrenpath, obj.path + "/." + field.path, function(tab, path, content) {
  685. return self.template(ta1, {
  686. tab: tab,
  687. path: path,
  688. childrenpath: field.childrenpath,
  689. mods: _.map((tab.modules || []), function(m, mi) {
  690. return self.template(ta2, {
  691. tab: tab,
  692. path: path,
  693. mod: m,
  694. datas: types[m.type] ? types[m.type](obj, m) : "na",
  695. index: mi
  696. })
  697. }).join("\n"),
  698. content: content
  699. })
  700. })
  701. });
  702. }
  703. types.layouteditor = function(obj, field) {
  704. var layouts = obj.getStuff3("_data.layouts", function(a) {
  705. return a
  706. }, "_data.layouts");
  707. var s = "";
  708. /*if (!obj._data.layouts || obj._data.layouts.length === 0) {
  709. s += types.elementseditor(obj, {
  710. "path": "_data.layouts",
  711. "childrenpath": "layouts",
  712. "show": {
  713. "title": false,
  714. "name": true
  715. }
  716. });
  717. }*/
  718. s += types.elementseditor(obj, {
  719. "path": "_data.layouts",
  720. "childrenpath": "layouts",
  721. "show": {
  722. "title": false,
  723. "name": true
  724. }
  725. });
  726. // var selfi = layouts.shift();
  727. var yy = {}
  728. while (layouts.length) {
  729. var ta = layouts.pop();
  730. ta.data.map(function(tta) {
  731. var t = _.clone(tta);
  732. t.froma = ta.name;
  733. if (t.method) {
  734. if (t.method == "replace") {
  735. if (yy[t.name]) {
  736. var tt = yy[t.name].froma;
  737. yy[t.name] = t;
  738. yy[t.name].froma_replaced = tt;
  739. } else {
  740. yy[t.name] = t;
  741. }
  742. }
  743. } else {
  744. yy[t.name] = t;
  745. }
  746. console.log("TTT", t);
  747. })
  748. }
  749. console.log("YYYYYYYYYYYYYYY", yy);
  750. return s;
  751. if (layouts.length === 0) {
  752. return 'no layout'
  753. }
  754. var alltabs = [];
  755. var sil = layouts.shift();
  756. layouts.map(function(a) {
  757. alltabs = alltabs.concat(a.data)
  758. })
  759. s += sil.data.map(function(t) {
  760. return '<h6>' + t.name + '</h6>' + JSON.stringify(t);
  761. }).join("\n")
  762. s += alltabs.map(function(t) {
  763. return '<h3>' + t.name + '</h3>' + JSON.stringify(t);
  764. }).join("\n")
  765. return s;
  766. if (layouts.length > 1) {
  767. /* s += layouts.map(function(a) {
  768. return a.name === obj.path ? "FFF" : types.layouteditor_tree(self.oget(a.name), {}, obj);
  769. }).join("\n");
  770. */
  771. //s += types.layouteditor_tree(self.oget(layouts[layouts.length - 1].name), {}, obj)
  772. /* types.elementseditor(obj, {
  773. "path": "_data.layouts",
  774. "childrenpath": "layouts",
  775. "find": tab.name,
  776. "dataname": tab.name
  777. }
  778. */
  779. } else {
  780. s += layouts.map(function(a) {
  781. return a.name === obj.path ? types.elementseditor(obj, {
  782. "path": "_data.layouts",
  783. "childrenpath": "layouts",
  784. "show": {
  785. "title": false,
  786. "name": true
  787. }
  788. }) : types.layouteditor_tree(self.oget(a.name), {}, obj);
  789. }).join("\n");
  790. }
  791. return s;
  792. }
  793. types.layouteditor_tree = function(obj, field, obj2) {
  794. var ta1 =
  795. `<li data-id="{{path}}" data-prop="{{childrenpath}}">
  796. <div class="tool">
  797. ddd {{tab.id}} {{tab.name}} {{tab.title}}
  798. </div>
  799. {{mods}}
  800. <ol class="tubu" data-id="{{path}}.{{childrenpath}}">
  801. {{content}}
  802. </ol>
  803. <div>{{obj2thing}}</div>
  804. </li>`;
  805. var ta2 =
  806. `<li data-id="{{path}}.modules.{{index}}">
  807. <div class="tool">
  808. <div class="title">{{mod.type}} {{mod.name}} {{mod.title}}</div>
  809. </div>
  810. <div class="modcon"></div>
  811. </li>`;
  812. var ta3 =
  813. `<div >
  814. <ol class="tibi" data-id="{{obj.path}}/.{{fieldpath}}">
  815. {{basecontent}}
  816. </ol>
  817. </div>`;
  818. function rec_go(arr, prop, path, func, level_) {
  819. var level = level_ || 0;
  820. return _.map((arr || []), function(a, i) {
  821. if (a[prop] && _.isArray(a[prop])) {
  822. return func(a, path + "." + i, rec_go(a[prop], prop, path + "." + i + "." + prop, func, level + 1));
  823. } else {
  824. return func(a, path + "." + i)
  825. }
  826. }).join("\n");
  827. }
  828. field.childrenpath = "layouts";
  829. field.path = "_data.layouts";
  830. return self.template(ta3, {
  831. obj: obj,
  832. childrenpath: field.childrenpath,
  833. fieldpath: field.path,
  834. basecontent: rec_go(opath.get(obj, field.path), field.childrenpath, obj.path + "/." + field.path, function(tab, path, content) {
  835. return self.template(ta1, {
  836. obj2thing: types.elementseditor(obj2, {
  837. "path": "_data.layouts",
  838. "childrenpath": "layouts",
  839. "find": tab.name,
  840. "dataname": tab.name
  841. }),
  842. tab: tab,
  843. path: path,
  844. typeselect: '<select data-id="' + path + '.type" class="changetype" >' + _.keys(types).filter(function(name) {
  845. return name.indexOf("element_") > -1
  846. }).map(function(name) {
  847. return '<option value="' + name + '" ' + (name === tab.type ? 'selected' : '') + '>' + name + '</option>'
  848. }).join("\n") + '</select>',
  849. childrenpath: field.childrenpath,
  850. alinee: types.alineedit(obj, {
  851. path: path.split("/.").pop(),
  852. excludekeys: [field.childrenpath]
  853. }),
  854. mods: _.map((tab.modules || []), function(m, mi) {
  855. return self.template(ta2, {
  856. tab: tab,
  857. path: path,
  858. mod: m,
  859. typeselect: '<select data-id="' + path + '.modules.' + mi + '.type" class="changetype" >' + _.keys(types).filter(
  860. function(
  861. name) {
  862. return name.indexOf("element_") > -1
  863. }).map(function(name) {
  864. return '<option value="' + name + '" ' + (name === m.type ? 'selected' : '') + '>' + name + '</option>'
  865. }).join("\n") + '</select>',
  866. index: mi
  867. })
  868. }).join("\n"),
  869. content: content
  870. })
  871. })
  872. });
  873. }
  874. types.layouteditor_editor = function(obj, field) {
  875. var ta1 =
  876. `<li data-id="{{path}}" data-prop="{{childrenpath}}">
  877. <div class="tool">
  878. <span class="expand"> </span>
  879. <span class="hh"> </span>
  880. <button tab-index="-1" data-id="{{path}}.{{childrenpath}}" class="addelement">Add</button>
  881. <button tab-index="-1" data-id="{{path}}" class="deletetab">Delete</button>
  882. <button tab-index=-1 data-id="{{path}}.modules" class="addmodules" title="Add module">M</button>
  883. <input class="mini propeditor" rerender=true data-id="{{path}}.name" value="{{tab.name}}" >
  884. <input class="mini propeditor" rerender=true data-id="{{path}}.target" value="{{tab.target}}" >
  885. </div>
  886. <div class="edi">
  887. {{alinee}}
  888. </div>
  889. <ol class="moda" data-id="{{path}}.modules">
  890. {{mods}}
  891. </ol>
  892. <ol class="tubu" data-id="{{path}}.{{childrenpath}}">
  893. {{content}}
  894. </ol>
  895. </li>`;
  896. var ta2 =
  897. `<li data-id="{{path}}.modules.{{index}}">
  898. <div class="tool">
  899. <span class="expand"> </span>
  900. <span class="hh"> </span>
  901. {{xtypeselect}}
  902. <span class="deletemod">Delete</span>
  903. <div class="title">{{mod.type}}</div>
  904. </div>
  905. <div class="modcon"></div>
  906. </li>`;
  907. var ta3 =
  908. `<div id="nested">
  909. <ol class="tibi" data-id="{{obj.path}}/.{{fieldpath}}">
  910. {{basecontent}}
  911. </ol>
  912. <button data-id="{{obj.path}}/.{{fieldpath}}" class="addelement">Add child</button>
  913. </div>`;
  914. function rec_go(arr, prop, path, func, level_) {
  915. var level = level_ || 0;
  916. return _.map((arr || []), function(a, i) {
  917. if (a[prop] && _.isArray(a[prop])) {
  918. return func(a, path + "." + i, rec_go(a[prop], prop, path + "." + i + "." + prop, func, level + 1));
  919. } else {
  920. return func(a, path + "." + i)
  921. }
  922. }).join("\n");
  923. }
  924. field.childrenpath = "layouts";
  925. field.path = "_data.layouts";
  926. return self.template(ta3, {
  927. obj: obj,
  928. childrenpath: field.childrenpath,
  929. fieldpath: field.path,
  930. basecontent: rec_go(opath.get(obj, field.path), field.childrenpath, obj.path + "/." + field.path, function(tab, path, content) {
  931. return self.template(ta1, {
  932. tab: tab,
  933. path: path,
  934. typeselect: '<select data-id="' + path + '.type" class="changetype" >' + _.keys(types).filter(function(name) {
  935. return name.indexOf("element_") > -1
  936. }).map(function(name) {
  937. return '<option value="' + name + '" ' + (name === tab.type ? 'selected' : '') + '>' + name + '</option>'
  938. }).join("\n") + '</select>',
  939. childrenpath: field.childrenpath,
  940. alinee: types.layouttabedit(obj, {
  941. path: path.split("/.").pop()
  942. }),
  943. mods: _.map((tab.modules || []), function(m, mi) {
  944. return self.template(ta2, {
  945. tab: tab,
  946. path: path,
  947. mod: m,
  948. typeselect: '<select data-id="' + path + '.modules.' + mi + '.type" class="changetype" >' + _.keys(types).filter(
  949. function(
  950. name) {
  951. return name.indexOf("element_") > -1
  952. }).map(function(name) {
  953. return '<option value="' + name + '" ' + (name === m.type ? 'selected' : '') + '>' + name + '</option>'
  954. }).join("\n") + '</select>',
  955. index: mi
  956. })
  957. }).join("\n"),
  958. content: content
  959. })
  960. })
  961. });
  962. }
  963. types.breakpoint_editor = function(obj, field) {
  964. // console.log(Object.assign({field: field}, obj ))
  965. return '<input type="text" value="">'
  966. }
  967. types.element_ = function(obj, field) {
  968. // console.log(Object.assign({field: field}, obj ))
  969. return self.template(field.data, Object.assign({
  970. field: field
  971. }, obj));
  972. }
  973. types.element_rows = function() {
  974. return self.template(field.data, obj);
  975. }
  976. types.element_cols = function() {
  977. return self.template(field.data, {
  978. obj: obj,
  979. field: field
  980. });
  981. }
  982. types.element_link = function() {
  983. return self.template(field.data, {
  984. obj: obj,
  985. field: field
  986. });
  987. }
  988. types.element_image = function() {
  989. return self.template(field.data, {
  990. obj: obj,
  991. field: field
  992. });
  993. }
  994. types.thismodules = function(obj, field) {
  995. var s = ""
  996. s += '<pre>' + _.map(obj._metas.modules, function(mod) {
  997. return mod.type + " : " + mod.title;
  998. }).join("\n") + '</pre>';
  999. s += "<textarea class=dataeditor data-id=\"" + obj.path + "/._metas.modules\">" + self.jsonstringify(obj._metas.modules, true, 2) +
  1000. '</textarea>'
  1001. return s;
  1002. }
  1003. types.status = function(obj, field) {
  1004. var aa = []
  1005. _.keys(self.oo).filter(aa => ["trash", ""].indexOf(aa) === -1 && typeof(self.oo[aa]) === "function").map(function(key) {
  1006. aa = [].concat.apply(aa, allchildren(self.oo[key]()).filter(function(a) {
  1007. return a._isdirty
  1008. }))
  1009. })
  1010. var s = ""
  1011. s += '<h3>Dirty pages</h3><table><thead><tr><th>Obj</th><th> </th></tr></thead><tbody>' + aa.map(function(a) {
  1012. return self.template('<tr><td><a href="#{{path}}" class="elecontent" elepath="{{path}}">{{path}}</a></td><td></td></tr>', a)
  1013. }).join("\n") + '</tbody></table><hr><button onclick="siten.saveZip().then((zzs) => zzs.map((zz) => saveAs(zz.blob, zz.filename)))" class="bnt">Save...</button>';
  1014. return s
  1015. }
  1016. types.tree = function(obj, field) {
  1017. return '<pre>' + self.allchildren(field.from ? field.from : undefined).map(function(a) {
  1018. return _.repeat(" ", a.path.split("/").length) + '<a href="#" elepath="' + a.path + '" class="elecontent ' + (a.path === obj.path ? 'active' : '') +
  1019. '">' + a.name + '</a>'
  1020. }).join("\n") + '</pre>';
  1021. }
  1022. types.source = function(obj, field) {
  1023. var s = "";
  1024. s += '<textarea id="sourcen">' + self.jsonstringify(obj.innerExport(""), true, 2) + '</textarea>';
  1025. s += '<hr>'
  1026. return s
  1027. }
  1028. types.sourcefull = function(obj, field) {
  1029. var s = "";
  1030. s += '<textarea id="sourcen">' + self.jsonstringify(obj.exportSync(""), true, 2) + '</textarea>';
  1031. s += '<hr>'
  1032. return s
  1033. }
  1034. types.sourcefulla = function(obj, field) {
  1035. var s = "";
  1036. s += '<div class="status">Edit</div><hr><textarea id="sourcefulla" data-id="' + obj.path + '">' + self.jsonstringify(obj.exportSync(""), true, 2) + '</textarea>';
  1037. s += '<hr>'
  1038. s +=
  1039. '<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="' +
  1040. obj.path +
  1041. '" data-action="browser_handlefilen" data-emit="filesloaded" /></div> '
  1042. if (!obj._metas.undeletable) {
  1043. s += '<li style="float: right;"><button class="zapele" data-id="' + obj.path +
  1044. '">Delete Permanently</button></li>'
  1045. }
  1046. return s
  1047. }
  1048. types.export = function(obj, field) {
  1049. var s = "";
  1050. s += '<h3>' + obj.path + '</h3>';
  1051. s += '<button onclick="saveAs(new Blob([siten.jsonstringify(siten.oget(\'' + obj.path + '\').exportSync(), true, 2)],{\'type\':\'application/json\'}),\'' + obj.path +
  1052. '.json\')">Save as</button>'
  1053. s += '<hr><button onclick="$(\'#exporta\').val(siten.jsonstringify(siten.oget(\'' + obj.path +
  1054. '\').exportSync(), true, 2))">Export Standard</button><button onclick="$(\'#exporta\').val(siten.jsonstringify(siten.oget(\'' + obj.path +
  1055. '\').exportFlatSync(), true, 2))">Export flat</button>' +
  1056. " Export size: " + ((self.jsonstringify(obj.exportSync("")).length / (1024 * 1024)).toFixed(2) + "mb");
  1057. s += '<textarea id="exporta">' + '</textarea>';
  1058. s += '<hr>'
  1059. return s
  1060. }
  1061. types.globalexport = function(obj, field, run) {
  1062. if (run) {
  1063. var s = "";
  1064. s += '<table><thead><tr><th>Path</th><th>Bytes</th></tr></thead><tbody>' + _.filter(self.oo, function(a) {
  1065. return typeof(a) === "function"
  1066. }).map(function(a) {
  1067. return a()
  1068. }).map(function(a) {
  1069. return '<tr><td>' + a.path + '</td><td>' + ((self.jsonstringify(a.exportSync("")).length / (1))) +
  1070. '</td><td><button onclick="saveAs(new Blob([siten.jsonstringify(siten.oget(\'' + a.path +
  1071. '\').exportSync(), true, 2)],{\'type\':\'application/json\'}),\'' + a.path + '.json\')">Save as</button></td></tr>'
  1072. }).join("\n") + '</tbody></table>';
  1073. s += '<textarea id="exportx">' + '</textarea>';
  1074. return s
  1075. } else {
  1076. var s = "";
  1077. s += '<button onclick="$(\'#exportstats\').html(siten.otypes.globalexport({},1))">Calculate</button>';
  1078. s += '<div id="exportstats">' + '</div>';
  1079. return s;
  1080. }
  1081. }
  1082. types.clone = function(obj, field) {
  1083. return "<div class=\"status\"></div> <input type=\"text\" class=cloneeditor data-id=\"" + obj.path + "\" value=\"" + '"> '
  1084. }
  1085. types.delete = function(obj, field) {
  1086. return '<li> <button class="deleteele" data-id="' + obj.path + '">Trash</button> <button class="zapele" data-id="' + obj.path +
  1087. '">Delete Permanently</button></li>'
  1088. }
  1089. types.keyseditor = function(obj, field) {
  1090. }
  1091. types.allprops = function(obj, field) {
  1092. var stash = [];
  1093. var prot = {}
  1094. var meta = {}
  1095. self.allchildren().map(function(c) {
  1096. var arr = opath.flatten(c._data, "");
  1097. arr.map(function(a) {
  1098. prot[a[0]] = prot[a[0]] || {}
  1099. prot[a[0]][a[1]] = prot[a[0]][a[1]] || 0
  1100. prot[a[0]][a[1]] += 1;
  1101. })
  1102. var arr = opath.flatten(c._metas, "");
  1103. arr.map(function(a) {
  1104. if (a[0].indexOf('_wp_attachment_backup_sizes') > -1) {
  1105. return;
  1106. }
  1107. meta[a[0]] = meta[a[0]] || {}
  1108. meta[a[0]][a[1]] = meta[a[0]][a[1]] || 0
  1109. meta[a[0]][a[1]] += 1;
  1110. })
  1111. });
  1112. var prota = _.map(prot, function(vala, nama) {
  1113. return nama + " : " + _.size(vala)
  1114. });
  1115. var metas = _.map(meta, function(vala, nama) {
  1116. return nama + " : " + _.size(vala)
  1117. });
  1118. stash.push(["Data Properties", '<pre>' + JSON.stringify(prota, true, 2) + '</pre>'])
  1119. stash.push(["Meta Properties", '<pre>' + JSON.stringify(metas, true, 2) + '</pre>'])
  1120. var ss = ('<div class="stash">' + stash.map(function(a) {
  1121. return '<div class="stt"><div class="st1">' + (a[0] === false ? "" : a[0] + "") + '</div><div class="st2">' + a[1] + '</div></div>'
  1122. }).join("\n") + '</div>');
  1123. return ss
  1124. }
  1125. types.jsfuncs = function(obj, field) {
  1126. var qq = [];
  1127. _.map(_.omit(obj, ignores), function(val, prop) {
  1128. if (typeof(val) === "function") {
  1129. qq.push(["JS " + prop + '<li><button class="deletefunc" data-id="' + obj.path + "/." + prop + '">Delete</button></li>',
  1130. "<div class=\"status\"></div> <textarea class=jseditor data-id=\"" + obj.path + "/." + prop + "\">" + (obj[prop] + "") +
  1131. '</textarea> '
  1132. ]);
  1133. }
  1134. })
  1135. qq.push(["JS ", "<input class=\"createfunc\" data-id=\"" + obj.path + "\"> "]);
  1136. var ss = ('<div class="sas">' + qq.map(function(a) {
  1137. return '<div class="sa"><div class="inn"><div class="saa">' + (a[0] === false ? "" : a[0] + "") + '</div><div class="sab">' + a[1] +
  1138. '</div></div></div>'
  1139. }).join("\n") + '</div>');
  1140. return ss
  1141. }
  1142. types.relations = function(obj, field) {
  1143. var s = "";
  1144. var ss = []
  1145. _.map(obj._relations, function(rels, relname) {
  1146. var relators = _.keys(rels);
  1147. var sss = relators.slice(0, 25).map(function(relator) {
  1148. return '<li elepath="' + relator + '"><a href="#' + relator + '" class="elecontent" title="' + JSON.stringify(rels[relator].context).toHtmlEntities() +
  1149. '">' + relator + '</a> <button class="btn unrelate" data-id="' + obj
  1150. .path + '" data-rel="' + relname + '" data-rela="' + relator + '" >X</button></li> '
  1151. }).join("\n");;
  1152. ss.push([relname + "(" + relators.length + ")", sss]);
  1153. });
  1154. s += ss.map(function(a) {
  1155. return '<div><h3>' + a[0] + '</h3><div>' + a[1] + '</div></div>'
  1156. }).join("\n")
  1157. return s;
  1158. }
  1159. types.relationsadd = function(obj, field) {
  1160. var s = "";
  1161. s += '<li class="relationseditor" data-id="' + obj.path +
  1162. '"><input class="relout" type="text" placeholder="is what " /><em><select class=uniq_relnames target=".relout"></select>' +
  1163. '</em><hr> to: <input class="relaeditor" placeholder="find obj"><hr> as: <input type="text" class=relin data-id="' +
  1164. obj.path +
  1165. '" placeholder="as what " /> <select class=uniq_relnames target=".relin"></select><hr> with: <input class="what" type="text" > <button class="relateasto">Relate</button></li>';
  1166. return s;
  1167. }
  1168. types.templatepaths = function(obj, field) {
  1169. return "<div class=\"status\"></div>" + _.map(self.getRenderTemplate(obj), function(a) {
  1170. return '<li elepath="' + a.name + '" ><a href="#' + a.name + '" class="elecontent" title="' + a.from + ": " + a.data.toHtmlEntities() + '" > ' +
  1171. a.name +
  1172. '</a></li>'
  1173. }).join("\n");
  1174. }
  1175. types.visa = function(obj, fielda) {
  1176. var field = Object.assign({
  1177. "show": {},
  1178. "cap": 1000
  1179. }, fielda)
  1180. setTimeout(function() {
  1181. var statusa = document.getElementById('visastatus');
  1182. var colas = {
  1183. parent: "#000000",
  1184. child: "#ff00ff",
  1185. extends: "#00ff00",
  1186. inherits: "#ff0000",
  1187. isa: "#ff9900",
  1188. hasa: "#00ff99"
  1189. }
  1190. function lokup(tp) {
  1191. return colas[tp];
  1192. }
  1193. var graph = Viva.Graph.graph();
  1194. var graphics = Viva.Graph.View.svgGraphics(),
  1195. nodeSize = 10;
  1196. var oba = obj; // obj.parents[_.keys(obj.parents).shift()] || obj;
  1197. var alle = allchildren(oba).filter(function(c) {
  1198. return true //c.path.indexOf("trash/") === -1 && c.path.indexOf("folders/") === -1 && c.path.indexOf("blobs/") === -1
  1199. });
  1200. /* alle.slice(0,2).map(addobj);
  1201. setTimeout(function(){
  1202. alle.slice(2,20).map(addobj);
  1203. },2000)
  1204. */
  1205. /*
  1206. if(alle.length>0){
  1207. stepa();
  1208. }
  1209. */
  1210. var cols = [];
  1211. alle.map(addobj);
  1212. if (obj.parents[_.keys(obj.parents).shift()]) {
  1213. addobj2(obj.parents[_.keys(obj.parents).shift()]);
  1214. cols.unshift([obj.path, _.keys(obj.parents).shift(), "child of"])
  1215. }
  1216. var colsori = cols.length;
  1217. if (cols.length > field.cap) {
  1218. cols = cols.slice(0, field.cap);
  1219. // cols = cols.filter(function(a){return a[2] !== "isa" })
  1220. // cols = cols.filter(function(a){return a[2] !== "child" })
  1221. // cols = cols.filter(function(a){return a[2] !== "hasa" })
  1222. }
  1223. function stepa() {
  1224. statusa.innerHTML = ' ' + alle.length + " : " + colsori + " " + field.cap + " " + cols.length;
  1225. var i = 0,
  1226. c;
  1227. while (i < 10 && cols.length > 0) {
  1228. i++
  1229. c = cols.shift();
  1230. graph.addLink(c[0], c[1], c[2])
  1231. }
  1232. if (cols.length > 0) {
  1233. setTimeout(stepa, 100)
  1234. } else {
  1235. statusa.innerHTML = ' ' + alle.length + " : " + colsori + " " + field.cap + " " + cols.length;
  1236. }
  1237. }
  1238. stepa()
  1239. function addobj2(c) {
  1240. // graph.addNode(c.path);
  1241. _.map(c._isa, function(child, name) {
  1242. cols.push([c.path, child.path, 'isa'])
  1243. });
  1244. _.map(c._hasa, function(child, name) {
  1245. cols.push([c.path, child.path, 'hasa'])
  1246. });
  1247. _.map(c._extends, function(child, name) {
  1248. cols.push([c.path, child.path, 'extends'])
  1249. });
  1250. _.map(c._inherits, function(child, name) {
  1251. cols.push([c.path, child.path, 'inherits'])
  1252. });
  1253. _.map(c._relations, function(rels, relname) {
  1254. _.map(rels, function(child, name) {
  1255. cols.push([c.path, name, relname])
  1256. })
  1257. });
  1258. }
  1259. function addobj(c) {
  1260. // graph.addNode(c.path);
  1261. if (field.show.children) {
  1262. _.map(c.children, function(child, name) {
  1263. cols.push([c.path, child().path, 'child'])
  1264. });
  1265. }
  1266. if (field.show.isa) {
  1267. _.map(c._isa, function(child, name) {
  1268. cols.push([c.path, child.path, 'isa'])
  1269. });
  1270. }
  1271. if (field.show.hasa) {
  1272. _.map(c._hasa, function(child, name) {
  1273. cols.push([c.path, child.path, 'hasa'])
  1274. });
  1275. }
  1276. if (field.show.extends) {
  1277. _.map(c._extends, function(child, name) {
  1278. cols.push([c.path, child.path, 'extends'])
  1279. });
  1280. }
  1281. if (field.show.inherits) {
  1282. _.map(c._inherits, function(child, name) {
  1283. cols.push([c.path, child.path, 'inherits'])
  1284. });
  1285. }
  1286. if (field.show.relations) {
  1287. _.map(c._relations, function(rels, relname) {
  1288. _.map(rels, function(child, name) {
  1289. cols.push([c.path, name, relname + " with " + child.context.d])
  1290. })
  1291. });
  1292. }
  1293. }
  1294. var idas = 1;
  1295. var ida = function() {
  1296. return "ida" + (idas++)
  1297. }
  1298. graphics.node(function(node) {
  1299. var ui = Viva.Graph.svg('g');
  1300. var circle = Viva.Graph.svg('circle')
  1301. .attr('cx', 2)
  1302. .attr('cy', 2)
  1303. .attr('r', 2)
  1304. .attr('fill', obj.path === node.id ? "#ff0000" : "#dadada");
  1305. ui.append(circle);
  1306. var svgText = Viva.Graph.svg('text').attr("fill", obj.path === node.id ? "#ff0000" : "#333333").attr('font-size', obj.path === node.id ? "18px" :
  1307. "12px").attr('y', '4px').text(node.id.split("/").slice(-2).join("/"));
  1308. ui.append(svgText);
  1309. return ui;
  1310. }).placeNode(function(nodeUI, pos) {
  1311. nodeUI.attr('transform',
  1312. 'translate(' +
  1313. (pos.x - nodeSize / 2) + ',' + (pos.y - nodeSize / 2) +
  1314. ')');
  1315. });
  1316. var createMarker = function(id) {
  1317. return Viva.Graph.svg('marker')
  1318. .attr('id', id)
  1319. .attr('viewBox', "0 0 10 10")
  1320. .attr('refX', "10")
  1321. .attr('refY', "5")
  1322. .attr('markerUnits', "strokeWidth")
  1323. .attr('markerWidth', "10")
  1324. .attr('markerHeight', "5")
  1325. .attr('orient', "auto");
  1326. },
  1327. marker = createMarker('Triangle');
  1328. marker.append('path').attr('d', 'M 0 0 L 10 5 L 0 10 z');
  1329. // Marker should be defined only once in <defs> child element of root <svg> element:
  1330. var defs = graphics.getSvgRoot().append('defs');
  1331. defs.append(marker);
  1332. var geom = Viva.Graph.geom();
  1333. graphics.link(function(link) {
  1334. // Notice the Triangle marker-end attribe:
  1335. var isParent = (link.data === 'parent');
  1336. var ui = Viva.Graph.svg('g');
  1337. var p = Viva.Graph.svg('path')
  1338. .attr('stroke', lokup(link.data) || "#000000")
  1339. .attr('fill', 'none')
  1340. .attr('marker-end', 'url(#Triangle)')
  1341. .attr('id', ida())
  1342. ui.isParent = isParent; // remember for future.
  1343. ui.linka = link.data;
  1344. ui.ry = 50 //- (Math.random() * 100);
  1345. ui.pp = p;
  1346. var svgText = Viva.Graph.svg('text').attr("dy", -4).attr("class", "slabel");
  1347. var textPath = Viva.Graph.svg("textPath");
  1348. textPath.attr("href", "#" + p.id).attr("startOffset", "25%").text(link.data + " >");
  1349. svgText.append(textPath)
  1350. ui.tt = svgText;
  1351. ////<textPath xlink:href="#'+link.id+'">
  1352. // svgText.attr('xlink', link.id);
  1353. ui.append(svgText)
  1354. ui.append(p);
  1355. return ui;
  1356. }).placeLink(function(linkUI, fromPos, toPos) {
  1357. // using arc command: http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands
  1358. //var data = 'M' + fromPos.x + ',' + fromPos.y +
  1359. // ' A 4,' + linkUI.ry + ',-' + linkUI.ry + ',0,1,' + toPos.x + ',' + toPos.y;
  1360. var data = 'M' + fromPos.x + ',' + fromPos.y +
  1361. ' C ' + (fromPos.x + 50) + ' ' + (fromPos.y + 10) + ',' + (toPos.x - 50) + ' ' + (toPos.y - 10) + ',' + toPos.x + ' ' + toPos.y;
  1362. linkUI.pp.attr("d", data);
  1363. return;
  1364. // linkUI.tt.attr("y", ((fromPos.y + toPos.y) / 2) - linkUI.ry);
  1365. // linkUI.tt.attr("x", ((fromPos.x + toPos.x) / 2) );
  1366. });
  1367. var layout = Viva.Graph.Layout.forceDirected(graph, {
  1368. springLength: 80,
  1369. springCoeff: 0.00001,
  1370. dragCoeff: 0.001,
  1371. gravity: -1.2
  1372. });
  1373. var renderer = Viva.Graph.View.renderer(graph, {
  1374. graphics: graphics,
  1375. container: document.getElementById('visagraf'),
  1376. layout: layout
  1377. });
  1378. renderer.run();
  1379. }, 200);
  1380. return '<div id="visastatus" >xxxx</div><div id="visagraf" class="svga"></div>'
  1381. }
  1382. types.visa.help = "Shows linked visualization of obj";
  1383. types.visa.settings = {
  1384. "cap": {
  1385. default: 500,
  1386. "info": "Max render object"
  1387. },
  1388. "show": {}
  1389. };
  1390. types.meta = function(obj, field) {
  1391. return "<div class=\"status\"></div> <textarea class=dataeditor data-id=\"" + obj.path + "/._metas\">" + self.jsonstringify(obj._metas, true, 2) + '</textarea>'
  1392. }
  1393. types.data = function(obj, field) {
  1394. return "<div class=\"status\"></div> <textarea class=dataeditor data-id=\"" + obj.path + "/._data\">" + self.jsonstringify(obj._data, true, 2) + '</textarea>'
  1395. }
  1396. types.hasas = function(obj, field) {
  1397. return '<div class="hasas">' + _.map(obj._hasa, function(tob, name) {
  1398. return self.template(
  1399. '<li elepath="{{tob.path}}" pelepath="{{obj.path}}" ><a href="#{{name}}" class="elecontent">{{name}}</a> <button class="btn unhasa">X</button></li>', {
  1400. tob: tob,
  1401. obj: obj,
  1402. name: name
  1403. });
  1404. }).join("\n") + '</div>'
  1405. }
  1406. types.isas = function(obj, field) {
  1407. return '<div class="isas">' + _.map(obj._isa, function(tob, name) {
  1408. return self.template(
  1409. '<li elepath="{{tob.path}}" pelepath="{{obj.path}}" ><a href="#{{name}}" class="elecontent">{{name}}</a> <button class="btn unisa">X</button></li>', {
  1410. tob: tob,
  1411. obj: obj,
  1412. name: name
  1413. });
  1414. }).join("\n") + '</div>' + self.template('<input class=isaeditor data-id="{{obj.path}}" placeholder="find isas here.." />', {
  1415. obj: obj
  1416. });
  1417. }
  1418. types.extends = function(obj, field) {
  1419. return '<div class="extends">' + _.map(obj._extends, function(tob, name) {
  1420. return self.template(
  1421. '<li elepath="{{tob.path}}" pelepath="{{obj.path}}" ><a href="#{{name}}" class="elecontent">{{name}}</a> <button class="btn unextend">X</button></li>', {
  1422. tob: tob,
  1423. obj: obj,
  1424. name: name
  1425. });
  1426. }).join("\n") + '</div>' + self.template('<input class=extendeditor data-id="{{obj.path}}" placeholder="find inheritants here.." />', {
  1427. obj: obj
  1428. });
  1429. }
  1430. types.inherits = function(obj, field) {
  1431. return '<div class="inherits">' + _.map(obj._inherits, function(tob, name) {
  1432. return self.template(
  1433. '<li elepath="{{tob.path}}" pelepath="{{obj.path}}" ><a href="#{{name}}" class="elecontent">{{name}}</a> <button class="btn uninherit">X</button></li>', {
  1434. tob: tob,
  1435. obj: obj,
  1436. name: name
  1437. });
  1438. }).join("\n") + '</div>' + self.template('<input class=inheriteditor data-id="{{obj.path}}" placeholder="find extenders here.." />', {
  1439. obj: obj
  1440. });
  1441. }
  1442. types.children = function(obj, field) {
  1443. var s = '';
  1444. s += mmb("Add child", "<input type=\"text\" class=addchildeditor data-id=\"" + obj.path + "\" value=\"" + '"> ');
  1445. s += '<div class="children">' + _.map(obj.children, function(a) {
  1446. return a().path
  1447. }).map(function(k) {
  1448. return '<li elepath="' + k + '" pelepath="' + obj.path + '"><a href="#' + k + '" class="elecontent" > ' + k +
  1449. '</a> '
  1450. }).join("\n") + '</div>'
  1451. return s;
  1452. }
  1453. types.parents = function(obj, field) {
  1454. return self.template('{{parents::}}', obj);
  1455. }
  1456. types.path = function(obj, fiels) {
  1457. return "<input type=\"text\" class=patheditor data-id=\"" + obj.path + "\" value=\"" + obj.path + '">';
  1458. }
  1459. types.info = function(obj, field) {
  1460. return "Path: " + obj.path
  1461. }
  1462. types.upload = function(obj, field) {
  1463. return (
  1464. '<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="' +
  1465. obj.path +
  1466. '" data-action="browser_handlefilen" data-emit="filesloaded" /></div> ');
  1467. }
  1468. types.content = function(obj, field) {
  1469. var content_type = "<div><input type=\"text\" class=propeditor data-id=\"" + obj.path + "/._metas.type\" value=\"" +
  1470. obj._metas.type +
  1471. '">' + "<select class=propselector data-id=\"" + obj.path + "/._metas.type\"></select></div>";
  1472. var s = '';
  1473. s += mmb("Title", types.propeditor(obj, {
  1474. "path": "_data.title"
  1475. }))
  1476. if (obj._metas.type && obj._metas.type == "html") {
  1477. s += mmb("Content", "<div class=\"adj\"><div class=\"status\"></div> <textarea class=mceeditor data-id=\"" + obj.path + "/._data.content\">" + obj._data.content +
  1478. '</textarea></div>')
  1479. } else {
  1480. s += mmb("Body", "<div class=\"adj\"><div class=\"status\"></div> <textarea class=htmleditor data-id=\"" + obj.path + "/._data.content\">" + obj._data.content +
  1481. '</textarea></div>')
  1482. }
  1483. s += mmb("Type", content_type);
  1484. return s;
  1485. }
  1486. types.truefalse = function(obj, field) {
  1487. return ' <input type="checkbox" class="truefalse" data-id="' + obj.path + '/.' + field.path + '" ' + (opath.get(obj, field.path) ? 'checked' : '') + '>'
  1488. }
  1489. types.position = function(obj, field) {
  1490. return ' <input type="text" class="propeditor" data-id="' + obj.path + '/.' + field.path + '" value="' + opath.get(obj, field.path) + '">'
  1491. }
  1492. types.rootzip = function(obj, field, run) {
  1493. if (run == 1) {
  1494. var ns = self.oget("namespace")._data;
  1495. var arr = _.filter(self.oo, function(a, k) {
  1496. return typeof(a) === "function" && k !== "namespace"
  1497. }).map(function(a) {
  1498. return a()
  1499. });
  1500. var s = "";
  1501. var total = 0;
  1502. var totallc = 0;
  1503. s +=
  1504. '<table><thead><tr><th class="path">Path</th><th class="filename">Filename</th><th class="nn">Objs</th><th class="nn">Bytes</th><th class="nn">Avg</th></tr></thead><tbody>' +
  1505. arr.map(function(a) {
  1506. var ll = ((self.jsonstringify(
  1507. a.exportSync("")).length / (1)));
  1508. var lc = (a.exportFlatSync().length);
  1509. total += ll;
  1510. totallc += lc;
  1511. return '<tr> <td class="path">' + a.path + ((ns.linked && ns.linked[a.path + ".link"] ? '*' : '')) + '</td><td class="filename">' + a.path +
  1512. '.json</td><td class="nn">' + lc + '</td><td class="nn">' + ll +
  1513. '</td><td class="nn">' + (ll / lc).toFixed(2) + '</td></tr>'
  1514. }).join("\n")
  1515. s += '<tr> <td> </td><td> </td><td class="nn">' + totallc + '</td><td class="nn">' + total + '</td><td class="nn">' + (total / totallc).toFixed(2) +
  1516. '</td></tr>'
  1517. s += '</tbody></table>';
  1518. s += '<hr>Output</h3>';
  1519. s += '<button onclick="$(\'#rootzipresult\').html(siten.otypes.rootzip({},2))">Calculate zip</button>';
  1520. s += '<div id="rootzipresult"></div>'
  1521. return s;
  1522. } else if (run == 2) {
  1523. self.saveZip().then(function(files) {
  1524. var ss = '<table><thead><tr> <th class="filename">Filename</th> <th class="nn">Size</th> <th class="nn"></th><th class="nn"></th></thead><tbody>' +
  1525. files.map(function(file) {
  1526. return '<tr> <td>' + file.filename + '</td> <td class="nn">' + file.blob.size + '</td> <td class="nn"></td> <td class="nn"></td> </tr>';
  1527. }).join("\n") + '</tbody></table>';
  1528. $("#rootzipresult").html(ss)
  1529. })
  1530. return 'zipping...'
  1531. } else {
  1532. var s = "";
  1533. s += '<button onclick="$(\'#rootzipstats\').html(siten.otypes.rootzip({},1))">Calculate</button>';
  1534. s += '<div id="rootzipstats">' + '</div>';
  1535. return s;
  1536. }
  1537. }
  1538. types.yearmonth = function(obj, field) {
  1539. var s = "";
  1540. s += '<input class="propeditor" data-id="' + obj.path + '/.' + field.path + '" value="' + opath.get(obj, field.path) + '">'
  1541. return s
  1542. }
  1543. types.checkboxes = function(obj, field) {
  1544. return '<h3>' + field.title + '</h3><table>' + _.map(opath.get(obj, field.path), function(val, key) {
  1545. return '<tr><td>' + key + '</td><td>' + types.truefalse(obj, {
  1546. path: field.path + "." + key
  1547. }) + '</td></tr>';
  1548. }).join("\n") + '</table>';
  1549. }
  1550. types.elements = function(obj, field) {
  1551. return '<table>' + _.map(opath.get(obj, field.path), function(val, key) {
  1552. return '<tr><td>' + key + '</td><td>' + types.truefalse(obj, {
  1553. path: field.path + "." + key + ".visible"
  1554. }) + '</td><td>' + types.position(obj, {
  1555. path: field.path + "." + key + ".x"
  1556. }) + '</td><td>' + types.position(obj, {
  1557. path: field.path + "." + key + ".y"
  1558. }) + '</td></tr>';
  1559. }).join("\n") + '</table>';
  1560. }
  1561. types.template = function(obj, field) {
  1562. return "<textarea class=htmleditor data-id=\"" + obj.path + "/._data.template\">" + obj._data.template +
  1563. '</textarea>'
  1564. }
  1565. types.dataeditor = function(obj, field) {
  1566. var s = "";
  1567. s += '<textarea class="dataeditor" data-id="' + obj.path + '/.' + field.path + '">' + self.jsonstringify(opath.get(obj, field.path), true, 2) + '</textarea>'
  1568. return s
  1569. }
  1570. types.dataeditorarray = function(obj, field) {
  1571. var s = "";
  1572. s += '<textarea class="dataeditorarray" data-id="' + obj.path + '/.' + field.path + '">' + (opath.get(obj, field.path) || []).join("\n") + '</textarea>'
  1573. return s
  1574. },
  1575. types.texteditor = function(obj, field) {
  1576. var s = "";
  1577. s += '<textarea class="htmleditor" data-id="' + obj.path + '/.' + field.path + '">' + opath.get(obj, field.path) + '</textarea>'
  1578. return s
  1579. }
  1580. types.namespaceedit = function(obj, field) {
  1581. var s = "";
  1582. s += '<input class="namespaceedit" value="' + self.name + '">'
  1583. return s
  1584. }
  1585. types.propeditor = function(obj, field) {
  1586. var s = "";
  1587. s += '<input class="propeditor" data-id="' + obj.path + '/.' + field.path + '" value="' + opath.get(obj, field.path) + '">'
  1588. return s
  1589. }
  1590. function sort_by_1_col_alpha(a, b) {
  1591. var x = a[0].toLowerCase(),
  1592. y = b[0].toLowerCase();
  1593. return x < y ? -1 : x > y ? 1 : 0;
  1594. }
  1595. function xflatten(obj, pre) {
  1596. var pre = pre || "";
  1597. var r = [];
  1598. for (var i in obj) {
  1599. if (typeof(obj[i]) === "object") {
  1600. r = r.concat(xflatten(obj[i], (pre.length > 0 ? pre + "." : "") + i));
  1601. } else {
  1602. r.push([(pre.length > 0 ? pre + "." : "") + i, obj[i]]);
  1603. }
  1604. }
  1605. r.sort(sort_by_1_col_alpha)
  1606. return r;
  1607. }
  1608. types.advpropeditor = function(obj, field) {
  1609. var sa = "";
  1610. var oa = opath.get(obj, field.path);
  1611. function rrr(oo, key, path) {
  1612. var s = "";
  1613. if (_.isArray(oo)) {
  1614. s += '<ul>' + _.map(oo, function(val, key) {
  1615. return rrr(val, key, path + "." + key);
  1616. }).join("\n") + '</ul>';
  1617. } else if (_.isObject(oo)) {
  1618. s += '<ol>' + _.map(oo, function(val, key) {
  1619. return rrr(val, key, path + "." + key);
  1620. }).join("\n") + '</ol>';
  1621. } else if (_.isBoolean(oo)) {
  1622. s += '<li>' + key + ":" + types.truefalse(obj, {
  1623. path: path
  1624. }) + '</li>';
  1625. } else if (_.isString(oo)) {
  1626. s += '<li>' + key + ":" + '<input type="text" value="' + oo + '"></li>';
  1627. }
  1628. return s;
  1629. }
  1630. // var ss = rrr(oa, "", obj.path + "/." + field.path);
  1631. /* var tt = xflatten(oa, "_metas");
  1632. var ss = tt.map(function(a) {
  1633. var prop = a[0];
  1634. var val = a[1];
  1635. var type = typeof(val);
  1636. if(type==="boolean"){
  1637. return '<li>'+prop+' <input type="checkbox" class="truefalse" data-id="' +obj.path+"/."+prop+ '" ' + (val ? 'checked' : '') + '></li>'
  1638. }
  1639. if(type==="string"){
  1640. return '<li>'+prop+' <input type="text" class="propeditor" data-id="' +obj.path+"/."+prop+ '" value="' + val + '"></li>'
  1641. }
  1642. }).join("\n");
  1643. */
  1644. /*
  1645. _metas.modules = []
  1646. _metas.tabs = []
  1647. _metas.fields = [];
  1648. */
  1649. var ss = "";
  1650. //s += '<input class="propeditor" data-id="' + obj.path + '/.' + field.path + '" value="' + opath.get(obj, field.path) + '">'
  1651. return ss
  1652. }
  1653. types.lookup = function(obj, field) {
  1654. var temps = obj.getStuff3(field.path, function(a) {
  1655. return a
  1656. }, field.path)
  1657. var current_name = "",
  1658. current_data = "";
  1659. if (temps.length > 0) {
  1660. current_name = temps[0].name
  1661. current_data = temps[0].data;
  1662. }
  1663. var s = ''; //' <input type="text" data-id="'+obj.path+'/.'+field.path+'" value="' + opath.get(obj,field.path) + '">'
  1664. var path = opath.get(obj, field.path);
  1665. if (current_name !== "" && !path) {
  1666. path = opath.get(self.oget(current_name), field.path);
  1667. s += ' inherit <a elepath="' + path + '" href="#' + path + '" class="elecontent" > ' + path + '</a>';
  1668. s += ' from ' + '<a elepath="' + current_name + '" href="#' + current_name + '" class="elecontent" > ' + current_name + '</a>'
  1669. } else {
  1670. if (!path) {
  1671. s += 'no object selected'
  1672. } else {
  1673. s += 'Current: <li> <a elepath="' + path + '" href="#' + path + '" class="elecontent" > ' + path + '</a> <button class="btn unset" data-id="' + obj.path +
  1674. '" ele-prop="' + field.path + '">X</button> </li>';
  1675. }
  1676. }
  1677. s += "<br><input class=\"propselector22\" ele-has=\"" + field.has + "\" ele-list=\"" + field.lookup + "\" ele-pick=\"" + field.pick + "\" data-id=\"" + obj.path +
  1678. "\" ele-prop=\"" + field.path + "\" >";
  1679. return s;
  1680. }
  1681. types.lookup2 = function(obj, field) {
  1682. var temps = obj.getStuff3(field.path, function(a) {
  1683. return a
  1684. }, field.path)
  1685. var current_name = "",
  1686. current_data = "";
  1687. if (temps.length > 0) {
  1688. current_name = temps[0].name
  1689. current_data = temps[0].data;
  1690. }
  1691. var s = ''; //' <input type="text" data-id="'+obj.path+'/.'+field.path+'" value="' + opath.get(obj,field.path) + '">'
  1692. s += "<select class=propselector2 data-has=\"" + field.has + "\" data-list=\"" + field.lookup + "\" data-pick=\"" + field.pick + "\" data-id=\"" +
  1693. obj.path + "/." +
  1694. field.path + "\"></select>";
  1695. var path = opath.get(obj, field.path);
  1696. if (current_name !== "" && !path) {
  1697. path = opath.get(self.oget(current_name), field.path);
  1698. s += ' inherit <a elepath="' + path + '" href="#' + path + '" class="elecontent" > ' + path + '</a>';
  1699. s += ' from ' + '<a elepath="' + current_name + '" href="#' + current_name + '" class="elecontent" > ' + current_name + '</a>'
  1700. } else {
  1701. s += '<a elepath="' + path + '" href="#' + path + '" class="elecontent" > ' + path + '</a>';
  1702. }
  1703. return s;
  1704. }
  1705. return types;
  1706. }