[EAGLE-604] Support view/editing application configuration after installed Support view/editing application configuration after installed
Author: zombieJ <smith3...@gmail.com> Closes #500 from zombieJ/EAGLE-604. Project: http://git-wip-us.apache.org/repos/asf/incubator-eagle/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-eagle/commit/1d0f9f5b Tree: http://git-wip-us.apache.org/repos/asf/incubator-eagle/tree/1d0f9f5b Diff: http://git-wip-us.apache.org/repos/asf/incubator-eagle/diff/1d0f9f5b Branch: refs/heads/master Commit: 1d0f9f5b03acefbfb9af97a83ca19ad3d02d638a Parents: 4dfb528 Author: zombieJ <smith3...@gmail.com> Authored: Thu Oct 13 16:13:08 2016 +0800 Committer: zombieJ <smith3...@gmail.com> Committed: Thu Oct 13 16:13:08 2016 +0800 ---------------------------------------------------------------------- .../webapp/app/dev/partials/alert/main.html | 63 ++++---- .../app/dev/partials/alert/policyDetail.html | 40 ++--- .../app/dev/partials/alert/streamList.html | 47 ++++++ .../app/dev/partials/integration/main.html | 1 - .../app/dev/partials/integration/site.html | 145 +++++++++++++++++-- .../dev/partials/integration/streamList.html | 52 ------- .../src/main/webapp/app/dev/public/js/app.js | 14 +- .../src/main/webapp/app/dev/public/js/common.js | 18 ++- .../webapp/app/dev/public/js/ctrls/alertCtrl.js | 19 +++ .../app/dev/public/js/ctrls/alertEditCtrl.js | 5 +- .../app/dev/public/js/ctrls/integrationCtrl.js | 135 ++++++++++++----- .../src/main/webapp/app/dev/public/js/index.js | 9 +- .../dev/public/js/services/applicationSrv.js | 4 + .../app/dev/public/js/services/pageSrv.js | 6 +- 14 files changed, 386 insertions(+), 172 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/partials/alert/main.html ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/partials/alert/main.html b/eagle-server/src/main/webapp/app/dev/partials/alert/main.html index 2e062a8..2e14db9 100644 --- a/eagle-server/src/main/webapp/app/dev/partials/alert/main.html +++ b/eagle-server/src/main/webapp/app/dev/partials/alert/main.html @@ -1,29 +1,34 @@ -<!-- - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you 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. - --> - -<div class="nav-tabs-custom"> - <ul class="nav nav-tabs"> - <li ng-class="{active: getState() === 'alert.list'}"><a href="#/alert/">Explore Triggered Alerts</a></li> - <li ng-class="{active: getState() === 'alert.policyList'}"><a href="#/alert/policyList">Manage Policies</a></li> - <li ng-class="{active: ['alert.policyCreate', 'alert.policyEdit'].indexOf(getState()) >= 0}"><a href="#/alert/policyCreate">Define Alert Policy</a></li> - </ul> - <div class="tab-content no-padding"> - <div ui-view></div> - </div> -</div> - +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + --> + +<div class="nav-tabs-custom"> + <ul class="nav nav-tabs"> + <li ng-class="{active: getState() === 'alert.list'}"><a href="#/alert/">Alerts</a></li> + <li ng-class="{active: getState() === 'alert.policyList'}"><a href="#/alert/policyList">Policies</a></li> + <li ng-class="{active: getState() === 'alert.streamList'}"><a href="#/alert/streamList">Streams</a></li> + + <li + ng-class="{active: ['alert.policyCreate', 'alert.policyEdit'].indexOf(getState()) >= 0}" + ng-if="['alert.policyCreate', 'alert.policyEdit'].indexOf(getState()) >= 0" + ><a href="#/alert/policyCreate">Define Alert Policy</a></li> + </ul> + <div class="tab-content no-padding"> + <div ui-view></div> + </div> +</div> + http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/partials/alert/policyDetail.html ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/partials/alert/policyDetail.html b/eagle-server/src/main/webapp/app/dev/partials/alert/policyDetail.html index b04a8a8..7ec5f39 100644 --- a/eagle-server/src/main/webapp/app/dev/partials/alert/policyDetail.html +++ b/eagle-server/src/main/webapp/app/dev/partials/alert/policyDetail.html @@ -18,7 +18,8 @@ <div class="nav-tabs-custom"> <ul class="nav nav-tabs"> - <li class="active"><a href="#policy" data-toggle="tab">Policy</a></li> + <li class="active"><a href="#basic" data-toggle="tab">Basic</a></li> + <li><a href="#definition" data-toggle="tab">Definition</a></li> <li><a href="#publisher" data-toggle="tab">Publisher</a></li> <li class="pull-right"> @@ -30,7 +31,7 @@ </li> </ul> <div class="tab-content"> - <div class="tab-pane active" id="policy"> + <div class="tab-pane active" id="basic"> <table class="table"> <tbody> <tr> @@ -61,26 +62,29 @@ </ul> </td> </tr> - <tr> - <th>Definition</th> - <td colspan="3"><pre class="inline">{{policy.definition.value}}</pre></td> - </tr> - <tr> - <th>Partition</th> - <td colspan="3"> - <ul class="no-margin"> - <li ng-repeat="partition in policy.partitionSpec track by $index"> - [<span class="text-primary">{{partition.type}}</span>] - {{partition.streamId}}: - <strong class="text-success">{{partition.columns.join(", ")}}</strong> - </li> - </ul> - </td> - </tr> </tbody> </table> </div> + <div class="tab-pane" id="definition"> + <label>Definition</label> + <pre>{{policy.definition.value}}</pre> + + <label>Partition</label> + <ul class="no-margin"> + <li ng-repeat="partition in policy.partitionSpec track by $index"> + [<span class="text-primary">{{partition.type}}</span>] + {{partition.streamId}}: + <strong class="text-success">{{partition.columns.join(", ")}}</strong> + </li> + <li ng-if="policy.partitionSpec.length === 0" class="text-muted"> + No partition + </li> + </ul> + </div> <div class="tab-pane" id="publisher"> + <p ng-if="publisherList.length === 0" class="text-muted"> + <span class="fa fa-exclamation-triangle"></span> No publisher configured + </p> <table class="table table-bordered" ng-repeat="publisher in publisherList track by publisher.name"> <tbody> <tr> http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/partials/alert/streamList.html ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/partials/alert/streamList.html b/eagle-server/src/main/webapp/app/dev/partials/alert/streamList.html new file mode 100644 index 0000000..79f15a6 --- /dev/null +++ b/eagle-server/src/main/webapp/app/dev/partials/alert/streamList.html @@ -0,0 +1,47 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you 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. + --> + +<div class="box-body"> + <div sort-table="streamList"> + <table class="table table-bordered table-hover"> + <thead> + <tr> + <th>Stream</th> + <th>Provider (App)</th> + <th>Site</th> + <th>Schema</th> + </tr> + </thead> + <tbody> + <tr> + <td><span class="label label-primary">{{item.streamId}}</span></td> + <td>{{item.appType}}</td> + <td>{{item.siteId}}</td> + <td> + <ul class="no-margin"> + <li ng-repeat="column in item.schema.columns track by $index"> + <strong>{{column.name}}</strong>: + {{column.type}} + </li> + </ul> + </td> + </tr> + </tbody> + </table> + </div> +</div> http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/partials/integration/main.html ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/partials/integration/main.html b/eagle-server/src/main/webapp/app/dev/partials/integration/main.html index daea22e..3a063d7 100644 --- a/eagle-server/src/main/webapp/app/dev/partials/integration/main.html +++ b/eagle-server/src/main/webapp/app/dev/partials/integration/main.html @@ -20,7 +20,6 @@ <ul class="nav nav-tabs"> <li ng-class="{active: getState().indexOf('integration.site') !== -1}"><a href="#/integration/siteList">Sites</a></li> <li ng-class="{active: getState() === 'integration.applicationList'}"><a href="#/integration/applicationList">Applications</a></li> - <li ng-class="{active: getState() === 'integration.streamList'}"><a href="#/integration/streamList">Streams</a></li> </ul> <div class="tab-content no-padding"> <div ui-view></div> http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/partials/integration/site.html ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/partials/integration/site.html b/eagle-server/src/main/webapp/app/dev/partials/integration/site.html index 4c118dc..e320c48 100644 --- a/eagle-server/src/main/webapp/app/dev/partials/integration/site.html +++ b/eagle-server/src/main/webapp/app/dev/partials/integration/site.html @@ -17,17 +17,33 @@ --> <div class="box-body"> - <p class="text-danger" ng-if="site.applicationList.length === 0"> - <span class="fa fa-exclamation-triangle"></span> Site must install at least one application to start up. - </p> - <p class="text-warning" ng-if="site.applicationList.length !== 0 && getStartedAppCount() === 0"> - <span class="fa fa-exclamation-triangle"></span> No application started. - </p> + + + <div class="form-group"> + <label>Site</label> + <input type="text" class="form-control" readonly ng-model="siteName"> + </div> + <div class="form-group"> + <label>Description</label> + <textarea class="form-control" readonly ng-model="site.description" rows="2"></textarea> + </div> + + <label>Application</label> + <span class="text-danger" ng-if="site.applicationList.length === 0"> + (<span class="fa fa-exclamation-triangle"></span> Site must install at least one application to start up.) + </span> + <span class="text-warning" ng-if="site.applicationList.length !== 0 && getStartedAppCount() === 0"> + (<span class="fa fa-exclamation-triangle"></span> No application started.) + </span> <table class="table table-bordered table-hover"> <thead> <tr> - <th>App</th> + <th> + <small class="pull-right"><a ng-click="refreshApplications()">Refresh</a></small> + Name + <span class="fa fa-refresh fa-spin no-animate" ng-show="!Application.list._done"></span> + </th> <th width="10">Status</th> <th>Version</th> <th>Description</th> @@ -48,9 +64,24 @@ <td class="text-center"> <div class="btn-group btn-group-xs" ng-if="app.installed"> <!--button class="btn btn-default btn-sm">Monitor</button--> - <button class="btn btn-default btn-sm" ng-click="startApp(app)">Start</button> - <button class="btn btn-default btn-sm" ng-click="stopApp(app)">Stop</button> - <button class="btn btn-default btn-sm" ng-click="uninstallApp(app)">Uninstall</button> + <button class="btn btn-default btn-sm" ng-click="startApp(app)" ng-if="app.descriptor.executable"> + <span class="fa fa-play"></span> + </button> + <button class="btn btn-default btn-sm" ng-click="stopApp(app)" ng-if="app.descriptor.executable"> + <span class="fa fa-stop"></span> + </button> + <button class="btn btn-default btn-sm" disabled="disabled" ng-if="!app.descriptor.executable"> + <span class="fa fa-ban"></span> + </button> + <button class="btn btn-default btn-sm" disabled="disabled" ng-if="!app.descriptor.executable"> + <span class="fa fa-ban"></span> + </button> + <button class="btn btn-default btn-sm" ng-click="editApp(app)"> + <span class="fa fa-pencil"></span> + </button> + <button class="btn btn-danger btn-sm" ng-click="uninstallApp(app)"> + <span class="fa fa-trash"></span> + </button> </div> <div class="btn-group btn-group-xs" ng-if="!app.installed"> <button class="btn btn-primary btn-sm" ng-click="installApp(app)">Install Application</button> @@ -75,11 +106,80 @@ </div> <div class="modal-body"> <ul class="nav nav-tabs"> - <li class="active"><a href="[data-id='install']" data-toggle="tab">Install</a></li> + <li><a href="[data-id='intro']" data-toggle="tab" data-id="introTab">Application</a></li> + <li><a href="[data-id='install']" data-toggle="tab">Install</a></li> <li><a href="[data-id='uninstall']" data-toggle="tab">Uninstall</a></li> </ul> <div class="tab-content"> - <div class="tab-pane active" data-id="install"> + <div class="tab-pane" data-id="intro"> + <table class="table"> + <tbody> + <tr> + <th>Application Name</th> + <td>{{application.name}}</td> + <th>Type</th> + <td>{{application.type}}</td> + </tr> + <tr ng-if="tmpApp.uuid"> + <th>Application Id</th> + <td>{{tmpApp.appId}}</td> + <th>UUID</th> + <td>{{tmpApp.uuid}}</td> + </tr> + <tr ng-if="tmpApp.uuid"> + <th>Mode</th> + <td>{{tmpApp.mode}}</td> + <th>Status</th> + <td>{{tmpApp.status}}</td> + </tr> + <tr> + <th>View Path</th> + <td>{{application.viewPath}}</td> + <th>Version</th> + <td>{{application.version}}</td> + </tr> + <tr> + <th>Jar Path</th> + <td colspan="3">{{tmpApp.jarPath || application.jarPath}}</td> + </tr> + <tr> + <th>Application Class</th> + <td colspan="3">{{application.appClass}}</td> + </tr> + <tr> + <th>Provider Class</th> + <td colspan="3">{{application.providerClass}}</td> + </tr> + <tr> + <th>Description</th> + <td colspan="3">{{application.description}}</td> + </tr> + <tr> + <th>Dependencies</th> + <td colspan="3"> + <ul> + <li ng-repeat="dep in application.dependencies track by $index"> + {{Application.findProvider(dep.type).name}} + ({{dep.type}}) + </li> + </ul> + </td> + </tr> + <tr ng-if="tmpApp.uuid"> + <th>Configuration</th> + <td colspan="3"> + <ul> + <li ng-repeat="(key, value) in tmpApp.configuration track by $index"> + <strong>{{key}}:</strong> + {{value}} + </li> + </ul> + </td> + </tr> + </tbody> + </table> + </div> + <div class="tab-pane" data-id="install"> <pre ng-bind-html="installHTML"></pre> </div> <div class="tab-pane" data-id="uninstall"> @@ -106,11 +206,28 @@ </div> <div class="modal-body"> <ul class="nav nav-tabs"> - <li class="active"><a href="[data-id='environment']" data-toggle="tab">Environment</a></li> + <li><a href="[data-id='guide']" data-toggle="tab" data-id="guideTab">Guide</a></li> + <li><a href="[data-id='environment']" data-toggle="tab">Environment</a></li> <li><a href="[data-id='configuration']" data-toggle="tab" data-id="configTab">Configuration</a></li> </ul> <div class="tab-content"> - <div class="tab-pane active" data-id="environment"> + <div class="tab-pane" data-id="guide"> + <label>Dependencies</label> + <ul> + <li ng-repeat="dep in application.dependencies track by $index"> + <strong class="text-success" ng-if="!!Application.find(dep.type, site.siteId)[0]">[ Installed ]</strong> + <strong class="text-danger" ng-if="!Application.find(dep.type, site.siteId)[0]">[ + <span class="fa fa-exclamation-triangle"></span>Require + ]</strong> + {{Application.findProvider(dep.type).name}} + ({{dep.type}}) + </li> + </ul> + + <label>Install</label> + <pre ng-bind-html="installHTML"></pre> + </div> + <div class="tab-pane" data-id="environment"> <div class="form-group"> <label>Mode</label> <select class="form-control" ng-model="tmpApp.mode"> http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/partials/integration/streamList.html ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/partials/integration/streamList.html b/eagle-server/src/main/webapp/app/dev/partials/integration/streamList.html deleted file mode 100644 index beaf743..0000000 --- a/eagle-server/src/main/webapp/app/dev/partials/integration/streamList.html +++ /dev/null @@ -1,52 +0,0 @@ -<!-- - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you 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. - --> - -<div class="box-body"> - <div sort-table="streamList"> - <table class="table table-bordered table-hover"> - <thead> - <tr> - <th>Stream</th> - <th>Provider (App)</th> - <th>Site</th> - <th>Schema</th> - <th width="10">Actions</th> - </tr> - </thead> - <tbody> - <tr> - <td><span class="label label-primary">{{item.streamId}}</span></td> - <td>{{item.appType}}</td> - <td>{{item.siteId}}</td> - <td> - <ul class="no-margin"> - <li ng-repeat="column in item.schema.columns track by $index"> - <strong>{{column.name}}</strong>: - {{column.type}} - </li> - </ul> - </td> - <td> - <!-- TODO:link with alert --> - <button class="btn btn-primary btn-sm">New Alert</button> - </td> - </tr> - </tbody> - </table> - </div> -</div> http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/public/js/app.js ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/public/js/app.js b/eagle-server/src/main/webapp/app/dev/public/js/app.js index fb40ed4..cdb705c 100644 --- a/eagle-server/src/main/webapp/app/dev/public/js/app.js +++ b/eagle-server/src/main/webapp/app/dev/public/js/app.js @@ -103,6 +103,12 @@ var app = {}; controller: "policyListCtrl", resolve: routeResolve() }) + .state('alert.streamList', { + url: "streamList", + templateUrl: "partials/alert/streamList.html?_=" + window._TRS(), + controller: "alertStreamListCtrl", + resolve: routeResolve() + }) .state('alert.policyCreate', { url: "policyCreate", templateUrl: "partials/alert/policyEdit.html?_=" + window._TRS(), @@ -122,6 +128,7 @@ var app = {}; controller: "policyDetailCtrl", resolve: routeResolve() }) + // =============================== Integration ============================== .state('integration', { abstract: true, @@ -148,12 +155,7 @@ var app = {}; controller: "integrationApplicationListCtrl", resolve: routeResolve({ application: false }) }) - .state('integration.streamList', { - url: "streamList", - templateUrl: "partials/integration/streamList.html?_=" + window._TRS(), - controller: "integrationStreamListCtrl", - resolve: routeResolve() - }) + // ================================== Site ================================== .state('site', { url: "/site/:siteId", http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/public/js/common.js ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/public/js/common.js b/eagle-server/src/main/webapp/app/dev/public/js/common.js index 0e9cc7c..7d41371 100644 --- a/eagle-server/src/main/webapp/app/dev/public/js/common.js +++ b/eagle-server/src/main/webapp/app/dev/public/js/common.js @@ -97,15 +97,17 @@ }; common.parseJSON = function (str, defaultVal) { - try { - str = (str + "").trim(); - if(Number(str).toString() === str) throw "Number format"; - return JSON.parse(str); - } catch(err) { - if(defaultVal === undefined) { - console.warn("Can't parse JSON: " + str); - } + if(str && Number(str).toString() !== str) { + try { + str = (str + "").trim(); + return JSON.parse(str); + } catch(err) {} + } + + if(arguments.length === 1) { + console.warn("Can't parse JSON: " + str); } + return defaultVal === undefined ? null : defaultVal; }; http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertCtrl.js ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertCtrl.js b/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertCtrl.js index b5eba07..eeea083 100644 --- a/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertCtrl.js +++ b/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertCtrl.js @@ -58,6 +58,25 @@ }); // ====================================================================================== + // = Stream = + // ====================================================================================== + eagleControllers.controller('alertStreamListCtrl', function ($scope, $wrapState, PageConfig, Application) { + PageConfig.title = "Alert"; + PageConfig.subTitle = "Streams"; + + $scope.streamList = $.map(Application.list, function (app) { + return (app.streams || []).map(function (stream) { + return { + streamId: stream.streamId, + appType: app.descriptor.type, + siteId: app.site.siteId, + schema: stream.schema + }; + }); + }); + }); + + // ====================================================================================== // = Policy = // ====================================================================================== eagleControllers.controller('policyListCtrl', function ($scope, $wrapState, PageConfig, Entity, UI) { http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertEditCtrl.js ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertEditCtrl.js b/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertEditCtrl.js index 3e9d13e..3bcd8d8 100644 --- a/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertEditCtrl.js +++ b/eagle-server/src/main/webapp/app/dev/public/js/ctrls/alertEditCtrl.js @@ -281,9 +281,10 @@ common.deferred.all(publisherPromiseList.concat(policyPromise)).then(function () { $.dialog({ title: "Done", - content: "Click confirm to go to the policy detail page." + content: "Close dialog to go to the policy detail page." + }, function () { + $wrapState.go("policyDetail", {name: $scope.policy.name}); }); - $wrapState.go("policyDetail", {name: $scope.policy.name}); }, function (failedList) { $.dialog({ title: "OPS", http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/public/js/ctrls/integrationCtrl.js ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/public/js/ctrls/integrationCtrl.js b/eagle-server/src/main/webapp/app/dev/public/js/ctrls/integrationCtrl.js index 8674df3..ca6c92e 100644 --- a/eagle-server/src/main/webapp/app/dev/public/js/ctrls/integrationCtrl.js +++ b/eagle-server/src/main/webapp/app/dev/public/js/ctrls/integrationCtrl.js @@ -62,7 +62,7 @@ }; }); - eagleControllers.controller('integrationSiteCtrl', function ($sce, $scope, $wrapState, PageConfig, Entity, UI, Site, Application) { + eagleControllers.controller('integrationSiteCtrl', function ($sce, $scope, $wrapState, $interval, PageConfig, Entity, UI, Site, Application) { PageConfig.title = "Site"; PageConfig.subTitle = $wrapState.param.id; @@ -77,6 +77,9 @@ }); return; } + console.log("[Site]", $scope.site); + + $scope.siteName = $scope.site.siteId + ($scope.site.siteName ? "(" + $scope.site.siteName + ")" : ""); // Map applications function mapApplications() { @@ -94,9 +97,9 @@ mapApplications(); // Application refresh - function refreshApplications() { + var refreshApplications = $scope.refreshApplications = function() { Application.reload().getPromise().then(mapApplications); - } + }; // Application status class $scope.getAppStatusClass = function (application) { @@ -124,6 +127,9 @@ // Application detail $scope.showAppDetail = function (application) { + $("a[data-id='introTab']").click(); + + $scope.tmpApp = application; application = application.origin; var docs = application.docs || {install: "", uninstall: ""}; $scope.application = application; @@ -167,11 +173,12 @@ $scope.removeField = function (field) { $scope.tmpAppConfigFields = common.array.remove(field, $scope.tmpAppConfigFields); + delete $scope.tmpApp.configuration[field.name]; }; $scope.checkFields = function () { var pass = true; - var config = common.getValueByPath($scope, ["tmpApp", "configuration"]); + var config = common.getValueByPath($scope, ["tmpApp", "configuration"], {}); $.each($scope.tmpAppConfigFields, function (i, field) { if(field.required && !config[field.name]) { pass = false; @@ -184,38 +191,86 @@ $scope.installAppConfirm = function () { $scope.installLock = true; - Entity.create("apps/install", $scope.tmpApp)._then(function () { - refreshApplications(); - $("#installMDL").modal("hide"); - }, function (res) { - $.dialog({ - title: "OPS", - content: res.data.message + var uuid = $scope.tmpApp.uuid; + delete $scope.tmpApp.uuid; + + if(uuid) { + Entity.create("apps/" + uuid, $scope.tmpApp)._then(function () { + refreshApplications(); + $("#installMDL").modal("hide"); + }, function (res) { + $.dialog({ + title: "OPS", + content: res.data.message + }); + $scope.installLock = false; }); - $scope.installLock = false; - }); + } else { + Entity.create("apps/install", $scope.tmpApp)._then(function () { + refreshApplications(); + $("#installMDL").modal("hide"); + }, function (res) { + $.dialog({ + title: "OPS", + content: res.data.message + }); + $scope.installLock = false; + }); + } }; // Install application - $scope.installApp = function (application) { + $scope.installApp = function (application, entity) { + entity = entity || {}; application = application.origin; $scope.installLock = false; $scope.application = application; $scope.tmpApp = { - siteId: $scope.site.siteId, - appType: application.type, mode: "CLUSTER", jarPath: application.jarPath, configuration: {} }; - $scope.tmpAppConfigFields = common.getValueByPath(application, "configuration.properties", []); - $.each($scope.tmpAppConfigFields, function (i, field) { + if(!entity.uuid) { + common.merge($scope.tmpApp, { + siteId: $scope.site.siteId, + appType: application.type + }); + } + + var fields = $scope.tmpAppConfigFields = common.getValueByPath(application, "configuration.properties", []).concat(); + + $.each(fields, function (i, field) { $scope.tmpApp.configuration[field.name] = field.value; }); + // Fill miss field of entity + common.merge($scope.tmpApp, entity); + $.each(entity.configuration || {}, function (key) { + if(!common.array.find(key, fields, ["name"])) { + fields.push({ + name: key, + _customize: true, + required: true + }); + } + }); + + // Dependencies check + var missDep = false; + $.each(application.dependencies, function (i, dep) { + if(!Application.find(dep.type, $scope.site.siteId)[0]) { + missDep = true; + return false; + } + }); + $("#installMDL").modal(); - $("a[data-id='configTab']").click(); + if(missDep) { + $("a[data-id='guideTab']").click(); + } else { + $("a[data-id='configTab']").click(); + } }; // Uninstall application @@ -229,6 +284,9 @@ }); }; + // ================================================================ + // = Management = + // ================================================================ // Start application $scope.startApp = function (application) { Entity.post("apps/start", { uuid: application.uuid })._then(function () { @@ -242,6 +300,26 @@ refreshApplications(); }); }; + + $scope.editApp = function (application) { + var type = application.descriptor.type; + var provider = Application.findProvider(type); + + $scope.installApp({origin: provider}, { + mode: application.mode, + jarPath: application.jarPath, + uuid: application.uuid, + configuration: $.extend({}, application.configuration) + }); + }; + + // ================================================================ + // = Sync = + // ================================================================ + var refreshInterval = $interval(refreshApplications, 1000 * 60); + $scope.$on('$destroy', function() { + $interval.cancel(refreshInterval); + }); }); // ====================================================================================== @@ -259,23 +337,4 @@ $("#appMDL").modal(); }; }); - - // ====================================================================================== - // = Stream = - // ====================================================================================== - eagleControllers.controller('integrationStreamListCtrl', function ($scope, $wrapState, PageConfig, Application) { - PageConfig.title = "Integration"; - PageConfig.subTitle = "Streams"; - - $scope.streamList = $.map(Application.list, function (app) { - return (app.streams || []).map(function (stream) { - return { - streamId: stream.streamId, - appType: app.descriptor.type, - siteId: app.site.siteId, - schema: stream.schema - }; - }); - }); - }); }()); http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/public/js/index.js ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/public/js/index.js b/eagle-server/src/main/webapp/app/dev/public/js/index.js index 906479f..633832e 100644 --- a/eagle-server/src/main/webapp/app/dev/public/js/index.js +++ b/eagle-server/src/main/webapp/app/dev/public/js/index.js @@ -26,7 +26,7 @@ var _app = {}; if(localStorage) { _host = localStorage.getItem("host") || ""; - _app = common.parseJSON(localStorage.getItem("app") || "") || {}; + _app = common.parseJSON(localStorage.getItem("app"), {}); } window._host = function (host) { @@ -51,6 +51,13 @@ return _app; }; + window._app.clear = function () { + if(localStorage) { + _app = {}; + localStorage.removeItem("app"); + } + }; + // ====================================================================================== // = Register = // ====================================================================================== http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/public/js/services/applicationSrv.js ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/public/js/services/applicationSrv.js b/eagle-server/src/main/webapp/app/dev/public/js/services/applicationSrv.js index fac44f9..31c6fb6 100644 --- a/eagle-server/src/main/webapp/app/dev/public/js/services/applicationSrv.js +++ b/eagle-server/src/main/webapp/app/dev/public/js/services/applicationSrv.js @@ -57,6 +57,10 @@ }); }); + Application.findProvider = function (type) { + return common.array.find(type, Application.providerList, ["type"]); + }; + Application.getPromise = function () { return Application.list._promise.then(function() { return Application; http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/1d0f9f5b/eagle-server/src/main/webapp/app/dev/public/js/services/pageSrv.js ---------------------------------------------------------------------- diff --git a/eagle-server/src/main/webapp/app/dev/public/js/services/pageSrv.js b/eagle-server/src/main/webapp/app/dev/public/js/services/pageSrv.js index 732f820..04e3b77 100644 --- a/eagle-server/src/main/webapp/app/dev/public/js/services/pageSrv.js +++ b/eagle-server/src/main/webapp/app/dev/public/js/services/pageSrv.js @@ -49,15 +49,15 @@ ]},*/ {name: "Alert", icon: "bell", list: [ {name: "Explore Alerts", path: "#/alert/"}, - {name: "Manage Policies", path: "#/alert/policyList"}, + {name: "Policies", path: "#/alert/policyList"}, + {name: "Streams", path: "#/alert/streamList"}, {name: "Define Policy", path: "#/alert/policyCreate"} ]} ]; var adminPortalList = [ {name: "Integration", icon: "puzzle-piece", list: [ {name: "Sites", path: "#/integration/siteList"}, - {name: "Applications", path: "#/integration/applicationList"}, - {name: "Streams", path: "#/integration/streamList"} + {name: "Applications", path: "#/integration/applicationList"} ]} ];