<!--
    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="row top-buffer">
  <div class="col-md-2">
    <input type="text" class="form-control" placeholder="Search Properties"
           name="search" ng-model="search.$">
  </div>
  <div class="col-md-10">
    <div class="btn-group btn-group-justified">
      <a class="btn"
         ng-class="$ctrl.allSelected('All') ? 'btn-primary' :'btn-secondary'"
         ng-click="$ctrl.switchto('All')">All
      </a>
      <a class="btn"
         ng-class="$ctrl.allSelected('OM') ? 'btn-primary' :'btn-secondary'"
         ng-click="$ctrl.switchto('OM')">OM</a>
      <a class="btn"
         ng-class="$ctrl.allSelected('SCM') ? 'btn-primary' :'btn-secondary'"
         ng-click="$ctrl.switchto('SCM')">SCM</a>
    </div>
  </div>
</div>
<div class="row">
  <div class="col-md-2">

    <table class="table table-striped table-condensed tagPanel">
      <colgroup>
        <col class="col-md-12">
      </colgroup>
      <thead>
      <tr>
        <th>Tag</th>
      </tr>
      </thead>
      <tbody>
      <tr ng-click="$ctrl.select(tag)"
          ng-class="$ctrl.selected(tag) ? 'selectedtag':''"
          ng-repeat="tag in $ctrl.tags">
        <td>{{tag}}</td>
      </tr>
      </tbody>
    </table>
  </div>
  <div class="col-md-10">
    <table class="table table-striped table-condensed table-hover wrap-table">
      <thead>
      <tr>
        <th class="col-md-3" >
          <a href="javascript:void(0)" ng-click="$ctrl.sortBy('name')">Property</a>
          <span class="sortorder" ng-show="$ctrl.propertyName === 'name'"
                ng-class="{reverse: $ctrl.reverse}">
              </span>
        </th>
        <th class="col-md-2" style="word-wrap: break-word;">
          <a href="javascript:void(0)" ng-click="$ctrl.sortBy('value')">Value</a>
          <span class="sortorder" ng-show="$ctrl.propertyName === 'value'"
                ng-class="{reverse: $ctrl.reverse}"></span>
        </th>
        <th class="col-md-7">
          <a href="javascript:void(0)" ng-click="$ctrl.sortBy('description')">Description</a>
          <span class="sortorder" ng-show="$ctrl.propertyName === 'description'"
                ng-class="{reverse: reverse}"></span>
        </th>
      </tr>
      </thead>
      <tbody>
      <tr
          ng-repeat="config in $ctrl.configs | filter:search | orderBy:$ctrl.propertyName:$ctrl.reverse">
        <td style="word-wrap: break-word;">{{config.name}}</td>
        <td style="word-wrap: break-word;">{{config.value}}</td>
        <td style="word-wrap: break-word;">{{config.description}}</td>
      </tr>
      </tbody>
    </table>
  </div>
</div>
