<!--
  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">
	<table class="table table-bordered table-hover">
		<thead>
		<tr>
			<th>Site</th>
			<th>Description</th>
			<th>Enabled Apps</th>
			<th width="100">Actions</th>
		</tr>
		</thead>
		<tbody>
			<tr ng-repeat="site in Site.list track by $index">
				<td>
					<a ui-sref="integration.site({id: site.siteId})">
						{{site.siteId}}
						<span ng-if="site.siteName">({{site.siteName}})</span>
					</a>
				</td>
				<td>{{site.description}}</td>
				<td>
					<span class="text-muted" ng-if="site.applicationList.length === 0">(Nothing installed...)</span>
					<ul class="list-inline no-margin">
						<li ng-repeat="app in site.applicationList track by $index">
							<span class="label label-primary">
								{{app.descriptor.name}}
							</span>
						</li>
					</ul>
				</td>
				<td class="text-center">
					<div class="btn-group btn-group-xs">
						<a class="btn btn-default btn-sm" ui-sref="integration.site({id: site.siteId})">Edit</a>
						<button class="btn btn-danger btn-sm" ng-click="deleteSite(site)">Delete</button>
					</div>
				</td>
			</tr>
		</tbody>
	</table>
</div>
<div class="box-footer text-right">
	<button class="btn btn-primary" ng-click="newSite()">New Site</button>
</div>
