<!--
~ Copyright 2018-present Open Networking Foundation
~
~ Licensed 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 id="ov-app" (dragover)="onDragOver($event)" (dragleave)="onDragLeave($event)" (drop)="onDrop($event)">
    <div class="tabular-header">
        <onos-flash id="appMsgFlash" message="{{ alertMsg }}" dwell="5000" warning="true" (closed)="alertMsg = ''"></onos-flash>
        <onos-confirm message="{{ confirmMsg }}" warning="{{ strongWarning }}" (chosen)="dOk($event)"></onos-confirm>
        <h2>
            {{lionFn('title_apps')}}
            ({{ tableData.length }}
            {{ lionFn('total') }})
        </h2>
        <div class="ctrl-btns">
            <form #inputFileForm="ngForm">
                <input id="uploadFile" hidden
                       type="file" size="50" accept=".oar,.jar"
                       name="appFile" (change)="fileEvent($event)">
            </form>

            <div class="refresh" (click)="toggleRefresh()">
                <onos-icon classes="{{ autoRefresh?'active refresh':'refresh' }}"
                           iconId="refresh" iconSize="42" toolTip="{{ autoRefreshTip }}"></onos-icon>
            </div>
            <div class="separator"></div>

            <div class="active" (click)="triggerForm()">
                <onos-icon classes="{{ 'active-rect upload' }}"
                           iconId="upload" iconSize="42" toolTip="{{ uploadTip }}"></onos-icon>
            </div>

            <div (click)="(!!selId) ? confirmAction(AppActionEnum.ACTIVATE) : ''">
                <onos-icon classes="{{ ctrlBtnState.installed?'active-rect play':'play' }}"
                           iconId="play" iconSize="42" toolTip="{{ activateTip }}"></onos-icon>
            </div>
            <div (click)="(!!selId) ? confirmAction(AppActionEnum.DEACTIVATE) : ''">
                <onos-icon classes="{{ ctrlBtnState.active?'active-rect stop':'stop' }}"
                        iconId="stop" iconSize="42" toolTip="{{ deactivateTip }}"></onos-icon>
            </div>
            <div (click)="(!!selId) ? confirmAction(AppActionEnum.UNINSTALL) : ''">
                <onos-icon classes="{{ ctrlBtnState.selection?'active-rect garbage':'garbage' }}"
                        iconId="garbage" iconSize="42" toolTip="{{ uninstallTip }}"></onos-icon>
            </div>
            <div (click)="(!!selId) ? downloadApp() : ''">
                <onos-icon classes="{{ ctrlBtnState.selection?'active-rect download':'download' }}"
                        iconId="download" iconSize="42" toolTip="{{ downloadTip }}"></onos-icon>
            </div>
        </div>
        <div class="search">
            <input id="searchinput" [(ngModel)]="tableDataFilter.queryStr" type="search" #search placeholder="Search"/>
                   <!--(keyup)="onSearch(search.value)" (search)="onSearch(search.value)"/>-->
            <select [(ngModel)]="tableDataFilter.queryBy">
                <!--(change)="onSearchBy($event)" (change)="search.value = ''">-->
                <option value="" disabled>Search By</option>
                <option value="$">All Fields</option>
                <option value="title">{{lionFn('title')}}</option>
                <option value="id">{{lionFn('app_id')}}</option>
                <option value="version">{{lionFn('version')}}</option>
                <option value="category">{{lionFn('category')}}</option>
                <option value="origin">{{lionFn('origin')}}</option>
            </select>
        </div>

    </div>

    <div id="summary-list" class="summary-list" onosTableResize>
        <div class="table-header">
            <table>
                <tr>
                    <th colId="state" [ngStyle]="{width: '32px'}" class="table-icon" (click)="onSort('state')">
                        <onos-icon classes="active-sort" [iconSize]="10" [iconId]="sortIcon('state')"></onos-icon>
                    </th>
                    <th colId="icon" [ngStyle]="{width: '32px'}" class="table-icon"></th>
                    <th colId="title"  (click)="onSort('title')">{{lionFn('title')}}
                        <onos-icon classes="active-sort" [iconSize]="10" [iconId]="sortIcon('title')"></onos-icon>
                    </th>
                    <th colId="id" (click)="onSort('id')">{{lionFn('app_id')}}
                        <onos-icon classes="active-sort" [iconSize]="10" [iconId]="sortIcon('id')"></onos-icon>
                    </th>
                    <th colId="version" (click)="onSort('version')"> {{lionFn('version')}}
                        <onos-icon classes="active-sort" [iconSize]="10" [iconId]="sortIcon('version')"></onos-icon>
                    </th>
                    <th colId="category" (click)="onSort('category')"> {{lionFn('category')}}
                        <onos-icon classes="active-sort" [iconSize]="10" [iconId]="sortIcon('category')"></onos-icon>
                    </th>
                    <th colId="origin" (click)="onSort('origin')"> {{lionFn('origin')}}
                        <onos-icon classes="active-sort" [iconSize]="10" [iconId]="sortIcon('origin')"></onos-icon>
                    </th>
                </tr>
            </table>
        </div>
        <div class="table-body">
            <table>
                <tr *ngIf="tableData.length === 0" class="no-data">
                    <td colspan="5">
                        {{annots.no_rows_msg}}
                    </td>
                </tr>
                <!-- See https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe
                    Angular has dropped the filter and order by pipe that were present in
                    AngularJS - filter and sort the data at source instead -->
                <tr *ngFor="let app of tableData | filter: tableDataFilter"
                    (click)="selectCallback($event, app)"
                    [ngClass]="{selected: app.id === selId, 'data-change': isChanged(app.id)}">
                    <td class="table-icon">
                        <onos-icon iconId="{{app._iconid_state}}"></onos-icon>
                    </td>
                    <td class="table-icon">
                        <!-- The path below gets the app icon from the old GUI path -->
                        <img src="../../ui/rs/applications/{{app.icon}}/icon"
                                                height="24px" width="24px" />
                    </td>
                    <td>{{ app.title }}</td>
                    <td>{{ app.id }}</td>
                    <td>{{ app.version }}</td>
                    <td>{{ app.category }}</td>
                    <td>{{ app.origin }}</td>
                </tr>
            </table>
        </div>
    </div>
    <!-- There are 2 ways this component can be included
     1) Insert it in to the ngFor above and have it created as the row is rendered
        for the row that has a selId != '' OR
     2) Include it here and let selId dictate its state
     The advantage in 2) is that panel can be animated in and out, as it is not
     killed every time the selection changes.
     -->
    <onos-appsdetails class="floatpanels" id="{{ selId }}" (closeEvent)="deselectRow($event)"></onos-appsdetails>

</div>
