topoDialog.js 4.74 KB
/*
 *  Copyright 2015 Open Networking Laboratory
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/*
 ONOS GUI -- Topology Dialog Module.
 Defines functions for manipulating a dialog box.
 */

(function () {
    'use strict';

    // injected refs
    var $log, $window, $rootScope, fs, ps, bns;

    // constants
    var pCls = 'topo-p dialog',
        idDialog = 'topo-p-dialog',
        panelOpts = {
            width: 300,
            edge: 'left'
        };

    // internal state
    var pApi, panel, dApi;

    // TODO: ESC key invokes Cancel callback
    // TODO: Enter invokes OK callback

    // create the dialog; return its API
    function createDialog() {
        var header, body, footer,
            p = ps.createPanel(idDialog, panelOpts);
        p.classed(pCls, true);
        panel = p;

        function reset() {
            p.empty();
            p.append('div').classed('header', true);
            p.append('div').classed('body', true);
            p.append('div').classed('footer', true);

            header = p.el().select('.header');
            body = p.el().select('.body');
            footer = p.el().select('.footer');
        }

        function hAppend(x) {
            if (typeof x === 'string') {
                return header.append(x);
            }
            header.node().appendChild(x.node());
            return header;
        }

        function bAppend(x) {
            if (typeof x === 'string') {
                return body.append(x);
            }
            body.node().appendChild(x.node());
            return body;
        }

        function fAppend(x) {
            if (typeof x === 'string') {
                return footer.append(x);
            }
            footer.node().appendChild(x.node());
            return footer;
        }

        function destroy() {
            ps.destroyPanel(idDialog);
        }

        return {
            reset: reset,
            appendHeader: hAppend,
            appendBody: bAppend,
            appendFooter: fAppend,
            destroy: destroy
        };
    }

    function makeButton(text, callback) {
        var cb = fs.isF(callback);

        function invoke() {
            cb && cb();
            panel.hide();
        }
        return createDiv('dialog-button')
            .text(text)
            .on('click', invoke);
    }

    function setTitle(title) {
        if (pApi) {
            pApi.appendHeader('h2').text(title);
        }
        return dApi;
    }

    function addContent(content) {
        if (pApi) {
            pApi.appendBody(content);
        }
        return dApi;
    }

    function addButton(text, cb) {
        if (pApi) {
            pApi.appendFooter(makeButton(text, cb));
        }
        return dApi;
    }

    // opens the dialog (creates if necessary)
    function openDialog() {
        $log.debug('Open DIALOG');
        if (!pApi) {
            pApi = createDialog();
        }
        pApi.reset();
        panel.show();

        // return the dialog object API
        dApi = {
            setTitle: setTitle,
            addContent: addContent,
            addButton: addButton
        };
        return dApi;
    }

    // closes the dialog (destroying panel)
    function closeDialog() {
        $log.debug('Close DIALOG');
        if (pApi) {
            panel.hide();
            pApi.destroy();
            pApi = null;
            dApi = null;
        }
    }

    // creates a detached div, returning D3 selection
    // optional CSS class may be provided
    function createDiv(cls) {
        var div = d3.select(document.createElement('div'));
        if (cls) {
            div.classed(cls, true);
        }
        return div;
    }

    // ==========================

    angular.module('ovTopo')
    .factory('TopoDialogService',
        ['$log', '$window', '$rootScope', 'FnService', 'PanelService', 'ButtonService',

        function (_$log_, _$window_, _$rootScope_,
                  _fs_, _ps_, _bns_) {
            $log = _$log_;
            $window = _$window_;
            $rootScope = _$rootScope_;
            fs = _fs_;
            ps = _ps_;
            bns = _bns_;

            return {
                openDialog: openDialog,
                closeDialog: closeDialog,
                createDiv: createDiv
            };
        }]);
}());