<!--
  ~ 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.
  -->
<section class="toolbar">
  <div class="info_color" *ngIf="reportData">
    <div class="general">
      <div><span>Service base name: </span><strong>{{ reportData.service_base_name }}</strong></div>
      <div *ngIf="reportData.tag_resource_id"><span>Resource tag ID:
        </span><strong>{{ reportData.tag_resource_id }}</strong></div>
      <div class="report-period info_color" *ngIf="availablePeriodFrom && availablePeriodTo">
        <span>Available reporting period from:</span>
        <strong>{{ availablePeriodFrom | date }} </strong>
        to: <strong>{{ availablePeriodTo | date }}</strong>
      </div>
    </div>
  </div>

  <div id="range-picker">
    <ng-daterangepicker [(ngModel)]="value" [options]="options" (ngModelChange)="onChange($event)"></ng-daterangepicker>
  </div>
  <div class="action-butt">
    <button mat-raised-button class="butt" (click)="export($event)" [disabled]="!reportData?.lines.length">
      <i class="material-icons">file_download</i>Export
    </button>
    <button mat-raised-button class="butt" (click)="rebuild($event)">
      <i class="material-icons">autorenew</i>Refresh
    </button>
  </div>
</section>
