<!--
  ~ 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 id="dialog-box" class="manage-env-dialog">
  <header class="dialog-header">
    <h4 class="modal-title">Manage DataLab quotas</h4>
    <button type="button" class="close" (click)="dialogRef.close()">&times;</button>
  </header>
  <div class="dialog-content">
    <div class="content-box">
      <div *ngIf="data.projectsList?.length">
        <form 
          [formGroup]="manageUsersForm" 
          (submit)="setBudgetLimits(manageUsersForm.value)" 
          novalidate
        >
          <mat-list>
            <mat-list-item class="list-header">
              <div class="username">Project</div>
              <div class="period">Set per month</div>
              <div class="quotes">Limit</div>
            </mat-list-item>
            <div class="scrolling-content" id="scrolling" formArrayName="projects">
              <mat-list-item 
                *ngFor="let item of usersEnvironments.controls; let i=index" 
                [formGroupName]="i"
                class="list-item"
              >
                <div class="username ellipsis">
                  <span 
                    class="ellipsis"
                    matTooltip="{{ manageUsersForm.controls['projects']['controls'][i].value['project'] }}"
                    matTooltipPosition="above"
                  >
                    {{ manageUsersForm.controls['projects']['controls'][i].value['project'] }}
                  </span>
                </div>
                <div class="period">
                  <mat-slide-toggle formControlName="monthlyBudget"></mat-slide-toggle>
                </div>
                <div class="quotes">
                  <input 
                    type="number" 
                    (keypress)="CheckUtils.numberOnly($event)" 
                    min="0"
                    placeholder="Enter limit, in USD" formControlName="budget" 
                  />
                  <span 
                    class="error"
                    *ngIf="manageUsersForm?.controls['projects']['controls'][i].controls['budget'].hasError('overrun') 
                        && !manageUsersForm?.controls['projects']['controls'][i].controls['budget'].hasError('max')"
                  >
                    Projects budget cannot be higher than total budget.
                  </span>
                  <span 
                    class="error"
                    *ngIf="manageUsersForm?.controls['projects']['controls'][i].controls['budget'].hasError('max')"
                  >
                    Project budget cannot be higher than 1000000000.
                  </span>
                </div>
              </mat-list-item>
            </div>
            <div class="control-group total-budget">
              <mat-list-item class="list-item">
                <div class="username ellipsis">
                  <span class="ellipsis">Total budget</span>
                </div>
                <div class="period"></div>
                <div class="quotes">
                  <input 
                    type="number" 
                    (keypress)="CheckUtils.numberOnly($event)" 
                    formControlName="total"
                    placeholder="Enter total budget, in USD" 
                  />
                  <span 
                    class="error" 
                    *ngIf="manageUsersForm?.controls['total'].hasError('overrun')
                        && !manageUsersForm?.controls['total'].hasError('max')"
                  >
                    Total budget cannot be lower than a sum of project quotes.
                  </span>
                  <span 
                    class="error"
                    *ngIf="manageUsersForm?.controls['total'].hasError('max')"
                  >
                    Total budget cannot be higher than 1000000000.
                  </span>
                </div>
              </mat-list-item>
            </div>
            <div class="text-center m-top-30">
              <button 
                mat-raised-button 
                type="button" 
                (click)="dialogRef.close()" 
                class="butt action"
              >
                Cancel
              </button>
              <button 
                mat-raised-button 
                type="submit" 
                [disabled]="!manageUsersForm.valid || isFormChanged" 
                class="butt butt-success"
                [ngClass]="{'not-allowed': !manageUsersForm.valid}"
              >
                Apply
              </button>
            </div>
          </mat-list>
        </form>
      </div>
      <div class="info message" *ngIf="!data?.projectsList.length">No active projects</div>
    </div>
  </div>
</div>
