<!--
  ~ 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 class="table-wrapper scrolling">
  <table mat-table [dataSource]="dataSource" class="projects-table mat-elevation-z6 selection">
  <ng-container matColumnDef="name">
    <th mat-header-cell *matHeaderCellDef class="name"> Project name </th>
    <td mat-cell *matCellDef="let element" class="name project-name"> {{element.name}} </td>
  </ng-container>

  <ng-container matColumnDef="groups">
    <th mat-header-cell *matHeaderCellDef class="groups"> Group </th>
    <td mat-cell *matCellDef="let element" class="groups">
      <mat-chip-list>
        <mat-chip *ngFor="let group of element.groups" [matTooltip]="group" matTooltipPosition="above" class="ellipsis">{{ group }}</mat-chip>
      </mat-chip-list>
    </td>
  </ng-container>

  <ng-container matColumnDef="endpoints">
    <th mat-header-cell *matHeaderCellDef class="endpoints">
      <span class="label-endpoint"> Endpoint </span>
      <span class="label-endpoint-status"> Endpoint status </span>
      <span class="label-status">Edge node status </span>
    </th>
    <td mat-cell *matCellDef="let element" class="source endpoints">
      <div *ngIf="!element.endpoints?.length; else list">
        <span *ngIf="!element.endpoints.length" class="no-details">no details</span>
      </div>
      <ng-template #list>
        <div *ngFor="let endpoint of element.endpoints" class="resource-wrap">
          <div class="resource-name">
            <a class="project-endpoint-name">
              {{ endpoint.name }}
            </a>
          </div>
          <div class="resource-status">
            <span [ngClass]="{'active' : endpoint.endpointStatus === 'ACTIVE', 'failed': endpoint.endpointStatus === 'INACTIVE'}">
              {{ (endpoint.endpointStatus | titlecase) || 'N/A'}}
            </span>
          </div>

          <span class="status resource-status"
            [ngClass]="endpoint?.status.toLowerCase() || ''">{{ endpoint?.status.toLowerCase() }}</span>
        </div>
      </ng-template>
    </td>
  </ng-container>

  <ng-container matColumnDef="actions">
    <th mat-header-cell *matHeaderCellDef class="project-actions">
      <span class="label"> Actions </span>
    </th>
    <td mat-cell *matCellDef="let element" class="settings">
      <span #settings (click)="actions.toggle($event, settings)" class="actions"></span>
      <bubble-up #actions class="list-menu" position="bottom-left" alternative="top-left">
        <ul class="list-unstyled actions-list">
          <div class="active-items"></div>
          <li class="project-seting-item" *ngIf="element.areStoppedNode" (click)="openEdgeDialog('start', element)">
            <i class="material-icons">play_circle_outline</i>
            <a class="action">
              Start edge node
            </a>
          </li>
          <li class="project-seting-item" *ngIf="element.areRunningNode" (click)="openEdgeDialog('stop', element )">
            <i class="material-icons">pause_circle_outline</i>
            <a class="action" >
              Stop edge node
            </a>
          </li>
          <li class="project-seting-item " *ngIf="element.areTerminatedNode" (click)="openEdgeDialog('recreate', element)">
            <i class="material-icons">refresh</i>
            <a class="action">
              Recreate edge node
            </a>
          </li>
          <li class="project-seting-item " *ngIf="element.areStoppedNode || element.areRunningNode" (click)="openEdgeDialog('terminate', element)">
            <i class="material-icons">phonelink_off</i>
            <a class="action">
              Terminate edge node
            </a>
          </li>
          <li class="project-seting-item" (click)="editProject(element)" *ngIf="!isProjectAdmin">
            <i class="material-icons">mode_edit</i>
            <a >
              Edit project
            </a>
          </li>
        </ul>
      </bubble-up>
    </td>
    <td class="settings">

    </td>

  </ng-container>

  <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
  <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>
</div>
