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

<fims-layout-card-over [title]="range.identifier" [navigateBackTo]="['../../../../../../../']" *ngIf="(range$ | async) as range">
  <fims-layout-card-over-header-menu>
    <button mat-icon-button (click)="deleteRange(range)" title="{{'Delete this range' | translate}}" *hasPermission="{ id: 'portfolio_products', accessLevel: 'CHANGE'}"><mat-icon>delete</mat-icon></button>
  </fims-layout-card-over-header-menu>
  <div class="mat-content inset" flex>
    <div layout="row">
      <td-data-table
        flex
        [data]="range?.segments"
        [columns]="rangeColumns"
        [selectable]="false"
        [clickable]="false"
        [multiple]="false"
        [sortable]="false">
      </td-data-table>
    </div>
  </div>
</fims-layout-card-over>
<fims-fab-button title="{{'Edit range' | translate}}" icon="mode_edit" [link]="['edit']" [permission]="{ id: 'portfolio_products', accessLevel: 'CHANGE'}"></fims-fab-button>
