<!--
  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="{{'Tasks' | translate}}" *ngIf="caseInstance$ | async as caseInstance" [navigateBackTo]="['../']">
  <div layout="row" layout-align="start start" layout-margin>
    <div layout="column" flex="100">
      <div layout="row" layout-align="start start" *ngFor="let command of statusCommands$ | async">
        <div layout="column" flex="100" *ngIf="command.preStates.indexOf(caseInstance.currentState) > -1">
          <fims-case-command
            [caseCreator]="caseInstance.createdBy"
            [currentUser]="currentUser$ | async"
            [productId]="productId$ | async"
            [caseId]="caseInstance.identifier"
            [statusCommand]="command"
            (onExecuteTask)="executeTask($event)"
            (onExecuteCommand)="executeCommand($event)">
          </fims-case-command>
        </div>
        <mat-divider></mat-divider>
      </div>
    </div>
  </div>
</fims-layout-card-over>
