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

<button class="export-dropdown" nz-button nz-dropdown nzSize="small" [nzDropdownMenu]="menu">
  <span>Export</span>
  <i nz-icon nzType="down"></i>
</button>
<nz-dropdown-menu #menu="nzDropdownMenu">
  <ul nz-menu>
    <li nz-menu-item>
      <a (click)="exportFile('csv')">Export all data as csv</a>
    </li>
    <li nz-menu-item>
      <a (click)="exportFile('xlsx')">Export all data as excel</a>
    </li>
    <li nz-menu-item>
      <a (click)="exportFile('csv', false)">Export visible data as csv</a>
    </li>
    <li nz-menu-item>
      <a (click)="exportFile('xlsx', false)">Export visible data as excel</a>
    </li>
  </ul>
</nz-dropdown-menu>
<nz-table
  #table
  nzSize="small"
  nzShowSizeChanger
  [nzScroll]="{ x: '1300px' }"
  [nzData]="rows"
  [nzFooter]="aggregatesFooter"
>
  <thead>
    <tr>
      <th
        *ngFor="let col of columns"
        nzWidth="200px"
        nzShowSort
        nzCustomFilter
        (nzSortOrderChange)="onSortChange(col, $event)"
      >
        {{ col }}
        <i
          #dropdown="nzDropdown"
          nz-icon
          nzType="down"
          nzTrigger="click"
          nzPlacement="bottomRight"
          [nzClickHide]="false"
          [nzDropdownMenu]="filterMenu"
          nzTableFilter
          [nzRotate]="dropdown.nzVisible ? 180 : 0"
          class="ant-table-filter-icon filter-icon"
          [class.ant-table-filter-open]="dropdown.nzVisible"
          nz-dropdown
        ></i>
        <nz-dropdown-menu #filterMenu="nzDropdownMenu">
          <ul nz-menu class="th-dropdown">
            <li nz-menu-group class="search-bar">
              <nz-input-group nzSearch [nzAddOnAfter]="suffixIconButton">
                <input
                  type="text"
                  nz-input
                  placeholder="Search..."
                  (blur)="onSearch()"
                  (keydown.enter)="onSearch()"
                  [ngModel]="getColOptionOrThrow(col).term"
                  (ngModelChange)="onTermChange(col, $event)"
                />
              </nz-input-group>
              <ng-template #suffixIconButton>
                <button nz-button nzSearch nzType="primary" (click)="onSearch()">
                  <i nz-icon nzType="search" nzTheme="outline"></i>
                </button>
              </ng-template>
            </li>
            <li nz-menu-divider></li>
            <li nz-menu-group>
              <span title>Type</span>
              <ul>
                <li
                  *ngFor="let type of types"
                  nz-menu-item
                  [nzSelected]="getColOptionOrThrow(col).type === type"
                  (click)="onChangeType(type, col)"
                >
                  {{ type | titlecase }}
                </li>
              </ul>
            </li>
            <li nz-menu-divider></li>
            <li nz-menu-group>
              <span title>Aggregation</span>
              <ul>
                <li
                  *ngFor="let aggregation of aggregations"
                  nz-menu-item
                  [nzSelected]="getColOptionOrThrow(col).aggregation === aggregation"
                  (click)="onChangeAggregation(aggregation, col)"
                >
                  {{ aggregation | titlecase }}
                </li>
              </ul>
            </li>
          </ul>
        </nz-dropdown-menu>
      </th>
    </tr>
  </thead>
  <tbody>
    <tr *ngFor="let data of table.data">
      <td *ngFor="let col of columns">{{ data[col] }}</td>
    </tr>
  </tbody>
</nz-table>
<ng-template #aggregatesFooter>
  <div class="aggregation-wrap">
    <span *ngFor="let col of columns">
      <span class="aggregation-item" *ngIf="getColOptionOrThrow(col).aggregation as aggregation">
        {{ aggregation }}(
        <strong>{{ col }}</strong>
        ):
        <span>{{ getColOptionOrThrow(col).aggregationValue }}</span>
      </span>
    </span>
  </div>
</ng-template>
