
<!--
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.
-->


<!-- ELINE CREATION POINT TO POINT -->
<div class="container-fluid eline-form">
    <div class="row">
        <div class="col-xs-10 col-xs-offset-1">
            <div class="panel panel-primary animate-vertical">
                <div class="panel-heading">
                    <h3 class="panel-title">Create E-LINE</h3>
                </div>
                <form name="vm.eline" ng-submit="vm.createEline(vm.el, vm.eline)">
                    <div class="panel-body">
                        <div class="row">
                            <div class="col-xs-12">
                                <label>Name:</label>
                                <input type="text" class="form-control input-lg" ng-model="vm.el.evcCfgidentifier" required></div>
                        </div>
                        <div class="row">
                            <div class="col-xs-6">
                                <label>Start:</label>
                                <div class="alert alert-danger animate-vertical" ng-hide="!vm.formErrors.startError">
                                    {{vm.formErrors.startError}}
                                </div>
                                <!--<pre>{{vm.startUnis | json}}</pre>-->
                                <div class="row uni-repeat" ng-repeat="u in vm.startUnis">
                                    <div class="col-xs-2">
                                        <checkbox largest
                                                  ng-class="{'btn-primary': !u.alreadySelected, 'btn-danger': u.alreadySelected === true}"
                                                  ng-model="u.selected"
                                                  ng-change="vm.selectUni(u, 'start')"
                                                  required
                                        ></checkbox>
                                    </div>
                                    <div class="col-xs-5">

                                        <b>{{u.name || u.interfaceCfgIdentifier}}</b>

                                    </div>
                                    <div class="col-xs-5">
                                        {{u.location}}
                                    </div>
                                </div>
                            </div>
                            <div class="col-xs-6">
                                <label>End:</label>
                                <div class="alert alert-danger animate-vertical" ng-hide="!vm.formErrors.endError">
                                    {{vm.formErrors.endError}}
                                </div>
                                <div class="row uni-repeat" ng-repeat="u in vm.endUnis">
                                    <div class="col-xs-2">
                                        <checkbox largest
                                                  ng-class="{'btn-primary': !u.alreadySelected, 'btn-danger': u.alreadySelected === true}"
                                                  ng-model="u.selected"
                                                  ng-change="vm.selectUni(u, 'end')"
                                                  required
                                        ></checkbox>
                                    </div>
                                    <div class="col-xs-5">
                                        <b>{{u.name || u.interfaceCfgIdentifier}}</b>
                                    </div>
                                    <div class="col-xs-5">
                                        {{u.location}}
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="panel-footer text-right">
                        <button ng-hide="vm.eline.$saved" type="submit" class="btn btn-success btn-lg animate-fade">Save</button>
                        <div ng-hide="!vm.eline.$saved" class="form-success animate-fade">Done</div>
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>

<!-- MULTIPLE POINT CREATION -->
<div class="container-fluid eline-form" ng-if="vm.currentUser.userId === 2">
    <div class="row">
        <div class="col-xs-10 col-xs-offset-1">
            <div class="panel panel-primary animate-vertical">
                <div class="panel-heading">
                    <h3 class="panel-title">Create Infrastructure</h3>
                </div>
                <form name="vm.infrastructure" ng-submit="vm.createInfrastructure(vm.infrastructureUnis)">
                    <div class="panel-body">
                        <div class="row">
                            <div class="col-sm-6 infrastructureUnis" ng-repeat="u in vm.infrastructureUnis">
                                <div class="row uni-repeat">
                                    <div class="col-xs-2">
                                        <checkbox largest
                                                  class="btn-primary"
                                                  ng-model="u.selected"
                                                  required
                                        ></checkbox>
                                    </div>
                                    <div class="col-xs-5">
                                        <b>{{u.name}}</b>
                                    </div>
                                    <div class="col-xs-5">
                                        {{u.location}}
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="panel-footer text-right">
                        <button ng-hide="vm.eline.$saved" type="submit" class="btn btn-success btn-lg animate-fade">Save</button>
                        <div ng-hide="!vm.eline.$saved" class="form-success animate-fade">Done</div>
                    </div>
                </form>
            </div>
        </div>
    </div>
</div>