
<!--
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-10">
    <h1>Manage Dashboard</h1>
  </div>
  <div class="col-xs-2 text-right">
    <a ui-sref="manage-user-dashboards" class="btn btn-success">Back</a>
  </div>
</div>
<div class="row">
  <div class="col-xs-12">
    <xos-form ng-model="vm.dashboard" config="vm.formConfig"></xos-form>
  </div>
</div>
<div class="row" ng-show="vm.tosca">
  <div class="col-sm-6">
    <div class="row">
      <div class="col-xs-12">
        <xos-alert show="true" config="{type: 'info'}">
          Include this lines in a TOSCA recipe to load the {{vm.dashboard.name}} dashboard in the system.
        </xos-alert>
      </div>
      <div class="col-xs-12">
        <pre>{{vm.tosca}}</pre>
      </div>
    </div>
  </div>
  <div class="col-sm-6">
    <div class="row">
      <div class="col-xs-12">
        <xos-alert show="true" config="{type: 'info'}">
          Add this lines as a requirement for the user in a TOSCA recipe to assign the {{vm.dashboard.name}} to the user.
        </xos-alert>
      </div>
      <div class="col-xs-12">
        <pre>{{vm.toscaRequirements}}</pre>
      </div>
    </div>
  </div>
</div>