Example #1
0
                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");
                }
Example #2
0
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);
    }
}
Example #3
0
    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;