APIs

Show:
/**
 * @namespace flexygo.ui.wc
 */
var flexygo;
(function (flexygo) {
    var ui;
    (function (ui) {
        var wc;
        (function (wc) {
            /**
            * Library for the FlxNavElement web component.
            *
            * @class FlxAreaElement
            * @constructor
            * @return {FlxAreaElement}
            */
            class FlxAreaElementBreadCrumbItem {
            }
            wc.FlxAreaElementBreadCrumbItem = FlxAreaElementBreadCrumbItem;
            class FlxAreaElement extends HTMLElement {
                constructor() {
                    super();
                    /**
                    * Set when component is attached to DOM
                    * @property connected {boolean}
                    */
                    this.connected = false;
                    this.method = null;
                    this.methodParams = null;
                    this.backNode = null;
                    this.initNode = null;
                    this.currentNode = null;
                    this.breadcrumArray = [];
                }
                /**
                * Fires when element is attached to DOM
                * @method connectedCallback
                */
                connectedCallback() {
                    let navBar = $(this);
                    if (navBar.attr('manualInit') != 'true') {
                        this.init();
                    }
                }
                static get observedAttributes() {
                    return [];
                }
                /**
              * Fires when the attribute value of the element is changed.
              * @method attributeChangedCallback
              * @param {String} attrName. The attribute name
              * @param {String} oldVal. The old value
              * @param {String} newVal.the new value
              */
                attributeChangedCallback(attrName, oldVal, newVal) {
                    if (!this.connected) {
                        return;
                    }
                    this.init();
                }
                /**
                * Init the webcomponent.
                * @method init
                */
                init() {
                    $(this).removeAttr('manualInit');
                    this.uuid = flexygo.utils.uniqueUUID();
                    let navBar = $(this);
                    navBar.empty();
                    this.connected = true;
                    let initNode = navBar.attr('initNode');
                    navBar.attr('original-mode', navBar.attr('mode'));
                    this.method = 'GetAreaNode';
                    this.methodParams = { ParentId: initNode };
                    this.initNode = initNode;
                    this.loadNodes();
                }
                /**
                * Refresh de webcomponent.
                * @method refresh
                */
                refresh() {
                    if ($(this).attr('manualInit') != 'true') {
                        $(this).empty();
                        this.loadNodes();
                    }
                }
                /**
                * Does post to load Areas Nodes.
                * @method loadNodes
                */
                loadNodes() {
                    flexygo.ajax.post('~/api/Navigation', this.method, this.methodParams, (response) => {
                        let arrOrdered = flexygo.utils.sortObject(response, 'Order');
                        this.loadNodesRet(arrOrdered);
                    });
                }
                /**
                * loads Nodes with post result.
                * @method loadNodesRet
                * @param {Array} ret. an array with the nodes
                */
                loadNodesRet(ret) {
                    let me = $(this);
                    let cnt = '';
                    let parentNode = null;
                    ret.forEach((n) => {
                        if (n.NodeId.toLowerCase() !== this.initNode.toLowerCase()) {
                            cnt +=
                                `<li>
                            <span class="icon-cont">
                                <i class="${n.IconClass}"></i>
                            </span> 
                            <h3>${n.Title}</h3>
                            <div class="iconright" data-divein="${n.NodeId}" data-title="${n.Title}">
                                <i class="flx-icon icon-arrow-2"></i> 
                            </div>
                            <div class="iconback ${this.getNoShow(n, 'parent')}">
                                <i class="flx-icon icon-arrow-2 icon-flip-horizontal"></i>
                            </div>
                        </li>
                     `;
                        }
                        else {
                            this.backNode = n.ParentNodeId;
                            parentNode = n;
                        }
                    });
                    let headerTemplate = `${this.getBreadcrum(parentNode)}<div class="child-nodes" style="display:none"></div>`;
                    me.append(headerTemplate);
                    let elem = $('<ul/>').html(cnt).first();
                    let i = me.find('.child-nodes');
                    i.html(elem);
                    i.show('slide', {}, 500);
                    me.append(`<div id="${this.uuid}" style= "min-height:600px;"></div>`);
                    //me.append(`<div id="${this.uuid}"></div>`);
                    me.find('div.iconright').off('click').on('click', (e) => {
                        let nodeid = $(e.currentTarget).attr('data-divein');
                        let title = $(e.currentTarget).attr('data-title');
                        this.diveIn(nodeid, title);
                    });
                    me.find('div.iconback').off('click').on('click', (e) => {
                        this.goBack();
                    });
                    me.find('nav').find('li').off('click').on('click', (e) => {
                        let id = $(e.currentTarget).attr('data-id');
                        this.goNode(id);
                    });
                    let arrNodes = [];
                    let arrEdges = [];
                    this.currentNode = parentNode;
                    if (parentNode && parentNode.WebComponent && parentNode.WebComponent.length > 0) {
                        let data = JSON.parse(parentNode.WebComponent);
                        let datanodes = data.Nodes;
                        datanodes.forEach((n) => {
                            //console.log('node', n);
                            let title = flexygo.localization.translate(n.Title);
                            if (n.Icon && n.Icon.length > 0) {
                                arrNodes.push({
                                    id: n.Id,
                                    label: n.Label,
                                    shape: n.Shape,
                                    title: title,
                                    hidden: false,
                                    icon: {
                                        face: n.Face,
                                        color: n.Color,
                                        code: this.toUnicode(n.Icon)
                                    },
                                    x: n.PosX,
                                    y: n.PosY,
                                    fixed: true,
                                    infoSource: n.InfoSource,
                                    infoTarget: n.InfoTarget,
                                    expandable: n.Expandable,
                                    isObject: n.IsObject,
                                    isProcess: false,
                                    isExpanded: false
                                });
                            }
                            else {
                                arrNodes.push({
                                    id: n.Id,
                                    label: n.Label,
                                    shape: n.Shape,
                                    color: n.Color,
                                    title: title,
                                    hidden: false,
                                    x: n.PosX,
                                    y: n.PosY,
                                    fixed: true,
                                    infoSource: n.InfoSource,
                                    infoTarget: n.InfoTarget,
                                    expandable: n.Expandable,
                                    isObject: n.IsObject,
                                    isProcess: false,
                                    isExpanded: false
                                });
                            }
                        });
                        let dataedges = data.Edges;
                        dataedges.forEach((n) => {
                            //console.log('edge', n);
                            arrEdges.push({
                                from: n.NodeFrom,
                                to: n.NodeTo,
                                color: {
                                    color: n.Color,
                                },
                            });
                        });
                    }
                    this.nodes = new vis.DataSet(arrNodes);
                    this.edges = new vis.DataSet(arrEdges);
                    let data = {
                        nodes: this.nodes,
                        edges: this.edges
                    };
                    let options = {
                        autoResize: true,
                        height: '100%',
                        width: '100%',
                        nodes: {
                            shape: 'box',
                            borderWidth: 2,
                            shadow: true
                        },
                        edges: {
                            smooth: {
                                enabled: true,
                                type: "diagonalCross",
                                forceDirection: "none",
                                roundness: 0
                            },
                            width: 2,
                            shadow: true
                        },
                        physics: {
                            repulsion: {
                                nodeDistance: 100
                            },
                            minVelocity: 0.75,
                            solver: "repulsion"
                        },
                        interaction: {
                            dragNodes: false // do not allow dragging nodes
                        }
                    };
                    let container = document.getElementById(this.uuid);
                    this.network = new vis.Network(container, data, options);
                    let self = this;
                    this.network.off('click');
                    this.network.off('oncontext');
                    this.network.on("click", (params) => {
                        self.onNodeClick(params);
                    });
                    this.network.on("oncontext", (params) => {
                        self.onNodeContext(params);
                    });
                    this.network.setSize($(container).width().toString(), $(container).height().toString());
                    this.network.fit();
                }
                onNodeContext(params) {
                    if (params.nodes && params.nodes.length === 1) {
                        let node = this.nodes.get(params.nodes[0]);
                        if (node.objectName && node.objectWhere && node.objectName.length > 0 && node.objectWhere.length > 0) {
                            let cord = {
                                left: params.event.clientX,
                                top: params.event.clientY
                            };
                            params.event.preventDefault();
                            flexygo.nav.getObjectMenu(node.objectName, node.objectWhere, null, $('#mainContent'), cord);
                        }
                    }
                }
                /**
                * Handles click on network graphics
                * @method onNodeClick
                * @param {any} parms. The event param
                */
                onNodeClick(params) {
                    if (params.nodes && params.nodes.length === 1) {
                        let node = this.nodes.get(params.nodes[0]);
                        if (node.expandable === true && node.infoSource && node.infoSource.length > 0 && node.infoTarget && node.infoTarget.length > 0) {
                            if (node.isExpanded === true) {
                                node.isExpanded = false;
                                let childs = this.network.getConnectedNodes(node.id);
                                for (let child of childs) {
                                    let childNode = this.nodes.get(child);
                                    if (childNode.isProcess === true) {
                                        childNode.hidden = true;
                                        this.nodes.update(childNode);
                                    }
                                }
                                this.nodes.update(node);
                            }
                            else {
                                let childs = this.network.getConnectedNodes(node.id, 'from');
                                let childNodes = [];
                                for (let child of childs) {
                                    let childNode = this.nodes.get(child);
                                    if (childNode.isProcess === true) {
                                        childNodes.push(childNode);
                                    }
                                }
                                if (childNodes.length > 0) {
                                    for (let childNode of childNodes) {
                                        childNode.hidden = false;
                                        this.nodes.update(childNode);
                                    }
                                    node.isExpanded = true;
                                    this.nodes.update(node);
                                }
                                else {
                                    let procparams = {
                                        areaId: this.currentNode.NodeId,
                                        source: node.infoSource,
                                        target: node.infoTarget
                                    };
                                    flexygo.ajax.post('~/api/Navigation', 'GetProcessesNodes', procparams, (response) => {
                                        //console.log(response);
                                        node.isExpanded = true;
                                        this.nodes.update(node);
                                        let maxId = 0;
                                        this.nodes.forEach((n) => {
                                            if (n.id > maxId) {
                                                maxId = parseInt(n.id);
                                            }
                                        });
                                        maxId += 1;
                                        let edgeColor = '';
                                        response.forEach((nn) => {
                                            if (edgeColor.length === 0) {
                                                edgeColor = nn.EdgeColor;
                                            }
                                            this.nodes.add([{
                                                    id: maxId,
                                                    label: this.setMultiline(nn.ProcessDescrip),
                                                    shape: 'icon',
                                                    hidden: false,
                                                    isObject: false,
                                                    isProcess: true,
                                                    objectName: nn.ObjectName,
                                                    objectWhere: nn.ObjectWhere,
                                                    icon: {
                                                        face: nn.IconFace,
                                                        color: nn.Color,
                                                        code: this.toUnicode(nn.Icon)
                                                    }
                                                }]);
                                            this.edges.add([{
                                                    from: node.id,
                                                    to: maxId,
                                                    color: {
                                                        color: edgeColor,
                                                    },
                                                }]);
                                            maxId += 1;
                                        });
                                        this.network.stabilize();
                                    });
                                }
                            }
                        }
                    }
                }
                setMultiline(s) {
                    let ret = '';
                    if (!s || s.length < 31) {
                        return s;
                    }
                    let length = 25;
                    while (s.length > 0) {
                        ret += s.substring(0, length);
                        s = s.substring(length);
                        let n = 0;
                        let end = false;
                        while (s.charAt(n) !== ' ') {
                            n++;
                            if (n > s.length) {
                                end = true;
                                break;
                            }
                        }
                        if (end === true) {
                            ret += s;
                            return ret;
                        }
                        ret += s.substring(0, n);
                        ret += '\n';
                        s = s.substring(n + 1);
                        ret += s.substring(0, length);
                        s = s.substring(length);
                    }
                    return ret;
                }
                /**
               * get Node icon
               * @method getIcon
               * @param {String} IconClass. The icon class
                * @param {String} IconPath. The icon path
               */
                getIcon(IconClass, IconPath) {
                    if (IconClass && IconClass != '') {
                        return '<i class="' + IconClass + '" flx-fw></i>';
                    }
                    else if (IconPath && IconPath != '') {
                        return '<img src="' + IconPath + '" alt="" />';
                    }
                    else {
                        return '';
                    }
                }
                /**
              * Gets current breadcrum
              * @method getBreadcrum
              *  @param  json. Json elements
              * @return {string}
              */
                getBreadcrum(json) {
                    let i = 0;
                    let itemtext = '';
                    if (this.breadcrumArray.length == 0) {
                        if (json) {
                            let item = {
                                id: json.NodeId,
                                title: json.Title
                            };
                            this.breadcrumArray.push(item);
                        }
                        else {
                            this.breadcrumArray.push({ id: '', title: 'Areas' });
                        }
                    }
                    for (i = 0; i < this.breadcrumArray.length; i++) {
                        itemtext += `<li data-id="${this.breadcrumArray[i].id}"><a>${this.breadcrumArray[i].title}</a></li>`;
                    }
                    return '<nav aria-label="breadcrumb"><ol class="breadcrumb" >' + itemtext + '</ol></nav>';
                }
                /**
               * Replace nodes with new parent id childs. Does not work with autogenerated nodes
               * @method diveIn
               * @param  {string} nodeId. The node id
               * @param {string} title. The node title
               */
                diveIn(nodeId, title) {
                    let me = $(this);
                    if (nodeId != '') {
                        this.breadcrumArray.push({ id: nodeId, title: title });
                        me.find('.child-nodes').hide('slide', {}, 500, () => {
                            if ($("li:animated").length === 0) {
                                me.attr('initNode', nodeId);
                                this.init();
                            }
                        });
                    }
                }
                /**
                * Goas back to original node
                * @method goBack
                * @param {String} nodeId. New parent node
           
                */
                goBack() {
                    let me = $(this);
                    if (this.backNode) {
                        this.breadcrumArray.pop();
                        me.find('.child-nodes').hide('slide', {}, 500, () => {
                            me.attr('initNode', this.backNode);
                            this.init();
                        });
                    }
                }
                /**
                * Goas back until node is reached
                * @method goBack
                * @param {String} nodeId. New parent node
           
                */
                goNode(nodeId) {
                    let me = $(this);
                    let last = this.breadcrumArray.pop();
                    while (last.id !== nodeId) {
                        last = this.breadcrumArray.pop();
                    }
                    this.breadcrumArray.push(last);
                    me.find('.child-nodes').hide('slide', {}, 500, () => {
                        me.attr('initNode', last.id);
                        this.init();
                    });
                }
                /**
              * Sees if node has childnodes an returns the noshow class
              * @method getNoShow
              * @param  json. Json elements
              * @param {string} mode. check for parent ,child or process mode
              */
                getNoShow(json, mode) {
                    if (mode == 'parent') {
                        if (json.ParentNodeId) {
                            return '';
                        }
                    }
                    if (mode == 'process') {
                        if (json.StrType !== 'text' && json.StrType !== 'group') {
                            return '';
                        }
                    }
                    else {
                        if (json.ChildNodes && Object.keys(json.ChildNodes).length > 0) {
                            return '';
                        }
                        // Ares do not have nodes
                        if (json.Params && json.Params.length > 0) {
                            return '';
                        }
                    }
                    return 'noshow';
                }
                toUnicode(name) {
                    let testI = document.createElement('i');
                    let char;
                    testI.className = name;
                    document.body.appendChild(testI);
                    char = window.getComputedStyle(testI, ':before').content.replace(/'|"/g, '');
                    testI.remove();
                    let code = char.charCodeAt(0);
                    try {
                        return JSON.parse('"\\u' + code.toString(16) + '"');
                    }
                    catch (e) {
                        return '';
                    }
                }
            }
            wc.FlxAreaElement = FlxAreaElement;
        })(wc = ui.wc || (ui.wc = {}));
    })(ui = flexygo.ui || (flexygo.ui = {}));
})(flexygo || (flexygo = {}));
window.customElements.define('flx-area', flexygo.ui.wc.FlxAreaElement);
//# sourceMappingURL=flx-area.js.map