eagle-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From h..@apache.org
Subject [5/7] incubator-eagle git commit: EAGLE-139 EAGLE-163 Eagle UI Modularization and fix bugs in policy extensions
Date Thu, 25 Feb 2016 10:25:21 GMT
http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/d37643b0/eagle-webservice/src/main/webapp/app/partials/dam/siteList.html
----------------------------------------------------------------------
diff --git a/eagle-webservice/src/main/webapp/app/partials/dam/siteList.html b/eagle-webservice/src/main/webapp/app/partials/dam/siteList.html
deleted file mode 100644
index 44fad6f..0000000
--- a/eagle-webservice/src/main/webapp/app/partials/dam/siteList.html
+++ /dev/null
@@ -1,162 +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="page-fixed">
-	<button class="btn btn-primary"
-		ng-disabled="dataSrcList._promise.$$state.status !== 1"
-		ng-click="showSiteEditor()"
-	>+ New Site</button>
-</div>
-
-<div class="box box-primary" ng-repeat="_site in site.list">
-	<div class="box-header">
-		<h3 class="box-title">{{_site.name}}</h3>
-		<div class="box-tools pull-right">
-			<button class="btn btn-box-tool" data-widget="collapse">
-				<i class="fa fa-minus"></i>
-			</button>
-			<div class="btn-group">
-				<button class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown">
-					<i class="fa fa-wrench"></i>
-				</button>
-				<ul class="dropdown-menu" role="menu">
-					<li>
-						<a ng-click="showSiteEditor(_site)"><span class="fa fa-cog"></span> Config</a>
-					</li>
-					<li class="divider"></li>
-					<li class="danger">
-						<a ng-click="deleteSite(_site)"><span class="fa fa-trash-o"></span> Delete Site</a>
-					</li>
-				</ul>
-			</div>
-		</div>
-	</div><!-- /.box-header -->
-	<div class="box-body">
-		<div class="row">
-			<div class="col-md-4" ng-repeat="dataSrc in _site.dataSrcList">
-				<div class="info-box" ng-class="dataSrc.enabled !== false ? 'bg-aqua' : 'bg-gray'">
-					<span class="info-box-icon"><i class="fa fa-suitcase"></i></span>
-					<div class="info-box-content">
-						<a class="fa fa-cog config pull-right" ng-click="showDataSourceEditor(dataSrc)"></a>
-						<span class="info-box-text">{{dataSrc.desc || dataSrc.tags.dataSource}}</span>
-
-						<span class="info-box-number" ng-show="dataSrc.hide"><small>-</small></span>
-						<a class="info-box-number" ng-show="!dataSrc.hide" ng-click="site.url(_site, '/dam/policyList/' + dataSrc.tags.dataSource);">
-							<span class="fa fa-refresh fa-spin" ng-hide="policyStatistic._promise.$$state.status === 1"></span>
-							<span ng-show="policyStatistic._promise.$$state.status === 1">{{getPolicyCount(_site.name, dataSrc.tags.dataSource)}}</span>
-							<small>Policies</small>
-						</a>
-						<div class="progress">
-							<div class="progress-bar"></div>
-						</div>
-						<span class="progress-description" ng-show="dataSrc.hide"><small>-</small></span>
-						<a class="progress-description" ng-show="!dataSrc.hide" ng-click="site.url(_site, '/dam/alertList/' + dataSrc.tags.dataSource);">
-							<span class="fa fa-refresh fa-spin" ng-hide="alertStatistic._promise.$$state.status === 1"></span>
-							<span ng-show="alertStatistic._promise.$$state.status === 1">{{getAlertCount(_site.name, dataSrc.tags.dataSource)}}</span>
-							alerts in 30 Days
-						</a>
-					</div><!-- /.info-box-content -->
-				</div>
-			</div>
-		</div>
-	</div>
-</div>
-
-
-
-<!-- Modal: Create / Edit site -->
-<div class="modal fade" id="siteMDL" tabindex="-1" role="dialog">
-	<div class="modal-dialog" role="document">
-		<div class="modal-content">
-			<div class="modal-header">
-				<button type="button" class="close" data-dismiss="modal" aria-label="Close">
-					<span aria-hidden="true">&times;</span>
-				</button>
-				<h4 class="modal-title">{{!_siteEntity.srcSite ? 'Create' : 'Config'}} Site</h4>
-			</div>
-			<div class="modal-body">
-				<div class="form-group">
-					<label>* Site Name</label>
-					<input type="text" class="form-control" placeholder="Site name..." ng-model="_siteEntity.name" ng-disabled="!!_siteEntity.srcSite" id="siteName">
-				</div>
-
-				<label>
-					* Data Source
-					<small class="text-muted">at least select 1 source</small>
-				</label>
-				<div class="checkbox" ng-repeat="item in _siteEntity.dataSrcList">
-					<label>
-						<input type="checkbox" value="{{item.name}}"
-						ng-checked="item.enabled"
-						ng-click="item.enabled = !item.enabled">
-						{{item.name}}
-					</label>
-				</div>
-			</div>
-			<div class="modal-footer">
-				<button type="button" class="btn btn-default" data-dismiss="modal">
-					Close
-				</button>
-				<button type="button" class="btn btn-primary" ng-click="confirmUpateSite()"
-				ng-disabled="!checkUpdateSite()">
-					{{!_siteEntity.srcSite ? 'Create' : 'Update'}}
-				</button>
-			</div>
-		</div>
-	</div>
-</div>
-
-<!-- Modal: Edit data source -->
-<div class="modal fade" id="dataSrcMDL" tabindex="-1" role="dialog">
-	<div class="modal-dialog" role="document">
-		<div class="modal-content">
-			<div class="modal-header">
-				<button type="button" class="close" data-dismiss="modal" aria-label="Close">
-					<span aria-hidden="true">&times;</span>
-				</button>
-				<h4 class="modal-title">{{_dataSrcEntity.tags.dataSource}}</h4>
-			</div>
-			<div class="modal-body">
-				<div class="checkbox">
-					<label>
-						<input type="checkbox"
-						ng-checked="_dataSrcEntity.enabled"
-						ng-click="_dataSrcEntity.enabled = !_dataSrcEntity.enabled">
-						Enabled
-					</label>
-				</div>
-
-				<div class="form-group">
-					<label>Configuration</label>
-					<textarea type="text" class="form-control" placeholder="Data source configuration..." ng-model="_dataSrcEntity.config" id="dataSrcConfig" rows="10"></textarea>
-				</div>
-			</div>
-			<div class="modal-footer">
-				<button type="button" class="btn btn-danger pull-left" ng-click="confirmDeleteDataSource()">
-					Delete Source
-				</button>
-
-				<button type="button" class="btn btn-default" data-dismiss="modal">
-					Close
-				</button>
-				<button type="button" class="btn btn-primary" ng-click="confirmUpateDataSource()" ng-disabled="_dataSrcEntityLock">
-					Update
-				</button>
-			</div>
-		</div>
-	</div>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/d37643b0/eagle-webservice/src/main/webapp/app/partials/dam/streamList.html
----------------------------------------------------------------------
diff --git a/eagle-webservice/src/main/webapp/app/partials/dam/streamList.html b/eagle-webservice/src/main/webapp/app/partials/dam/streamList.html
deleted file mode 100644
index 251bc46..0000000
--- a/eagle-webservice/src/main/webapp/app/partials/dam/streamList.html
+++ /dev/null
@@ -1,179 +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="page-fixed">
-	<button class="btn btn-primary"
-		ng-if="auth.isRole('ROLE_ADMIN')"
-		ng-click="showStreamEditor()"
-	>+ New Stream</button>
-</div>
-
-<p ng-show="streamList._promise.$$state.status !== 1">
-	<span class="fa fa-refresh fa-spin"> </span>
-	Loading...
-</p>
-
-<div class="box box-primary" ng-repeat="stream in streams">
-	<div class="box-header with-border">
-		<h3 class="box-title">{{stream.tags.streamName}}</h3>
-		<div class="box-tools pull-right">
-			<button class="btn btn-box-tool" data-widget="collapse">
-				<i class="fa fa-minus"></i>
-			</button>
-			<button class="btn btn-box-tool" ng-click="showStreamEditor(stream)" ng-if="auth.isRole('ROLE_ADMIN')">
-				<i class="fa fa-wrench"></i>
-			</button>
-		</div>
-	</div>
-	<div class="box-body">
-		<div class="inline-group">
-			<dl>
-				<dt>
-					Data Source
-				</dt>
-				<dd>
-					{{stream.tags.dataSource}}
-				</dd>
-			</dl>
-			<dl>
-				<dt>
-					Stream Name
-				</dt>
-				<dd>
-					{{stream.tags.streamName}}
-				</dd>
-			</dl>
-		</div>
-		<div>
-			<dl>
-				<dt>
-					Description
-				</dt>
-				<dd>
-					{{stream.desc}}
-				</dd>
-			</dl>
-		</div>
-
-		<p ng-show="streamSchemaList._promise.$$state.status !== 1">
-			<span class="fa fa-refresh fa-spin"> </span>
-			Loading...
-		</p>
-
-		<div class="list" ng-show="streamSchemaList._promise.$$state.status === 1">
-			<table class="table table-bordered">
-				<thead>
-					<tr>
-						<th width="10%">Attribute Name</th>
-						<th width="12%">Display Name</th>
-						<th width="8%">Type</th>
-						<th>Description</th>
-					</tr>
-				</thead>
-				<tbody>
-					<tr ng-repeat="meta in stream.metaList">
-						<td>{{meta.tags.attrName}}</td>
-						<td>{{meta.attrDisplayName}}</td>
-						<td><span class="label label-warning">{{meta.attrType}}</span></td>
-						<td>{{meta.attrDescription}}</td>
-					</tr>
-				</tbody>
-			</table>
-		</div>
-	</div><!-- /.box-body -->
-	<!-- Loading (remove the following to stop the loading)-->
-</div>
-
-
-
-
-
-
-<!-- Modal: Create / Edit stream -->
-<div class="modal fade" id="streamMDL" tabindex="-1" role="dialog">
-	<div class="modal-dialog modal-lg" role="document">
-		<div class="modal-content">
-			<div class="modal-header">
-				<button type="button" class="close" data-dismiss="modal" aria-label="Close">
-					<span aria-hidden="true">&times;</span>
-				</button>
-				<h4 class="modal-title">{{!_streamEntity.srcStream ? 'Create' : 'Config'}} Stream</h4>
-			</div>
-			<div class="modal-body">
-				<div class="form-group">
-					<label>* Data Source</label>
-					<input type="text" class="form-control" placeholder="Data source..." ng-model="_streamEntity.dataSource"
-							ng-class="{'has-warning': !_streamEntity.dataSource}" ng-disabled="!!_streamEntity.srcStream" id="dataSource">
-				</div>
-
-				<div class="form-group">
-					<label>* Stream Name</label>
-					<input type="text" class="form-control" placeholder="Stream name..." ng-model="_streamEntity.streamName"
-							ng-class="{'has-warning': !_streamEntity.streamName}" ng-disabled="!!_streamEntity.srcStream">
-				</div>
-
-				<div class="form-group">
-					<label>Description</label>
-					<textarea class="form-control" placeholder="Description..." ng-model="_streamEntity.desc"></textarea>
-				</div>
-
-				<label>
-					* Data Source Schema
-				</label>
-				<table class="table table-bordered">
-					<thead>
-						<tr>
-							<th width="26"> </th>
-							<th width="15%">Attribute Name</th>
-							<th width="15%">Display Name</th>
-							<th width="15%">Type</th>
-							<th>Description</th>
-						</tr>
-					</thead>
-					<tbody>
-						<tr ng-repeat="meta in _streamEntity.metaList">
-							<td class="input-field text-center">
-								<a class="fa fa-trash-o text-danger" ng-click="deleteMeta(meta)"></a>
-							</td>
-							<td class="input-field"><input type="text" class="form-control" ng-class="{'has-warning': !meta.attrName}" ng-model="meta.attrName" /></td>
-							<td class="input-field"><input type="text" class="form-control" ng-model="meta.attrDisplayName" /></td>
-							<td class="input-field">
-								<select class="form-control" ng-model="meta.attrType">
-									<option ng-repeat="type in ['string','bool','long','integer','double','float']">{{type}}</option>
-								</select>
-							</td>
-							<td class="input-field"><input type="text" class="form-control" ng-model="meta.attrDescription" /></td>
-						</tr>
-					</tbody>
-				</table>
-				<a ng-click="_streamEntity.metaList.push({attrName: '', attrType: 'string'})">+ Add Schema Item</a>
-			</div>
-			<div class="modal-footer">
-				<button type="button" class="btn btn-danger pull-left" ng-show="_streamEntity.srcStream" ng-click="confirmDeleteStream()" ng-disabled="!checkUpdateStream()">
-					Delete
-				</button>
-
-				<button type="button" class="btn btn-default" data-dismiss="modal">
-					Close
-				</button>
-				<button type="button" class="btn btn-primary" ng-click="confirmUpateStream()" ng-disabled="!checkUpdateStream()">
-					{{!_streamEntity.srcStream ? 'Create' : 'Update'}}
-				</button>
-			</div>
-		</div>
-	</div>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/d37643b0/eagle-webservice/src/main/webapp/app/partials/dam/summary.html
----------------------------------------------------------------------
diff --git a/eagle-webservice/src/main/webapp/app/partials/dam/summary.html b/eagle-webservice/src/main/webapp/app/partials/dam/summary.html
deleted file mode 100644
index 5a44551..0000000
--- a/eagle-webservice/src/main/webapp/app/partials/dam/summary.html
+++ /dev/null
@@ -1,45 +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.
-  -->
-<p ng-show="!dataReady">
-	<span class="fa fa-refresh fa-spin"> </span>
-	Loading...
-</p>
-
-<div class="row">
-	<div class="col-md-4" ng-repeat="dataSrc in site.current().dataSrcList" ng-hide="dataSrc.hide">
-		<div class="small-box bg-aqua box-clickable" ng-click="site.url('/dam/policyList/' + dataSrc.tags.dataSource)">
-			<div class="inner">
-				<h3>
-					{{dataSrc.desc || dataSrc.tags.dataSource}}
-				</h3>
-				<p>
-					{{dataSrc.count || 0}} Policies
-				</p>
-			</div>
-			<div class="icon">
-				<i class="fa fa-arrow-circle-right"></i>
-			</div>
-			<span class="small-box-footer">
-				<i class="fa fa-arrow-circle-right"></i>
-				View Policy List
-			</span>
-		</div>
-	</div>
-</div>
-
-<a class="btn btn-primary" href="#/dam/policyCreate" ng-show="auth.isRole('ROLE_ADMIN')">+ New Policy</a>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/d37643b0/eagle-webservice/src/main/webapp/app/partials/dam/userProfileDetail.html
----------------------------------------------------------------------
diff --git a/eagle-webservice/src/main/webapp/app/partials/dam/userProfileDetail.html b/eagle-webservice/src/main/webapp/app/partials/dam/userProfileDetail.html
deleted file mode 100644
index 7c6e19a..0000000
--- a/eagle-webservice/src/main/webapp/app/partials/dam/userProfileDetail.html
+++ /dev/null
@@ -1,87 +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 box-primary">
-	<div class="box-header with-border">
-		<i class="fa fa-user"> </i>
-		<h3 class="box-title">
-			{{user}}
-		</h3>
-	</div>
-	<div class="box-body">
-		<div>
-			<div class="inline-group">
-				<dl><dt>User</dt><dd>{{user}}</dd></dl>
-				<dl><dt>Site</dt><dd>{{site.current().name}}</dd></dl>
-			</div>
-			<div class="inline-group">
-				<dl><dt>Other Info</dt><dd class="text-muted">N/A</dd></dl>
-			</div>
-		</div>
-
-		<div class="overlay" ng-hide="profileList._promise.$$state.status === 1;">
-			<span class="fa fa-refresh fa-spin"></span>
-		</div>
-	</div>
-</div>
-
-<!-- Analysis -->
-<div class="nav-tabs-custom">
-	<ul class="nav nav-tabs">
-		<li class="active">
-			<a href="[data-id='DE']" data-toggle="tab" ng-click=" currentTab='DE'">DE</a>
-		</li>
-		<li>
-			<a href="[data-id='EigenDecomposition']" data-toggle="tab" ng-click=" currentTab='EigenDecomposition'">EigenDecomposition</a>
-		</li>
-		<li class="pull-right">
-			<button class="btn btn-primary" ng-click="showRawData(currentTab === 'EigenDecomposition' ? profiles.EigenDecomposition.content : profiles.DE.content)">Raw Data</button>
-		</li>
-	</ul>
-	<div class="tab-content">
-		<div class="tab-pane active" data-id="DE">
-			<div class="row">
-				<div class="col-md-9">
-					<div nvd3="profiles.DE._chart.series" data-config="{chart: 'column', xType: 'text', height: 400}" class="nvd3-chart-cntr" height="400"></div>
-					<div class="inline-group text-center">
-						<dl ng-repeat="(key, value) in profiles.DE.estimates"><dt>{{key}}</dt><dd>{{value}}</dd></dl>
-					</div>
-				</div>
-
-				<div class="col-md-3">
-					<table class="table table-bordered">
-						<thead>
-							<tr>
-								<th>Command</th>
-								<th>Percentage</th>
-							</tr>
-						</thead>
-						<tbody>
-							<tr ng-repeat="unit in profiles.DE.meanList">
-								<td>{{unit.command}}</td>
-								<td class="text-right">{{(unit.percentage*100).toFixed(2)}}%</td>
-							</tr>
-						</tbody>
-					</table>
-				</div>
-			</div>
-		</div><!-- /.tab-pane -->
-		<div class="tab-pane" data-id="EigenDecomposition">
-			<div line3d-chart height="400" data="profiles.EigenDecomposition._chart.series"> </div>
-		</div><!-- /.tab-pane -->
-	</div><!-- /.tab-content -->
-</div>

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/d37643b0/eagle-webservice/src/main/webapp/app/partials/dam/userProfileList.html
----------------------------------------------------------------------
diff --git a/eagle-webservice/src/main/webapp/app/partials/dam/userProfileList.html b/eagle-webservice/src/main/webapp/app/partials/dam/userProfileList.html
deleted file mode 100644
index 8c0021a..0000000
--- a/eagle-webservice/src/main/webapp/app/partials/dam/userProfileList.html
+++ /dev/null
@@ -1,138 +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 box-primary">
-	<div class="box-header with-border">
-		<i class="fa fa-list-alt"> </i>
-		<h3 class="box-title">
-			User Profiles
-			<small><a data-toggle="collapse" href="[data-id='algorithms']">Detail</a></small>
-		</h3>
-		<div class="pull-right">
-			<a class="label label-primary" ng-class="runningTaskCount() ? 'label-primary' : 'label-default'" data-toggle="modal" data-target="#taskMDL">Update</a>
-		</div>
-	</div>
-	<div class="box-body">
-		<!-- Algorithms -->
-		<div data-id="algorithms" class="collapse">
-			<table class="table table-bordered">
-				<thead>
-					<tr>
-						<th>Name</th>
-						<td>Feature</td>
-					</tr>
-				</thead>
-				<tbody>
-					<tr ng-repeat="algorithm in algorithmEntity.policy.algorithms">
-						<td>{{algorithm.name}}</td>
-						<td>{{algorithm.features}}</td>
-					</tr>
-				</tbody>
-			</table>
-			<hr/>
-		</div>
-
-		<!-- User Profile List -->
-		<p ng-show="profileList._promise.$$state.status !== 1">
-			<span class="fa fa-refresh fa-spin"> </span>
-			Loading...
-		</p>
-
-		<div sorttable source="profileList" ng-show="profileList._promise.$$state.status === 1">
-			<table class="table table-bordered" ng-non-bindable>
-				<thead>
-					<tr>
-						<th width="10%" sortpath="user">User</th>
-						<th>Most Predominat Feature</th>
-						<th width="10"></th>
-					</tr>
-				</thead>
-				<tbody>
-					<tr>
-						<td>
-							<a href="#/dam/userProfileDetail/{{item.user}}">{{item.user}}</a>
-						</td>
-						<td>
-							{{item.DE.topCommands.slice(0,3).join(", ")}}
-						</td>
-						<td>
-							<a href="#/dam/userProfileDetail/{{item.user}}">Detail</a>
-						</td>
-					</tr>
-				</tbody>
-			</table>
-		</div>
-	</div>
-</div>
-
-<!-- Modal: User profile Schedule Task -->
-<div class="modal fade" id="taskMDL" tabindex="-1" role="dialog">
-	<div class="modal-dialog modal-lg" role="document">
-		<div class="modal-content">
-			<div class="modal-header">
-				<button type="button" class="close" data-dismiss="modal" aria-label="Close">
-					<span aria-hidden="true">&times;</span>
-				</button>
-				<h4 class="modal-title">Training History</h4>
-			</div>
-			<div class="modal-body">
-				<div sorttable source="tasks">
-					<table class="table table-bordered" ng-non-bindable>
-						<thead>
-							<tr>
-								<th sortpath="tags.type">Command</th>
-								<th sortpath="timestamp">Start Time</th>
-								<th sortpath="updateTime">Update Time</th>
-								<th sortpath="duration">Duration</th>
-								<th sortpath="status">Status</th>
-								<th width="10"> </th>
-							</tr>
-						</thead>
-						<tbody>
-							<tr>
-								<td>{{item.tags.type}}</td>
-								<td>{{common.format.date(item.timestamp) || "--"}}</td>
-								<td>{{common.format.date(item.updateTime) || "--"}}</td>
-								<td>{{item._duration}}</td>
-								<td class="text-nowrap">
-									<span class="fa fa-hourglass-start text-muted" ng-show="item.status === 'INITIALIZED'"></span>
-									<span class="fa fa-hourglass-half text-info" ng-show="item.status === 'PENDING'"></span>
-									<span class="fa fa-circle-o-notch text-primary" ng-show="item.status === 'EXECUTING'"></span>
-									<span class="fa fa-check-circle text-success" ng-show="item.status === 'SUCCEEDED'"></span>
-									<span class="fa fa-exclamation-circle text-danger" ng-show="item.status === 'FAILED'"></span>
-									<span class="fa fa-ban text-muted" ng-show="item.status === 'CANCELED'"></span>
-									{{item.status}}
-								</td>
-								<td>
-									<a ng-click="_parent.showTaskDetail(item)">Detail</a>
-								</td>
-							</tr>
-						</tbody>
-					</table>
-				</div>
-			</div>
-			<div class="modal-footer">
-				<button type="button" class="btn btn-primary pull-left" ng-click="updateTask()" ng-show="auth.isRole('ROLE_ADMIN')">
-					Update Now
-				</button>
-				<button type="button" class="btn btn-default" data-dismiss="modal">
-					Close
-				</button>
-			</div>
-		</div>
-	</div>
-</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/d37643b0/eagle-webservice/src/main/webapp/app/partials/landing.html
----------------------------------------------------------------------
diff --git a/eagle-webservice/src/main/webapp/app/partials/landing.html b/eagle-webservice/src/main/webapp/app/partials/landing.html
new file mode 100644
index 0000000..c90d97c
--- /dev/null
+++ b/eagle-webservice/src/main/webapp/app/partials/landing.html
@@ -0,0 +1,12 @@
+<p class="lead">
+	<span ng-if="!Application.current()">Current site do not use any application.</span>
+	<span ng-if="Application.current()">Current application do not install any feature.</span>
+
+	<span ng-if="Auth.isRole('ROLE_ADMIN')">
+		Click
+		<a href="#/config/site" ng-if="!Application.current()">here</a>
+		<a href="#/config/application" ng-if="Application.current()">here</a>
+		to configure.
+	</span>
+	<span ng-if="!Auth.isRole('ROLE_ADMIN')">Please contact your admin.</span>
+</p>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/d37643b0/eagle-webservice/src/main/webapp/app/partials/login.html
----------------------------------------------------------------------
diff --git a/eagle-webservice/src/main/webapp/app/partials/login.html b/eagle-webservice/src/main/webapp/app/partials/login.html
new file mode 100644
index 0000000..112a76c
--- /dev/null
+++ b/eagle-webservice/src/main/webapp/app/partials/login.html
@@ -0,0 +1,49 @@
+<!--
+  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="login-box">
+	<div class="login-logo">
+		<a href="#/">Apache Eagle</a>
+	</div>
+	<!-- /.login-logo -->
+	<div class="login-box-body">
+		<p class="login-box-msg">Sign in to start your session</p>
+		<div class="form-group has-feedback">
+			<input type="text" class="form-control" placeholder="User Name" ng-model="username" ng-keypress="login($event)" autocomplete="off" id="username">
+			<span class="glyphicon glyphicon-user form-control-feedback"></span>
+		</div>
+		<div class="form-group has-feedback">
+			<input type="password" class="form-control" placeholder="Password" ng-model="password" ng-keypress="login($event)">
+			<span class="glyphicon glyphicon-lock form-control-feedback"></span>
+		</div>
+		<div class="row">
+			<div class="col-xs-8">
+				<!--div class="checkbox">
+					<label> <input type="checkbox" /> Remember Me
+					</label>
+				</div-->
+			</div>
+			<!-- /.col -->
+			<div class="col-xs-4">
+				<button class="btn btn-primary btn-block btn-flat" ng-click="login($event, true)" ng-disabled="lock">Sign In</button>
+			</div>
+			<!-- /.col -->
+		</div>
+	</div>
+	<!-- /.login-box-body -->
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/d37643b0/eagle-webservice/src/main/webapp/app/public/css/animation.css
----------------------------------------------------------------------
diff --git a/eagle-webservice/src/main/webapp/app/public/css/animation.css b/eagle-webservice/src/main/webapp/app/public/css/animation.css
new file mode 100644
index 0000000..954bd29
--- /dev/null
+++ b/eagle-webservice/src/main/webapp/app/public/css/animation.css
@@ -0,0 +1,46 @@
+@CHARSET "UTF-8";
+/*
+ * 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.
+ */
+
+[ui-view].ng-enter, [ui-view].ng-leave {
+	position: absolute;
+	left: 0;
+	right: 0;
+	-webkit-transition: all .5s ease-in-out;
+	-moz-transition: all .5s ease-in-out;
+	-o-transition: all .5s ease-in-out;
+	transition: all .3s ease-in-out;
+}
+
+[ui-view].ng-enter {
+	opacity: 0;
+}
+
+[ui-view].ng-enter-active {
+	opacity: 1;
+}
+
+[ui-view].ng-leave {
+	opacity: 1;
+	transform:translate3d(0, 0, 0);
+}
+
+[ui-view].ng-leave-active {
+	opacity: 0;
+	transform:translate3d(20%, 0, 0);
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/d37643b0/eagle-webservice/src/main/webapp/app/public/css/main.css
----------------------------------------------------------------------
diff --git a/eagle-webservice/src/main/webapp/app/public/css/main.css b/eagle-webservice/src/main/webapp/app/public/css/main.css
index 5e80728..2e951f2 100644
--- a/eagle-webservice/src/main/webapp/app/public/css/main.css
+++ b/eagle-webservice/src/main/webapp/app/public/css/main.css
@@ -43,11 +43,12 @@ body.no-sidebar .content-wrapper {
 	margin-top: 10px;
 }
 
-/* Common */
+	/* Common */
 a {
 	cursor: pointer;
 }
 
+/* Table */
 .table.table-sm>tbody>tr>td,
 .table.table-sm>tbody>tr>th,
 .table.table-sm>tfoot>tr>td,
@@ -148,41 +149,7 @@ a {
 	margin: 5px 0 10px 0;
 }
 
-
-body .tooltip-inner {
-	max-width: 500px;
-}
-
-.text-nowrap {
-	white-space: nowrap;
-}
-
-.text-ellipsis,
-.label.text-ellipsis {
-	overflow:hidden;
-	text-overflow:ellipsis;
-	display: inline-block;
-	white-space: nowrap;
-	max-width: 100%;
-}
-td.text-ellipsis {
-	display: table-cell;
-}
-
-.btn.btn-xs.sm {
-	font-size: 12px;
-	padding: 2px 6px;
-}
-
-.noSelect {
-	-khtml-user-select: none;
-	-moz-user-select: none;
-	-ms-user-select: none;
-	user-select: none;
-	-webkit-touch-callout: none;
-	-webkit-user-select: none;
-}
-
+/* inline group */
 .inline-group dl,
 .inline-group dl dt,
 .inline-group dl dd {
@@ -206,6 +173,7 @@ td.text-ellipsis {
 	margin-right: 5px;
 }
 
+/* Search box */
 .search-box {
 	position: relative;
 	margin-bottom: 15px;
@@ -327,6 +295,13 @@ ul.nav.nav-tabs li .btn {
 	background: #dd4b39;
 }
 
+.dropdown-submenu{position:relative;}
+.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;}
+.dropdown-submenu:hover>.dropdown-menu{display:block;}
+.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;}
+.dropdown-submenu:hover>a:after{border-left-color:#ffffff;}
+.dropdown-submenu.pull-left{float:none;}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;}
+
 /* Input Group */
 .input-group .input-group-btn select {
 	width: auto;
@@ -405,6 +380,55 @@ ul.tree.tree-bordered > li > ul > li > a {
 	padding: 8px 8px 8px 30px;
 }
 
+.product-list-in-box > .item {
+	-webkit-transition: background .5s linear;
+	-o-transition: background .5s linear;
+	transition: background .5s linear;
+}
+.product-list-in-box > .item.ng-animate {
+	transition: 0s;
+}
+.product-list-in-box > .item.active {
+	background: #F5FAFC;
+	-webkit-transition: none;
+	-o-transition: none;
+	transition: none;
+}
+
+.products-list.fixed-height {
+	height: 402px;
+	overflow-y: auto;
+}
+
+.products-list .product-operation {
+	float: left;
+	border: 1px solid #9EC8E0;
+	border-radius: 5px;
+	overflow: hidden;
+}
+
+.products-list .product-operation .fa {
+	display: block;
+	padding: 4px 16px;
+	color: #3c8dbc;
+}
+.products-list .product-operation a.fa:hover {
+	color: #FFFFFF;
+	background: #337ab7;
+}
+
+.products-list .product-operation.single .fa {
+	padding: 12px 12px;
+	font-size: 20px;
+}
+
+.products-list .item .product-info a.fa.fa-times {
+	display: none;
+}
+.products-list .item:hover .product-info a.fa.fa-times {
+	display: block;
+}
+
 /* Label */
 .label.label-default {
 	color: #FFFFFF;
@@ -421,24 +445,6 @@ ul.tree.tree-bordered > li > ul > li > a {
 	height: 200px;
 }
 
-/*.chart .chart-header h3 {
-	text-align: center;
-	margin: 10px 0 5px 0;
-}
-.chart .chart-body {
-	height: 200px;
-}
-
-.chart .chart-body .axis path, .axis line {
-	fill: none;
-	stroke: #000;
-	shape-rendering: crispEdges;
-}
-
-.chart .chart-body .bar {
-	fill: steelblue;
-}*/
-
 /* Tab */
 body .tab-content>.tab-pane {
 	display: block;
@@ -448,7 +454,18 @@ body .tab-content>.tab-pane {
 }
 body .tab-content>.tab-pane.active {
 	height: auto;
-	overflow-y: auto;
+	overflow-x: visible;
+	overflow-y: visible;
+}
+
+body .box-body .nav-pills > li > a {
+	padding: 5px 15px;
+	border: none;
+}
+
+/* Box */
+.box .guideline {
+	margin-top: 0;
 }
 
 /* Customize */
@@ -474,8 +491,36 @@ body .tab-content>.tab-pane.active {
 	z-index: 3;
 }
 
-.main-header .logo .logo-lg small {
-	font-size: 12px;
+.main-header .logo img {
+	height: 34px;
+}
+
+.main-header .navbar-toggle {
+	float: none;
+	border-radius: 0;
+}
+.main-header .navbar-toggle:hover {
+	background: rgba(0, 0, 0, 0.1);
+}
+
+#moduleMenu > ul > li.active > a {
+	border-top: 3px solid rgba(255,255,255,0.8);
+	padding-top: 12px;
+}
+
+@media (max-width: 767px) {
+	#moduleMenu > ul > li.active > a {
+		padding: 10px 15px;
+		border-top: none;
+		border-left: 3px solid rgba(255,255,255,0.8);
+	}
+
+	.main-header .navbar .navbar-custom-menu .nav .dropdown-menu li a {
+		color: #333;
+	}
+	.main-header .navbar .navbar-custom-menu .nav .dropdown-menu li a:hover {
+		color: #FFF;
+	}
 }
 
 #timeRangePickerCntr .navbar-form {
@@ -534,34 +579,37 @@ body .login-box, body .register-box {
 }
 
 
-.content .miao-chart {
-	border: none;
-	margin: 0;
+/* Misc */
+body .tooltip-inner {
+	max-width: 500px;
 }
 
-.content .miao-chart .box .chart-entity-title {
-	height: auto;
-	margin: 0;
+.text-nowrap {
+	white-space: nowrap;
 }
 
-.content .miao-chart .chart-entity-menu {
-	display: block;
-	top: 5px;
-	right: 25px;
+.text-ellipsis,
+.label.text-ellipsis {
+	overflow:hidden;
+	text-overflow:ellipsis;
+	display: inline-block;
+	white-space: nowrap;
+	max-width: 100%;
 }
-
-.content .miao-chart .box .chart-entity-menu {
-	display: block;
-	top: 5px;
-	right: 25px;
-	padding-right: 10px;
-	border-right: 1px solid #f4f4f4;
+td.text-ellipsis {
+	display: table-cell;
 }
 
-.content .miao-chart .box .chart-entity-drillDownPath .drillDownPath {
-	position: static;
+.btn.btn-xs.sm {
+	font-size: 12px;
+	padding: 2px 6px;
 }
 
-.content .miao-chart[data-miao-drilldown-depth='0'] .box .box-footer {
-	display: none;
-}
+.noSelect {
+	-khtml-user-select: none;
+	-moz-user-select: none;
+	-ms-user-select: none;
+	user-select: none;
+	-webkit-touch-callout: none;
+	-webkit-user-select: none;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/d37643b0/eagle-webservice/src/main/webapp/app/public/feature/classification/controller.js
----------------------------------------------------------------------
diff --git a/eagle-webservice/src/main/webapp/app/public/feature/classification/controller.js b/eagle-webservice/src/main/webapp/app/public/feature/classification/controller.js
new file mode 100644
index 0000000..ffb8c92
--- /dev/null
+++ b/eagle-webservice/src/main/webapp/app/public/feature/classification/controller.js
@@ -0,0 +1,269 @@
+/*
+ * 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.
+ */
+
+(function() {
+	'use strict';
+
+	var featureControllers = angular.module('featureControllers');
+	var feature = featureControllers.register("classification");
+
+	// ==============================================================
+	// =                          Function                          =
+	// ==============================================================
+
+	// =============================================================
+	// =                        Sensitivity                        =
+	// =============================================================
+	feature.navItem("sensitivity", "Classification", "user-secret");
+	feature.controller('sensitivity', function(PageConfig, Site, $scope, Application, Entities, UI) {
+		PageConfig.pageTitle = "Data Classification";
+		PageConfig.pageSubTitle = Site.current().tags.site;
+		$scope.ajaxId = Math.random();
+		$scope.viewConfig = Application.current().configObj.view;
+
+		if(!$scope.viewConfig) {
+			$.dialog({
+				title: "OPS",
+				content: "View configuration not defined in Application."
+			});
+			return;
+		}
+
+		// ===================== Function =====================
+		$scope.export = function() {
+			var _data = {};
+			UI.fieldConfirm({title: "Export Classification", confirm: false, size: "large"}, _data, [
+				{name: "Data", field: "data", type: "blob", rows: 20, optional: true, readonly: true}]
+			);
+
+			Entities.queryEntities($scope.viewConfig.service, {site: Site.current().tags.site})._promise.then(function(data) {
+				_data.data = JSON.stringify(data, null, "\t");
+			});
+		};
+
+		$scope.import = function() {
+			UI.fieldConfirm({title: "Import Classification", size: "large"}, {}, [
+				{name: "Data", field: "data", type: "blob", rows: 20, optional: true}
+			], function(entity) {
+				var _list = common.parseJSON(entity.data, false);
+				if(!_list) {
+					return "Invalid JSON format";
+				}
+				if(!$.isArray(_list)) {
+					return "Not an array";
+				}
+			}).then(null, null, function(holder) {
+				Entities.updateEntity($scope.viewConfig.service, common.parseJSON(holder.entity.data, []), {timestamp: false})._promise.then(function() {
+					holder.closeFunc();
+					location.reload();
+				});
+			});
+		};
+
+		$scope.deleteAll = function() {
+			UI.deleteConfirm("All the Classification Data").then(null, null, function(holder) {
+				Entities.deleteEntities($scope.viewConfig.service, {site: Site.current().tags.site})._promise.then(function() {
+					holder.closeFunc();
+					location.reload();
+				});
+			});
+		};
+	});
+
+	// =============================================================
+	// =                    Sensitivity - Folder                   =
+	// =============================================================
+	feature.controller('sensitivityViewFolder', function(Site, $scope, $wrapState, Entities) {
+		$scope.path = $wrapState.param.path || "/";
+		$scope.pathUnitList = [];
+		$scope.items = [];
+
+		// Mark sensitivity
+		$scope._oriItem = {};
+		$scope._markItem = {};
+
+		// ======================= View =======================
+		// Path
+		function _refreshPathUnitList(_path) {
+			var _start,_current, _unitList = [];
+			_path = _path + (_path.match(/\/$/) ? "" : "/");
+			for(_current = _start = 0 ; _current < _path.length ; _current += 1) {
+				if(_path[_current] === "/") {
+					_unitList.push({
+						name: _path.substring(_start, _current + (_current === 0 ? 1 : 0)),
+						path: _path.substring(0, _current === 0 ? 1 : _current)
+					});
+					_start = _current + 1;
+				}
+			}
+			$scope.pathUnitList = _unitList;
+		}
+
+		// Item
+		$scope.updateItems = function(path) {
+			if(path) $scope.path = path;
+
+			$scope.items = Entities.query($scope.viewConfig.api, {site: Site.current().tags.site, path: $scope.path});
+			$scope.items._promise.success(function(data) {
+				Entities.dialog(data, function() {
+					if($scope.path !== "/") $scope.updateItems("/");
+				});
+			});
+			_refreshPathUnitList($scope.path);
+		};
+
+		$scope.getFileName = function(item) {
+			return (item.resource + "").replace(/^.*\//, "");
+		};
+
+		$scope.updateItems($scope.path);
+
+		// =================== Sensitivity ===================
+		$scope.markSensitivity = function(item) {
+			$scope._oriItem = item;
+			$scope._markItem = {
+				prefix: $scope.viewConfig.prefix,
+				tags: {
+					site: Site.current().tags.site
+				},
+				sensitivityType: ""
+			};
+			$scope._markItem.tags[$scope.viewConfig.keys[0]] = item.resource;
+			$("#sensitivityMDL").modal();
+			setTimeout(function() {
+				$("#sensitiveType").focus();
+			}, 500);
+		};
+		$scope.confirmUpateSensitivity = function() {
+			$scope._oriItem.sensitiveType = $scope._markItem.sensitivityType;
+			Entities.updateEntity($scope.viewConfig.service, $scope._markItem, {timestamp: false})._promise.success(function(data) {
+				Entities.dialog(data);
+			});
+			$("#sensitivityMDL").modal('hide');
+		};
+		$scope.unmarkSensitivity = function(item) {
+			$.dialog({
+				title: "Unmark Confirm",
+				content: "Do you want to remove the sensitivity mark on '" + item.resource + "'?",
+				confirm: true
+			}, function(ret) {
+				if(!ret) return;
+
+				var _cond = {site: Site.current().tags.site};
+				_cond[$scope.viewConfig.keys[0]] = item.resource;
+				Entities.deleteEntities($scope.viewConfig.service, _cond);
+
+				item.sensitiveType = null;
+				$scope.$apply();
+			});
+		};
+	});
+
+	// =============================================================
+	// =                    Sensitivity - Table                    =
+	// =============================================================
+	feature.controller('sensitivityViewTable', function(Site, $scope, Entities) {
+		$scope.table = null;
+
+		// Mark sensitivity
+		$scope._oriItem = {};
+		$scope._markItem = {};
+
+		// ======================= View =======================
+		var _fillAttr = function(list, key, target) {
+			list._promise.then(function() {
+				$.each(list, function(i, unit) {
+					unit[key] = unit[target];
+				});
+			});
+		};
+
+		$scope.databases = Entities.query($scope.viewConfig.api.database, {site: Site.current().tags.site});
+		_fillAttr($scope.databases, "database", $scope.viewConfig.mapping.database);
+
+		$scope.loadTables = function(database) {
+			if(database.tables) return;
+			var _qry = {
+				site: Site.current().tags.site
+			};
+			_qry[$scope.viewConfig.mapping.database] = database[$scope.viewConfig.mapping.database];
+			database.tables = Entities.query($scope.viewConfig.api.table, _qry);
+			_fillAttr(database.tables, "table", $scope.viewConfig.mapping.table);
+			_fillAttr(database.tables, "database", $scope.viewConfig.mapping.database);
+		};
+
+		$scope.loadColumns = function(database, table) {
+			$scope.table = table;
+
+			if(table.columns) return;
+			var _qry = {
+				site: Site.current().tags.site
+			};
+			_qry[$scope.viewConfig.mapping.database] = database[$scope.viewConfig.mapping.database];
+			_qry[$scope.viewConfig.mapping.table] = table[$scope.viewConfig.mapping.table];
+			table.columns = Entities.query($scope.viewConfig.api.column, _qry);
+			_fillAttr(table.columns, "column", $scope.viewConfig.mapping.column);
+		};
+
+		// =================== Sensitivity ===================
+		$scope.markSensitivity = function(item, event) {
+			if(event) event.stopPropagation();
+
+			$scope._oriItem = item;
+			$scope._markItem = {
+				prefix: $scope.viewConfig.prefix,
+				tags: {
+					site: Site.current().tags.site
+				},
+				sensitivityType: ""
+			};
+			$scope._markItem.tags[$scope.viewConfig.keys[0]] = item.resource;
+			$("#sensitivityMDL").modal();
+			setTimeout(function() {
+				$("#sensitiveType").focus();
+			}, 500);
+		};
+		$scope.confirmUpateSensitivity = function() {
+			$scope._oriItem.sensitiveType = $scope._markItem.sensitivityType;
+			Entities.updateEntity($scope.viewConfig.service, $scope._markItem, {timestamp: false})._promise.success(function(data) {
+				Entities.dialog(data);
+			});
+			$("#sensitivityMDL").modal('hide');
+		};
+		$scope.unmarkSensitivity = function(item, event) {
+			if(event) event.stopPropagation();
+
+			$.dialog({
+				title: "Unmark Confirm",
+				content: "Do you want to remove the sensitivity mark on '" + item.resource + "'?",
+				confirm: true
+			}, function(ret) {
+				if(!ret) return;
+
+				var _qry = {
+					site: Site.current().tags.site
+				};
+				_qry[$scope.viewConfig.keys[0]] = item.resource;
+				Entities.deleteEntities($scope.viewConfig.service, _qry);
+
+				item.sensitiveType = null;
+				$scope.$apply();
+			});
+		};
+	});
+})();
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/d37643b0/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity.html
----------------------------------------------------------------------
diff --git a/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity.html b/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity.html
new file mode 100644
index 0000000..41fb291
--- /dev/null
+++ b/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity.html
@@ -0,0 +1,40 @@
+<!--
+  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 box-primary">
+	<div class="box-header with-border">
+		<i class="fa fa-folder-open"></i>
+		<h3 class="box-title ng-binding">{{Application.current().displayName}}</h3>
+		<div class="box-tools pull-right" ng-if="viewConfig">
+			<div class="btn-group">
+				<button type="button" class="btn btn-box-tool dropdown-toggle" data-toggle="dropdown">
+					<span class="fa fa-wrench"></span>
+				</button>
+				<ul class="dropdown-menu" role="menu">
+					<li><a ng-click="import()"><span class="fa fa-cloud-upload"></span> Import</a></li>
+					<li><a ng-click="export()"><span class="fa fa-cloud-download"></span> Export</a></li>
+					<li class="divider"></li>
+					<li class="danger"><a ng-click="deleteAll()"><span class="fa fa-trash"></span> Delete All</a></li>
+				</ul>
+			</div>
+		</div>
+	</div>
+	<div class="box-body">
+		<ng-include ng-if="viewConfig" src="'public/feature/classification/page/sensitivity/' + viewConfig.type + '.html?_=' + ajaxId"></ng-include>
+	</div>
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/d37643b0/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/folder.html
----------------------------------------------------------------------
diff --git a/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/folder.html b/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/folder.html
new file mode 100644
index 0000000..e7abd4f
--- /dev/null
+++ b/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/folder.html
@@ -0,0 +1,110 @@
+<!--
+  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 ng-controller="classification_sensitivityViewFolder">
+	<ul class="list-inline path">
+		<li>Path:</li>
+		<li ng-repeat="unit in pathUnitList">
+			<a ng-click="updateItems(unit.path)" class="label bg-black">{{unit.name}}</a>
+		</li>
+	</ul>
+
+	<table class="table table-bordered">
+		<thead>
+			<tr>
+				<th width="15%">File Name</th>
+				<th width="10%">Owner</th>
+				<th width="10%">Group</th>
+				<th>Sensitivity Type</th>
+				<th width="10" ng-show="Auth.isRole('ROLE_ADMIN')"> </th>
+			</tr>
+		</thead>
+		<tbody>
+			<tr ng-show="items._promise.$$state.status !== 1">
+				<td colspan="5">
+					<span class="fa fa-refresh fa-spin"> </span>
+					Loading...
+				</td>
+			</tr>
+			<tr ng-show="items._promise.$$state.status === 1 && !items.length">
+				<td colspan="5">
+					<span class="fa fa-exclamation-triangle"> </span>
+					Empty Folder
+				</td>
+			</tr>
+			<tr ng-repeat="item in items" ng-class="{warning : item.sensitiveType}">
+				<td>
+					<span ng-show="!item.isdir">
+						<span class="fa fa-file"> </span>
+						{{getFileName(item)}}
+					</span>
+					<a ng-show="item.isdir" ng-click="updateItems(item.resource)">
+						<span class="fa fa-folder"> </span>
+						{{getFileName(item)}}
+					</a>
+
+					<span class="pull-right" ng-show="item.childSensitiveTypes.length">
+						<span class="fa fa-dot-circle-o text-muted" uib-tooltip="Contain child sensitivity defination"> </span>
+					</span>
+				</td>
+				<td>{{item.owner}}</td>
+				<td>{{item.group}}</td>
+				<td>{{item.sensitiveType}}</td>
+				<td ng-show="Auth.isRole('ROLE_ADMIN')">
+					<button class="fa fa-eye btn btn-primary btn-xs" ng-click="markSensitivity(item)" ng-show="!item.sensitiveType"
+					uib-tooltip="Mark as sensitivity data" tooltip-animation="false" tooltip-placement="left"> </button>
+					<button class="fa fa-eye-slash btn btn-warning btn-xs" ng-click="unmarkSensitivity(item)" ng-show="item.sensitiveType"
+					uib-tooltip="Remove the sensitivity mark" tooltip-animation="false" tooltip-placement="left"> </button>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+
+
+	<!-- Modal: Create / Edit site -->
+	<div class="modal fade" id="sensitivityMDL" tabindex="-1" role="dialog">
+		<div class="modal-dialog" role="document">
+			<div class="modal-content">
+				<div class="modal-header">
+					<button type="button" class="close" data-dismiss="modal" aria-label="Close">
+						<span aria-hidden="true">&times;</span>
+					</button>
+					<h4 class="modal-title">Mark Sensitivity Data</h4>
+				</div>
+				<div class="modal-body">
+					<div class="form-group">
+						<label>Resource</label>
+						<input type="text" readonly="readonly" class="form-control" ng-model="_markItem.tags.filedir" />
+					</div>
+					<div class="form-group">
+						<label>* Sensitivity Type</label>
+						<input type="text" class="form-control" ng-model="_markItem.sensitivityType" id="sensitiveType" />
+					</div>
+				</div>
+				<div class="modal-footer">
+					<button type="button" class="btn btn-default" data-dismiss="modal">
+						Close
+					</button>
+					<button type="button" class="btn btn-primary" ng-click="confirmUpateSensitivity()" ng-disabled="!_markItem.sensitivityType">
+						Update
+					</button>
+				</div>
+			</div>
+		</div>
+	</div>
+
+</div>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-eagle/blob/d37643b0/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/table.html
----------------------------------------------------------------------
diff --git a/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/table.html b/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/table.html
new file mode 100644
index 0000000..13d5807
--- /dev/null
+++ b/eagle-webservice/src/main/webapp/app/public/feature/classification/page/sensitivity/table.html
@@ -0,0 +1,150 @@
+<!--
+  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 ng-controller="classification_sensitivityViewTable">
+	<p ng-show="databases._promise.$$state.status !== 1">
+		<span class="fa fa-refresh fa-spin"> </span>
+		Loading...
+	</p>
+
+	<div ng-show="databases._promise.$$state.status === 1" class="row">
+		<div class="col-md-4">
+			<label>
+				Databases
+				({{databases.length}})
+			</label>
+			<ul class="tree tree-bordered" style="max-height: 500px; overflow-y: auto;">
+				<li ng-repeat="db in databases">
+					<span class="tree-item box-clickable text-primary" ng-click="db.show = !db.show; loadTables(db);">
+						<span ng-class="{'text-warning' : db.sensitiveType}">
+							<span class="fa fa-database"> </span>
+							{{db.database}}
+							<span ng-show="db.tables._promise.$$state.status === 1">({{db.tables.length}})</span>
+
+							<span ng-show="Auth.isRole('ROLE_ADMIN')">
+								<a class="fa fa-eye text-muted hover" ng-click="markSensitivity(db, $event)" ng-show="!db.sensitiveType"
+								uib-tooltip="Mark as sensitivity data" tooltip-animation="false" tooltip-placement="right"></a>
+								<a class="fa fa-eye-slash text-muted hover" ng-click="unmarkSensitivity(db, $event)" ng-show="db.sensitiveType"
+								uib-tooltip="Remove the sensitivity mark" tooltip-animation="false" tooltip-placement="right"></a>
+							</span>
+
+							<span class="pull-right" ng-show="db.childSensitiveTypes.length">
+								<span class="fa fa-dot-circle-o" uib-tooltip="Contain child sensitivity defination" tooltip-placement="right" tooltip-append-to-body="true"> </span>
+							</span>
+							<span ng-show="db.sensitiveType" class="pull-right">[{{db.sensitiveType}}]</span>
+						</span>
+					</span>
+					<ul ng-show="db.show">
+						<li ng-show="db.tables._promise.$$state.status !== 1">
+							<span>
+								<span class="fa fa-refresh fa-spin"> </span>
+								Loading...
+							</span>
+						</li>
+						<li ng-repeat="tb in db.tables" ng-class="{active : tb === table}">
+							<span class="tree-item box-clickable text-primary" ng-click="loadColumns(db, tb)">
+								<span ng-class="{'text-warning' : tb.sensitiveType}">
+									<span class="fa fa-table"> </span>
+									{{tb.table}}
+
+									<span ng-show="Auth.isRole('ROLE_ADMIN')">
+										<a class="fa fa-eye text-muted hover" ng-click="markSensitivity(tb, $event)" ng-show="!tb.sensitiveType"
+										uib-tooltip="Mark as sensitivity data" tooltip-animation="false" tooltip-placement="right"></a>
+										<a class="fa fa-eye-slash text-muted hover" ng-click="unmarkSensitivity(tb, $event)" ng-show="tb.sensitiveType"
+										uib-tooltip="Remove the sensitivity mark" tooltip-animation="false" tooltip-placement="right"></a>
+									</span>
+
+									<span class="pull-right" ng-show="tb.childSensitiveTypes.length">
+										<span class="fa fa-dot-circle-o" uib-tooltip="Contain child sensitivity defination" tooltip-placement="right" tooltip-append-to-body="true"> </span>
+									</span>
+									<span ng-show="tb.sensitiveType" class="pull-right">[{{tb.sensitiveType}}]</span>
+								</span>
+							</span>
+						</li>
+					</ul>
+				</li>
+			</ul>
+		</div>
+		<div class="col-md-8">
+			<label ng-show="table">Route: {{table.database}} > {{table.table}}</label>
+			<p ng-show="table && table.columns._promise.$$state.status !== 1">
+				<span class="fa fa-refresh fa-spin"> </span>
+				Loading...
+			</p>
+			<div ng-show="table && table.columns._promise.$$state.status === 1">
+				<table class="table table-bordered">
+					<thead>
+						<tr>
+							<th width="40%">Column Name</th>
+							<th>Sensitivity Type</th>
+							<th width="10" ng-show="Auth.isRole('ROLE_ADMIN')"> </th>
+						</tr>
+					</thead>
+					<tbody>
+						<tr ng-repeat="col in table.columns" ng-class="{warning : col.sensitiveType}">
+							<td>{{col.column}}</td>
+							<td>{{col.sensitiveType}}</td>
+							<td ng-show="Auth.isRole('ROLE_ADMIN')">
+								<button class="fa fa-eye btn btn-primary btn-xs" ng-click="markSensitivity(col)" ng-show="!col.sensitiveType"
+								uib-tooltip="Mark as sensitivity data" tooltip-animation="false" tooltip-placement="left"> </button>
+								<button class="fa fa-eye-slash btn btn-warning btn-xs" ng-click="unmarkSensitivity(col)" ng-show="col.sensitiveType"
+								uib-tooltip="Remove the sensitivity mark" tooltip-animation="false" tooltip-placement="left"> </button>
+							</td>
+						</tr>
+					</tbody>
+				</table>
+			</div>
+		</div>
+	</div>
+
+
+
+
+
+
+	<!-- Modal: Create / Edit site -->
+	<div class="modal fade" id="sensitivityMDL" tabindex="-1" role="dialog">
+		<div class="modal-dialog" role="document">
+			<div class="modal-content">
+				<div class="modal-header">
+					<button type="button" class="close" data-dismiss="modal" aria-label="Close">
+						<span aria-hidden="true">&times;</span>
+					</button>
+					<h4 class="modal-title">Mark Sensitivity Data</h4>
+				</div>
+				<div class="modal-body">
+					<div class="form-group">
+						<label>Resource</label>
+						<input type="text" readonly="readonly" class="form-control" ng-model="_markItem.tags[viewConfig.keys[0]]" />
+					</div>
+					<div class="form-group">
+						<label>* Sensitivity Type</label>
+						<input type="text" class="form-control" ng-model="_markItem.sensitivityType" id="sensitiveType" />
+					</div>
+				</div>
+				<div class="modal-footer">
+					<button type="button" class="btn btn-default" data-dismiss="modal">
+						Close
+					</button>
+					<button type="button" class="btn btn-primary" ng-click="confirmUpateSensitivity()" ng-disabled="!_markItem.sensitivityType">
+						Update
+					</button>
+				</div>
+			</div>
+		</div>
+	</div>
+</div>
\ No newline at end of file


Mime
View raw message