function renderWrapped(div, view) { //console.log("renderWrapped()"); //console.log("options.wrapper", options.wrapper); //console.log("message", message); // Nothing to render for groups. Child nodes have already been inserted. // TODO: Maybe do not insert child nodes until expanding? if (message.meta && typeof message.meta["group.start"] !== "undefined" && message.meta["group.start"]) return; options = UTIL.copy(options); if (typeof view != "undefined") options.view = view; if (typeof options.view != "array") options.view = [options.view]; if (typeof message.og != "undefined") { if (typeof template.renderObjectGraphToNode == "undefined") throw new Error("Template module '" + message.template.module + "' from '" + message.template.id + "' does not export 'renderObjectGraphToNode'!"); template.renderObjectGraphToNode(message.og.getOrigin(), div, options, helpers); } /* else if (typeof message.data != "undefined") { if (typeof template.renderDataToNode == "undefined") throw new Error("Template module '" + message.template.module + "' from '" + message.template.id + "' does not export 'renderDataToNode'!"); template.renderDataToNode(message.data, div, options, helpers); } */ else throw new Error("NYI"); }
function renderMessage(domNode, message, options, mode) { try { options = options || {}; options.view = options.view || ["summary"]; options.on = options.on || {}; //console.log("renderMessage", domNode, message, options, mode); var helpers = UTIL.copy(commonHelpers); helpers.helpers = helpers; helpers.document = domNode.ownerDocument; helpers.dispatchEvent = function(name, args) { if (typeof options.on[name] != "undefined") options.on[name](args[1].message, args[1].args); }; message = UTIL.copy(message); if (typeof message.meta == "string") message.meta = JSON.decode(message.meta); if (typeof message === "string") { if (mode == "append") { var div = domNode.ownerDocument.createElement("div"); div.setAttribute("class", "message"); div.innerHTML = message; domNode.appendChild(div); } else if (mode == "replace") { domNode.innerHTML = message; } else throw new Error("NYI"); return; } if (typeof message.og == "undefined" && typeof message.node == "undefined") { if (typeof message.data != "undefined") { // we have data set but no template. try and determine which template to use. var encoder = ENCODER.Encoder(); message.og = encoder.encode(message.data, {}, {}); } else throw new Error("NYI"); } if (typeof message.og == "string") { message.originalOg = message.og; message.og = DECODER.generateFromMessage({ meta: message.meta, data: message.og }, DECODER.EXTENDED); message.meta = message.og.getMeta(); } if (typeof message.og == "object") { message.og.setMeta(message.meta); message.og.message = message; } if (typeof message.ogPath !== "undefined") { return renderMessage(domNode, { node: message.og.nodeForPath(message.ogPath) }, options, "replace"); } //console.log("message", message); if (typeof message.template == "undefined") { if (typeof message.og == "object") { var o = message.og.getOrigin(); if (!o) { console.log("MESSAGE", message, message.og); throw new Error("Origin is empty!"); } var template = helpers.getTemplateModuleForNode(o); if (!template) throw new Error("Unable to locate template for ObjectGraph!"); //console.log("template based on message.og"); message.template = template.getTemplateLocator(); } else if (typeof message.node != "undefined") { if (!message.node) { throw new Error("message.node is empty!"); } var template = helpers.getTemplateModuleForNode(message.node); if (!template) throw new Error("Unable to locate template for node!"); //console.log("template based on message.node"); message.template = template.getTemplateLocator(); } else throw new Error("NYI"); } if (typeof message.template != "undefined") { // ASSUMPTION: module.mappings["templates"] resolves to 'github.com/insight/insight.renderers.default/' package // TODO: Arbitrary template loading via authorization callback if (typeof message.template.id != "undefined" && message.template.id != "github.com/insight/insight.renderers.default/") throw new Error("Only templates from 'github.com/insight/insight.renderers.default/' are supported at this time!"); function render(template) { var div; if (mode == "append") { div = domNode.ownerDocument.createElement("div"); div.setAttribute("class", "message"); } else if (mode == "replace") { div = domNode; div.innerHTML = ""; } else throw new Error("NYI"); function renderWrapped(div, view) { //console.log("renderWrapped()"); //console.log("options.wrapper", options.wrapper); //console.log("message", message); // Nothing to render for groups. Child nodes have already been inserted. // TODO: Maybe do not insert child nodes until expanding? if (message.meta && typeof message.meta["group.start"] !== "undefined" && message.meta["group.start"]) return; options = UTIL.copy(options); if (typeof view != "undefined") options.view = view; if (typeof options.view != "array") options.view = [options.view]; if (typeof message.og != "undefined") { if (typeof template.renderObjectGraphToNode == "undefined") throw new Error("Template module '" + message.template.module + "' from '" + message.template.id + "' does not export 'renderObjectGraphToNode'!"); template.renderObjectGraphToNode(message.og.getOrigin(), div, options, helpers); } /* else if (typeof message.data != "undefined") { if (typeof template.renderDataToNode == "undefined") throw new Error("Template module '" + message.template.module + "' from '" + message.template.id + "' does not export 'renderDataToNode'!"); template.renderDataToNode(message.data, div, options, helpers); } */ else throw new Error("NYI"); } if (mode == "append") { domNode.appendChild(div); } if (typeof options.wrapper != "undefined") { if (options.wrapper.id != "github.com/insight/insight.renderers.default/") throw new Error("Only wrappers from 'github.com/insight/insight.renderers.default/' are supported at this time!"); function doRenderWrapped(id) { message.render = renderWrapped; try { message.template = template.getTemplate(helpers); } catch (err) { console.warn("Error getting template", err.stack); } message.meta = message.meta || {}; //console.log("ID", id); try { require("insight.renderers.default/lib/" + id).renderMessage(message, div, options, helpers); } catch (err) { console.warn("Error rendering message", err.stack); } if (typeof options.callback === "function") options.callback(div); } //console.log("load WRAPPER 1", "insight.renderers.default/lib/" + options.wrapper.module); //console.log("require", require); doRenderWrapped(options.wrapper.module); /* var wrapperId = require.id("insight.renderers.default/lib/" + options.wrapper.module); console.log("wrapperId", wrapperId); if (renderWrappers[wrapperId] && Q.isPromise(renderWrappers[wrapperId])) { Q.when(renderWrappers[wrapperId], doRenderWrapped); } else { // else if (renderWrappers[wrapperId] || require.isMemoized(wrapperId)) { doRenderWrapped(wrapperId); } */ /* else { throw new Error("TODO: Implement dynamic loading of templates."); var result = Q.defer(); console.log("load WRAPPER 2", "insight.renderers.default/lib/" + options.wrapper.module); module.load("insight.renderers.default/lib/" + options.wrapper.module, function(id) { doRenderWrapped(id); renderWrappers[wrapperId] = true; result.resolve(id); }); renderWrappers[wrapperId] = result.promise; } */ } else renderWrapped(div); } if (typeof message.template.getTemplate == "function") { render(message.template.getTemplate()); return; } var tplId = message.template.id + "|" + message.template.module; //console.log("message", message); //console.log("tplId", tplId); if (modules[tplId] && RELOADING) { // TODO: This can probably move down to remove modules right after included as in "comm" // remove all modules for this template from previous loads modules[tplId][0].forEach(function(id) { // delete getBravoJS().pendingModuleDeclarations[id]; // delete getBravoJS().requireMemo[id]; }); delete modules[tplId]; } if (!modules[tplId]) { // modules[tplId] = [Object.keys(getBravoJS().pendingModuleDeclarations).concat(Object.keys(getBravoJS().requireMemo))]; //console.log("lod module dynamiclly!", message.template.module); //console.log("INSIGHT_RENDERERS_DEFAULT", INSIGHT_RENDERERS_DEFAULT); //console.log("LOAD MODULE ASYNC", "insight.renderers.default/" + message.template.module); // TODO: Use `require.async` to load templates dynamically. For now they are already memoized by the pack helper by including them statically. var template = require(("insight.renderers.default/lib/" + message.template.module).replace("/lib/lib/", "/lib/")); //console.log("template", template); /* moduleload("templates/" + message.template.module, function(id) { var template = modules[tplId][1] = require(id); if (typeof template.getTemplatePack == "function") { var templatePack = template.getTemplatePack(); if (templatePacks.list.indexOf(templatePack) === -1) templatePacks.list.push(templatePack); } render(template); // compute all newly added modules modules[tplId][0] = Object.keys(getBravoJS().pendingModuleDeclarations).concat(Object.keys(getBravoJS().requireMemo)).filter(function(id) { return (modules[tplId][0].indexOf(id) === -1); }); }); */ if (typeof template.getTemplatePack == "function") { var templatePack = template.getTemplatePack(); if (templatePacks.list.indexOf(templatePack) === -1) { templatePacks.list.push(templatePack); } } render(template); } else render(modules[tplId][1]); } else throw new Error("NYI"); } catch (err) { console.error("error rendering message", err); } }
if (!templatePacks.byid["columnexplore"]) { templatePacks.byid["columnexplore"] = PACK; templatePacks.list.push(PACK); } } var commonHelpers = { helpers: null, // NOTE: This should only be called once or with an ID to replace existing importCssString: function(id, css, document) { injectedCss[id] = css; DOM.importCssString(css, document, "devcomp-insight-css-" + id); }, util: UTIL.copy(DOMPLATE_UTIL), getTemplateForId: function(id) { //console.error("NYI - commonHelpers.getTemplateForid (in " + module.id + ")"); throw new Error("NYI - commonHelpers.getTemplateForid (in " + module.id + ")"); }, getTemplateModuleForNode: function(node) { //console.log("getTemplateModuleForNode()", node); try { ensureTemplatePacks(); var found; var og = node.getObjectGraph(), ogNode = og.origin, meta = og.meta;