<!--
Copyright (C) 2017 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/gr-patch-set-behavior/gr-patch-set-behavior.html">
<link rel="import" href="../../../styles/shared-styles.html">
<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
<link rel="import" href="../../diff/gr-patch-range-select/gr-patch-range-select.html">
<link rel="import" href="../../shared/gr-editable-label/gr-editable-label.html">
<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
<link rel="import" href="../../shared/gr-select/gr-select.html">
<link rel="import" href="../../shared/gr-button/gr-button.html">


<dom-module id="gr-file-list-header">
  <template>
    <style include="shared-styles">
      .prefsButton {
        float: right;
      }
      .collapseToggleButton {
        text-decoration: none;
      }
      .patchInfoEdit.patchInfo-header {
        background-color: #fcfad6;
      }
      .patchInfoOldPatchSet.patchInfo-header {
        background-color: #fff9c4;
      }
      .patchInfoOldPatchSet .latestPatchContainer {
        display: initial;
      }
      .patchInfo-header {
        padding: .5em calc(var(--default-horizontal-margin) / 2);
      }
      .patchInfo-header {
        background-color: #f6f6f6;
        border-bottom: 1px solid #ebebeb;
        display: flex;
        justify-content: space-between;
      }
      .latestPatchContainer {
        display: none;
      }
      gr-editable-label.descriptionLabel {
        max-width: 100%;
      }
      .mobile {
        display: none;
      }
      #diffPrefsContainer,
      .rightControls {
        margin: auto 0 auto auto;
      }
      .patchInfo-header-wrapper {
        width: 100%;
      }
      .showOnEdit {
        display: none;
      }
      .editLoaded .hideOnEdit {
        display: none;
      }
      .editLoaded .showOnEdit {
        display: initial;
      }
      .fileList-header {
        display: flex;
        font-weight: bold;
        justify-content: space-between;
        margin: .5em calc(var(--default-horizontal-margin) / 2);
      }
      .rightControls {
        display: flex;
        flex-wrap: wrap;
        font-weight: normal;
        justify-content: flex-end;
      }
      .separator {
        margin: 0 .25em;
      }
      .expandInline {
        padding-right: .25em;
      }
      .editLoaded .hideOnEdit {
        display: none;
      }
      .editLoaded .showOnEdit {
        display: initial;
      }
      @media screen and (max-width: 50em) {
        .desktop {
          display: none;
        }
      }
    </style>
    <div class$="patchInfo-header [[_computeEditLoadedClass(editLoaded)]] [[_computePatchInfoClass(patchRange.patchNum, allPatchSets)]]">
      <div class="patchInfo-header-wrapper">
        <gr-patch-range-select
            id="rangeSelect"
            comments="[[comments]]"
            change-num="[[changeNum]]"
            patch-range="[[patchRange]]"
            available-patches="[[allPatchSets]]"
            revisions="[[change.revisions]]"
            on-patch-range-change="_handlePatchChange">
        </gr-patch-range-select>
        /
        <gr-commit-info
            change="[[change]]"
            server-config="[[serverConfig]]"
            commit-info="[[commitInfo]]"></gr-commit-info>
        <span class="latestPatchContainer">
          /
          <a href$="[[changeUrl]]">Go to latest patch set</a>
        </span>
        <span class="downloadContainer desktop">
          /
          <gr-button link
              class="download"
              on-tap="_handleDownloadTap">Download</gr-button>
        </span>
        <span class="descriptionContainer hideOnEdit">
          /
          <gr-editable-label
              id="descriptionLabel"
              class="descriptionLabel"
              value="[[_computePatchSetDescription(change, patchRange.patchNum)]]"
              placeholder="[[_computeDescriptionPlaceholder(_descriptionReadOnly)]]"
              read-only="[[_descriptionReadOnly]]"
              on-changed="_handleDescriptionChanged"></gr-editable-label>
        </span>
        <span id="diffPrefsContainer"
            class="hideOnEdit"
            hidden$="[[_computePrefsButtonHidden(diffPrefs, loggedIn)]]"
            hidden>
          <gr-button link
              class="prefsButton desktop"
              on-tap="_handlePrefsTap">Diff Preferences</gr-button>
        </span>
      </div>
    </div>
    <div class="fileList-header">
      <div>Files</div>
      <div class="rightControls">
        <template is="dom-if"
            if="[[_fileListActionsVisible(shownFileCount, _maxFilesForBulkActions)]]">
          <gr-button
              id="expandBtn"
              link
              on-tap="_expandAllDiffs">Show diffs</gr-button>
          <span class="separator">/</span>
          <gr-button
              id="collapseBtn"
              link
              on-tap="_collapseAllDiffs">Hide diffs</gr-button>
        </template>
        <template is="dom-if"
            if="[[!_fileListActionsVisible(shownFileCount, _maxFilesForBulkActions)]]">
          <div class="warning">
            Bulk actions disabled because there are too many files.
          </div>
        </template>
        <span class="separator">/</span>
        <gr-select
            id="modeSelect"
            bind-value="{{diffViewMode}}">
          <select>
            <option value="SIDE_BY_SIDE">Side By Side</option>
            <option value="UNIFIED_DIFF">Unified</option>
          </select>
        </gr-select>
      </div>
    </div>
    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
  </template>
  <script src="gr-file-list-header.js"></script>
</dom-module>
