<!--
Copyright (C) 2015 The Android Open Source Project

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

<link rel="import" href="../../../bower_components/polymer/polymer.html">
<link rel="import" href="../../../behaviors/keyboard-shortcut-behavior.html">
<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">

<dom-module id="gr-file-list">
  <template>
    <style>
      :host {
        display: block;
      }
      .row {
        display: flex;
        padding: .1em .25em;
      }
      .header {
        font-weight: bold;
      }
      .positionIndicator,
      .reviewed,
      .status {
        align-items: center;
        display: inline-flex;
      }
      .reviewed,
      .status {
        display: inline-block;
        text-align: center;
        width: 1.5em;
      }
      .positionIndicator {
        justify-content: flex-start;
        visibility: hidden;
        width: 1.25em;
      }
      .row:not(.header):hover {
        background-color: #f5fafd;
      }
      .row[selected] {
        background-color: #ebf5fb;
      }
      .row[selected] .positionIndicator {
        visibility: visible;
      }
      .path {
        flex: 1;
        overflow: hidden;
        padding-left: .35em;
        text-overflow: ellipsis;
        white-space: nowrap;
      }
      .path a {
        text-decoration: none;
      }
      .path a:hover {
        text-decoration: underline;
      }
      .oldPath {
        color: #999;
        overflow: hidden;
        text-overflow: ellipsis;
      }
      .comments,
      .stats {
        text-align: right;
      }
      .comments {
        min-width: 10em;
      }
      .stats {
        min-width: 7em;
      }
      .invisible {
        visibility: hidden;
      }
      .row:not(.header) .stats {
        font-family: var(--monospace-font-family);
      }
      .added {
        color: #388E3C;
      }
      .removed {
        color: #D32F2F;
      }
      .drafts {
        color: #C62828;
        font-weight: bold;
      }
      @media screen and (max-width: 50em) {
        .row[selected] {
          background-color: transparent;
        }
        .positionIndicator,
        .stats {
          display: none;
        }
        .reviewed,
        .status {
          justify-content: flex-start;
        }
        .comments {
          min-width: initial;
        }
      }
    </style>
    <div class="row header">
      <div class="positionIndicator"></div>
      <div class="reviewed" hidden$="[[!_loggedIn]]" hidden></div>
      <div class="status"></div>
      <div class="path">Path</div>
      <div class="comments">Comments</div>
      <div class="stats">Stats</div>
    </div>
    <template is="dom-repeat" items="{{_files}}" as="file">
      <div class="row" selected$="[[_computeFileSelected(index, selectedIndex)]]">
        <div class="positionIndicator">&#x25b6;</div>
        <div class="reviewed" hidden$="[[!_loggedIn]]" hidden>
          <input type="checkbox" checked$="[[_computeReviewed(file, _reviewed)]]"
              data-path$="[[file.__path]]" on-change="_handleReviewedChange">
        </div>
        <div class$="[[_computeClass('status', file.__path)]]">
          [[_computeFileStatus(file.status)]]
        </div>
        <div class="path">
          <a href$="[[_computeDiffURL(changeNum, patchNum, file.__path)]]"
              title="[[_computeFileDisplayName(file.__path)]]">
            [[_computeFileDisplayName(file.__path)]]
          </a>
          <div class="oldPath" hidden$="[[!file.old_path]]" hidden
              title="[[file.old_path]]">
            [[file.old_path]]
          </div>
        </div>
        <div class="comments">
          <span class="drafts">[[_computeDraftsString(drafts, patchNum, file.__path)]]</span>
          [[_computeCommentsString(comments, patchNum, file.__path)]]
        </div>
        <div class$="[[_computeClass('stats', file.__path)]]">
          <span class="added">+[[file.lines_inserted]]</span>
          <span class="removed">-[[file.lines_deleted]]</span>
        </div>
      </div>
    </template>
    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
  </template>
  <script src="gr-file-list.js"></script>
</dom-module>
