<!--
  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.
-->
<loading-state error="error" ng-if="!info"></loading-state>
<div ng-if="info">
    <div class="form-group">
        <input type="text"
               ng-model="searchCriteria"
               class="form-control"
               placeholder="Search for name (e.g. producer, target, etc)"
               auto-focus />
    </div>

    <div class="table-responsive">
        <table class="table table-bordered table-editable">
            <thead>
                <tr>
                    <th ng-click="reverse = !reverse">
                        Name <span class="fa" ng-class="{'fa-caret-down': reverse, 'fa-caret-up': !reverse}"></span>
                    </th>
                    <th>Value</th>
                </tr>
            </thead>
            <tbody>
                <tr ng-repeat="item in info | orderBy:'name':reverse | filter:{name: searchCriteria} track by item.name">
                    <td>
                        {{item.name}}
                    </td>
                    <td ng-switch="item.type" ng-class="{'editable-column': item.reconfigurable}">
                        <div ng-switch-when="java.lang.Number" editable-number="item.value" edit-disabled="!item.reconfigurable" onbeforesave="updateAdjunctConfig(item, $data)" buttons="right" e-disabled-submit-on-enter>
                            <span>{{item.value}}</span>
                        </div>
                        <div ng-switch-when="java.lang.Integer" ng-class="{'edit-disabled': !item.reconfigurable}" editable-number="item.value" edit-disabled="!item.reconfigurable" onbeforesave="updateAdjunctConfig(item, $data)" buttons="right" e-disabled-submit-on-enter>
                            <span>{{item.value}}</span>
                        </div>
                        <div ng-switch-default ng-class="{'edit-disabled': !item.reconfigurable}" editable-text="item.value" edit-disabled="!item.reconfigurable" onbeforesave="updateAdjunctConfig(item, $data)" buttons="right" e-disabled-submit-on-enter>
                            <span>{{item.value}}</span>
                        </div>
                    </td>
                </tr>
                <tr ng-if="item.length == 0 ">
                    <td colspan="2" class="text-center"><h4>No sensors found matching <code>{{filterValue}}</code></h4></td>
                </tr>
            </tbody>
        </table>
    </div>
</div>
