<!--
  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">
		<span class="fa fa-code-fork"></span>
		<h3 class="box-title">
			Stream List
		</h3>
	</div>
	<div class="box-body">
		<!-- Site Filter -->
		<ul class="nav nav-pills with-border">
			<li><span>Site Filter:</span></li>
			<li ng-class="{active: siteFilter === ''}" ng-click="updateSiteFilter('')"><a>All</a></li>
			<li ng-class="{active: siteFilter === site.siteId}" ng-click="updateSiteFilter(site.siteId)"
			    ng-repeat="site in Site.list track by $index">
				<a>{{site.siteName || site.siteId}}</a>
			</li>
		</ul>

		<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 class="text-no-break">
							{{item.application.type}}
							<a class="fa fa-plug" uib-tooltip="Click to view data source" ng-click="showDataSource(item)"></a>
						</td>
						<td>{{item.siteId}}</td>
						<td>
							<ul class="no-margin">
								<li ng-repeat="column in item.columns track by $index">
									<strong>{{column.name}}</strong>:
									{{column.type}}
								</li>
							</ul>
						</td>
					</tr>
				</tbody>
			</table>
		</div>
	</div>
</div>
