<!--
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="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
<link rel="import" href="../../../bower_components/polymer/polymer.html">
<link rel="import" href="../../shared/gr-select/gr-select.html">
<link rel="import" href="../../../styles/shared-styles.html">

<dom-module id="gr-patch-range-select">
  <template>
    <style include="shared-styles">
      .patchRange {
        display: inline-block;
      }
      select {
        max-width: 15em;
      }
      @media screen and (max-width: 50em) {
        .filesWeblinks {
          display: none;
        }
        select {
          max-width: 5.25em;
        }
      }
    </style>
    Patch set:
    <span class="patchRange">
      <gr-select id="leftPatchSelect" bind-value="{{_leftSelected}}"
          on-change="_handlePatchChange">
        <select>
          <option value="PARENT">Base</option>
          <template is="dom-repeat" items="{{availablePatches}}" as="basePatchNum">
            <option value$="[[basePatchNum.num]]"
                disabled$="[[_computeLeftDisabled(basePatchNum.num, patchRange.patchNum, _sortedRevisions)]]">
              [[basePatchNum.num]]
              [[_computePatchSetCommentsString(comments, basePatchNum.num)]]
              [[_computePatchSetDescription(revisions, basePatchNum.num)]]
            </option>
          </template>
        </select>
      </gr-select>
    </span>
    <span is="dom-if" if="[[filesWeblinks.meta_a]]" class="filesWeblinks">
      <template is="dom-repeat" items="[[filesWeblinks.meta_a]]" as="weblink">
        <a target="_blank" rel="noopener"
           href$="[[weblink.url]]">[[weblink.name]]</a>
      </template>
    </span>
    &rarr;
    <span class="patchRange">
      <gr-select id="rightPatchSelect" bind-value="{{_rightSelected}}"
          on-change="_handlePatchChange">
        <select>
          <template is="dom-repeat" items="{{availablePatches}}" as="patchNum">
            <option value$="[[patchNum.num]]"
                disabled$="[[_computeRightDisabled(patchNum.num, patchRange.basePatchNum, _sortedRevisions)]]">
              [[patchNum.num]]
              [[_computePatchSetCommentsString(comments, patchNum.num)]]
              [[_computePatchSetDescription(revisions, patchNum.num)]]
            </option>
          </template>
        </select>
      </gr-select>
      <span is="dom-if" if="[[filesWeblinks.meta_b]]" class="filesWeblinks">
        <template is="dom-repeat" items="[[filesWeblinks.meta_b]]" as="weblink">
          <a target="_blank"
             href$="[[weblink.url]]">[[weblink.name]]</a>
        </template>
      </span>
    </span>
  </template>
  <script src="gr-patch-range-select.js"></script>
</dom-module>
