<!--
  ~ 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="dropdown-multiselect btn-group" ngClass="{{type || ''}}">
  <button type="button" #list (click)="multiactions.toggle($event, list)">
    <span class="ellipsis" *ngIf="model.length === 0 && type">
      <ng-container *ngIf="type === 'resource_type' || type === 'resource_types';else noResourceTypeSelect">
        Select {{ type | convertaction}}
      </ng-container>
      <ng-template #noResourceTypeSelect>Select {{ type  }}</ng-template>
    </span>
    <span class="selected-items ellipsis" *ngIf="model.length !== 0">
      Selected {{model.length}} item<strong *ngIf="model.length > 1">s</strong>
    </span>
    <span class="caret-btn"><i class="material-icons">keyboard_arrow_down</i></span>
  </button>

  <bubble-up #multiactions position="bottom" [keep-open]="true" class="mt-5">
    <ul class="list-menu" id="scrolling">
      <li class="filter-actions">
        <a class="select_all" (click)="selectAllOptions($event)">
          <i class="material-icons">playlist_add_check</i>&nbsp;All
        </a>
        <a class="deselect_all" (click)="deselectAllOptions($event)">
          <i class="material-icons">clear</i>&nbsp;None
        </a>
      </li>
      <ng-template let-item ngFor [ngForOf]="items">
        <li role="presentation" *ngIf="model">
          <a 
            href="#" 
            class="list-item billing-user-name"
            [ngClass]="{'uppercase': type === 'resource_type' || type === 'status'}"
            role="menuitem" 
            (click)="toggleSelectedOptions($event, model, item)"
          >
            <span class="material-icons" *ngIf="model.indexOf(item) >= 0">done</span>
            <ng-container 
              *ngIf="type !== 'resource_type' && type !== 'resource_types' 
                && item !== 'invalid_name' && item !== 'invalid_version' 
                && item !== 'installation_error'"
            >
              <div [ngClass]="{'uppercase': type === 'status'}">{{item}}</div>
            </ng-container>
            <ng-container 
              *ngIf="type === 'resource_type' || type === 'resource_types' 
                || item === 'invalid_name' || item === 'invalid_version' 
                || item === 'installation_error'"
            >
              <div [ngClass]="{'uppercase': type === 'status' || type === 'resource_type'}">{{item | convertaction}}</div>
            </ng-container>
          </a>
        </li>
      </ng-template>
      <li *ngIf="items?.length == 0">
        <a role="menuitem" class="list-item">
          <span class="material-icons">visibility_off</span>
         <ng-container *ngIf="type === 'resource_type' || type === 'resource_types';else noResourceType">No {{type | convertaction}}</ng-container>
         <ng-template #noResourceType>No {{type}}</ng-template>
        </a>
      </li>
    </ul>
  </bubble-up>
</div>
