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

<table td-data-table>
  <thead>
    <tr td-data-table-column-row>
      <th td-data-table-column *ngFor="let columnName of reportPage?.header?.columnNames">
        <span>{{columnName}}</span>
      </th>
    </tr>
  </thead>
  <tbody>
    <tr td-data-table-row *ngFor="let row of reportPage?.rows">
      <td td-data-table-cell *ngFor="let value of row.values">
        {{cellValue(value.values)}}
      </td>
    </tr>
    <tr td-data-table-row>
      <td td-data-table-cell *ngFor="let value of reportPage?.footer?.values">
        {{cellValue(value.values)}}
      </td>
    </tr>
  </tbody>
</table>

<div class="mat-padding" *ngIf="!reportPage || reportPage.rows?.length === 0" layout="row" layout-align="center center">
  <h3 translate>No results to display.</h3>
</div>
