diff options
Diffstat (limited to 'framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tableBuilder.js')
-rw-r--r-- | framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tableBuilder.js | 165 |
1 files changed, 165 insertions, 0 deletions
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tableBuilder.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tableBuilder.js new file mode 100644 index 00000000..24161bbb --- /dev/null +++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/widget/tableBuilder.js @@ -0,0 +1,165 @@ +/* + * 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 -- Widget -- Table Service + */ +(function () { + 'use strict'; + + // injected refs + var $log, $interval, $timeout, fs, wss; + + // constants + var refreshInterval = 2000, + loadingWait = 500; + + // example params to buildTable: + // { + // scope: $scope, <- controller scope + // tag: 'device', <- table identifier + // selCb: selCb, <- row selection callback (optional) + // respCb: respCb, <- websocket response callback (optional) + // query: params <- query parameters in URL (optional) + // } + // Note: selCb() is passed the row data model of the selected row, + // or null when no row is selected. + // Note: query is always an object (empty or containing properties) + // it comes from $location.search() + + function buildTable(o) { + var handlers = {}, + root = o.tag + 's', + req = o.tag + 'DataRequest', + resp = o.tag + 'DataResponse', + onSel = fs.isF(o.selCb), + onResp = fs.isF(o.respCb), + oldTableData = [], + loaded = false, + refreshPromise, loadingPromise; + + o.scope.tableData = []; + o.scope.changedData = []; + o.scope.sortParams = {}; + o.scope.loading = true; + o.scope.autoRefresh = true; + o.scope.autoRefreshTip = 'Toggle auto refresh'; + + // === websocket functions -------------------- + // response + function respCb(data) { + loaded = true; + o.scope.loading = false; + o.scope.tableData = data[root]; + onResp && onResp(); + + // checks if data changed for row flashing + if (!angular.equals(o.scope.tableData, oldTableData)) { + o.scope.changedData = []; + // only flash the row if the data already exists + if (oldTableData.length) { + angular.forEach(o.scope.tableData, function (item) { + if (!fs.containsObj(oldTableData, item)) { + o.scope.changedData.push(item); + } + }); + } + angular.copy(o.scope.tableData, oldTableData); + } + o.scope.$apply(); + } + handlers[resp] = respCb; + wss.bindHandlers(handlers); + + // request + function sortCb(params) { + var p = angular.extend({}, params, o.query); + wss.sendEvent(req, p); + stillLoading(); + } + o.scope.sortCallback = sortCb; + + // show loading wheel if it's taking a while for the server to respond + function stillLoading() { + loaded = false; + loadingPromise = $timeout(function () { + if (!loaded) { + o.scope.loading = true; + } + }, loadingWait); + } + + // === selecting a row functions ---------------- + function selCb($event, selRow) { + o.scope.selId = (o.scope.selId === selRow.id) ? null : selRow.id; + onSel && onSel($event, selRow); + } + o.scope.selectCallback = selCb; + + // === autoRefresh functions ------------------ + function startRefresh() { + refreshPromise = $interval(function () { + if (fs.debugOn('widget')) { + $log.debug('Refreshing ' + root + ' page'); + } + sortCb(o.scope.sortParams); + }, refreshInterval); + } + + function stopRefresh() { + if (angular.isDefined(refreshPromise)) { + $interval.cancel(refreshPromise); + refreshPromise = undefined; + } + } + + function toggleRefresh() { + o.scope.autoRefresh = !o.scope.autoRefresh; + o.scope.autoRefresh ? startRefresh() : stopRefresh(); + } + o.scope.toggleRefresh = toggleRefresh; + + // === Cleanup on destroyed scope ----------------- + o.scope.$on('$destroy', function () { + wss.unbindHandlers(handlers); + stopRefresh(); + if (angular.isDefined(loadingPromise)) { + $timeout.cancel(loadingPromise); + loadingPromise = undefined; + } + }); + + sortCb(); + startRefresh(); + } + + angular.module('onosWidget') + .factory('TableBuilderService', + ['$log', '$interval', '$timeout', 'FnService', 'WebSocketService', + + function (_$log_, _$interval_, _$timeout_, _fs_, _wss_) { + $log = _$log_; + $interval = _$interval_; + $timeout = _$timeout_; + fs = _fs_; + wss = _wss_; + + return { + buildTable: buildTable + }; + }]); + +}()); |