
<!--
Copyright 2017-present Open Networking Foundation

Licensed 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">
    <div class="col-xs-12">
        <h3>Active Key Bindings</h3>
    </div>
</div>
<div class="row" ng-repeat="(k, v) in vm.bindings">
    <div class="col-xs-12" ng-if="v.length > 0">
        <table class="table table-condensed">
            <thead>
                <tr>
                    <th>{{k | capitalize}}:</th>
                </tr>
            </thead>
            <tbody>
                <tr ng-repeat="binding in v" ng-if="binding.description">
                    <td>
                        <code class="text-center">
                            <span ng-repeat="m in binding.modifiers">
                                {{m}} +
                            </span>
                            {{binding.label.toLowerCase() || binding.key.toLowerCase()}}
                        </code>
                    </td>
                    <td class="text-right">
                        <p>{{binding.description}}</p>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
</div>
<div class="row">
    <div class="col-xs-12">
        <xos-debug-summary></xos-debug-summary>
    </div>
</div>