The reply dialog checks whether there are newer patches than the currently known latest patch so that users can avoid voting on non-latest patches, which would typically be a no-op and have no effect. Formerly, if the patch was known to be non-latest, the [Send] button would be disabled completely and a red warning with a [Reload] button shown. With this change, the [Send] button is no longer disabled, and replies to non-latest patches are allowed, but the warning still appears as an advisory message, and additional wording appears when users attempt to vote. Bug: Issue 6612 Change-Id: Ib8f117dcc96b3fcba255e05a3cc72abb5fc1b14d
		
			
				
	
	
		
			296 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			296 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!--
 | 
						|
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/base-url-behavior/base-url-behavior.html">
 | 
						|
<link rel="import" href="../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.html">
 | 
						|
<link rel="import" href="../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.html">
 | 
						|
<link rel="import" href="../../../behaviors/rest-client-behavior/rest-client-behavior.html">
 | 
						|
<link rel="import" href="../../../bower_components/iron-autogrow-textarea/iron-autogrow-textarea.html">
 | 
						|
<link rel="import" href="../../plugins/gr-endpoint-decorator/gr-endpoint-decorator.html">
 | 
						|
<link rel="import" href="../../shared/gr-account-chip/gr-account-chip.html">
 | 
						|
<link rel="import" href="../../shared/gr-textarea/gr-textarea.html">
 | 
						|
<link rel="import" href="../../shared/gr-button/gr-button.html">
 | 
						|
<link rel="import" href="../../shared/gr-formatted-text/gr-formatted-text.html">
 | 
						|
<link rel="import" href="../../shared/gr-js-api-interface/gr-js-api-interface.html">
 | 
						|
<link rel="import" href="../../shared/gr-overlay/gr-overlay.html">
 | 
						|
<link rel="import" href="../../shared/gr-rest-api-interface/gr-rest-api-interface.html">
 | 
						|
<link rel="import" href="../../shared/gr-storage/gr-storage.html">
 | 
						|
<link rel="import" href="../gr-account-list/gr-account-list.html">
 | 
						|
<link rel="import" href="../gr-label-scores/gr-label-scores.html">
 | 
						|
<link rel="import" href="../../../styles/shared-styles.html">
 | 
						|
 | 
						|
<dom-module id="gr-reply-dialog">
 | 
						|
  <template>
 | 
						|
    <style include="shared-styles">
 | 
						|
      :host {
 | 
						|
        display: block;
 | 
						|
        max-height: 100%;
 | 
						|
      }
 | 
						|
      :host([disabled]) {
 | 
						|
        pointer-events: none;
 | 
						|
      }
 | 
						|
      :host([disabled]) .container {
 | 
						|
        opacity: .5;
 | 
						|
      }
 | 
						|
      .container {
 | 
						|
        display: flex;
 | 
						|
        flex-direction: column;
 | 
						|
        max-height: 100%;
 | 
						|
      }
 | 
						|
      section {
 | 
						|
        border-top: 1px solid #cdcdcd;
 | 
						|
        flex-shrink: 0;
 | 
						|
        padding: .5em 1.5em;
 | 
						|
        width: 100%;
 | 
						|
      }
 | 
						|
      .actions {
 | 
						|
        background-color: var(--view-background-color);
 | 
						|
        bottom: 0;
 | 
						|
        display: flex;
 | 
						|
        justify-content: space-between;
 | 
						|
        position: sticky;
 | 
						|
      }
 | 
						|
      .actions .right gr-button {
 | 
						|
        margin-left: 1em;
 | 
						|
      }
 | 
						|
      .peopleContainer,
 | 
						|
      .labelsContainer {
 | 
						|
        flex-shrink: 0;
 | 
						|
      }
 | 
						|
      .peopleContainer {
 | 
						|
        display: table;
 | 
						|
      }
 | 
						|
      .peopleList {
 | 
						|
        display: flex;
 | 
						|
        padding-top: .1em;
 | 
						|
      }
 | 
						|
      .peopleListLabel {
 | 
						|
        color: #666;
 | 
						|
        margin-top: .2em;
 | 
						|
        min-width: 7em;
 | 
						|
        padding-right: .5em;
 | 
						|
      }
 | 
						|
      gr-account-list {
 | 
						|
        display: flex;
 | 
						|
        flex-wrap: wrap;
 | 
						|
        flex: 1;
 | 
						|
        min-height: 1.8em;
 | 
						|
      }
 | 
						|
      #reviewerConfirmationOverlay {
 | 
						|
        padding: 1em;
 | 
						|
        text-align: center;
 | 
						|
      }
 | 
						|
      .reviewerConfirmationButtons {
 | 
						|
        margin-top: 1em;
 | 
						|
      }
 | 
						|
      .groupName {
 | 
						|
        font-family: var(--font-family-bold);
 | 
						|
      }
 | 
						|
      .groupSize {
 | 
						|
        font-style: italic;
 | 
						|
      }
 | 
						|
      .textareaContainer {
 | 
						|
        min-height: 12em;
 | 
						|
        position: relative;
 | 
						|
      }
 | 
						|
      .textareaContainer,
 | 
						|
      #textarea,
 | 
						|
      gr-endpoint-decorator {
 | 
						|
        display: flex;
 | 
						|
        width: 100%;
 | 
						|
      }
 | 
						|
      .previewContainer gr-formatted-text {
 | 
						|
        background: #f6f6f6;
 | 
						|
        padding: 1em;
 | 
						|
      }
 | 
						|
      .draftsContainer h3 {
 | 
						|
        margin-top: .25em;
 | 
						|
      }
 | 
						|
      #checkingStatusLabel,
 | 
						|
      #notLatestLabel {
 | 
						|
        margin-left: 1em;
 | 
						|
      }
 | 
						|
      #checkingStatusLabel {
 | 
						|
        color: #444;
 | 
						|
        font-style: italic;
 | 
						|
      }
 | 
						|
      #notLatestLabel,
 | 
						|
      #savingLabel {
 | 
						|
        color: red;
 | 
						|
      }
 | 
						|
      #savingLabel {
 | 
						|
        display: none;
 | 
						|
      }
 | 
						|
      #savingLabel.saving {
 | 
						|
        display: inline;
 | 
						|
      }
 | 
						|
    </style>
 | 
						|
    <div class="container" tabindex="-1">
 | 
						|
      <section class="peopleContainer">
 | 
						|
        <div class="peopleList">
 | 
						|
          <div class="peopleListLabel">Reviewers</div>
 | 
						|
          <gr-account-list
 | 
						|
              id="reviewers"
 | 
						|
              accounts="{{_reviewers}}"
 | 
						|
              removable-values="[[change.removable_reviewers]]"
 | 
						|
              change="[[change]]"
 | 
						|
              filter="[[filterReviewerSuggestion]]"
 | 
						|
              pending-confirmation="{{_reviewerPendingConfirmation}}"
 | 
						|
              placeholder="Add reviewer..."
 | 
						|
              on-account-text-changed="_handleAccountTextEntry">
 | 
						|
          </gr-account-list>
 | 
						|
        </div>
 | 
						|
        <template is="dom-if" if="[[serverConfig.note_db_enabled]]">
 | 
						|
          <div class="peopleList">
 | 
						|
            <div class="peopleListLabel">CC</div>
 | 
						|
            <gr-account-list
 | 
						|
                id="ccs"
 | 
						|
                accounts="{{_ccs}}"
 | 
						|
                change="[[change]]"
 | 
						|
                filter="[[filterCCSuggestion]]"
 | 
						|
                pending-confirmation="{{_ccPendingConfirmation}}"
 | 
						|
                allow-any-input
 | 
						|
                placeholder="Add CC..."
 | 
						|
                on-account-text-changed="_handleAccountTextEntry">
 | 
						|
            </gr-account-list>
 | 
						|
          </div>
 | 
						|
        </template>
 | 
						|
        <gr-overlay
 | 
						|
            id="reviewerConfirmationOverlay"
 | 
						|
            on-iron-overlay-canceled="_cancelPendingReviewer"
 | 
						|
            with-backdrop>
 | 
						|
          <div class="reviewerConfirmation">
 | 
						|
            Group
 | 
						|
            <span class="groupName">
 | 
						|
              [[_pendingConfirmationDetails.group.name]]
 | 
						|
            </span>
 | 
						|
            has
 | 
						|
            <span class="groupSize">
 | 
						|
              [[_pendingConfirmationDetails.count]]
 | 
						|
            </span>
 | 
						|
            members.
 | 
						|
            <br>
 | 
						|
            Are you sure you want to add them all?
 | 
						|
          </div>
 | 
						|
          <div class="reviewerConfirmationButtons">
 | 
						|
            <gr-button on-tap="_confirmPendingReviewer">Yes</gr-button>
 | 
						|
            <gr-button on-tap="_cancelPendingReviewer">No</gr-button>
 | 
						|
          </div>
 | 
						|
        </gr-overlay>
 | 
						|
      </section>
 | 
						|
      <section class="textareaContainer">
 | 
						|
        <gr-endpoint-decorator name="reply-text">
 | 
						|
          <gr-textarea
 | 
						|
              id="textarea"
 | 
						|
              class="message"
 | 
						|
              autocomplete="on"
 | 
						|
              placeholder=[[_messagePlaceholder]]
 | 
						|
              fixed-position-dropdown
 | 
						|
              hide-border="true"
 | 
						|
              monospace="true"
 | 
						|
              disabled="{{disabled}}"
 | 
						|
              rows="4"
 | 
						|
              text="{{draft}}"
 | 
						|
              on-bind-value-changed="_handleHeightChanged">
 | 
						|
          </gr-textarea>
 | 
						|
        </gr-endpoint-decorator>
 | 
						|
      </section>
 | 
						|
      <section class="previewContainer">
 | 
						|
        <label>
 | 
						|
          <input type="checkbox" checked="{{_previewFormatting::change}}">
 | 
						|
          Preview formatting
 | 
						|
        </label>
 | 
						|
        <gr-formatted-text
 | 
						|
            content="[[draft]]"
 | 
						|
            hidden$="[[!_previewFormatting]]"
 | 
						|
            config="[[projectConfig.commentlinks]]"></gr-formatted-text>
 | 
						|
      </section>
 | 
						|
      <section class="labelsContainer">
 | 
						|
        <gr-label-scores
 | 
						|
            id="labelScores"
 | 
						|
            account="[[_account]]"
 | 
						|
            change="[[change]]"
 | 
						|
            on-labels-changed="_handleLabelsChanged"
 | 
						|
            permitted-labels=[[permittedLabels]]></gr-label-scores>
 | 
						|
      </section>
 | 
						|
      <section class="draftsContainer" hidden$="[[_computeHideDraftList(diffDrafts)]]">
 | 
						|
        <div class="includeComments">
 | 
						|
          <input type="checkbox" id="includeComments"
 | 
						|
              checked="{{_includeComments::change}}">
 | 
						|
          <label for="includeComments">Publish [[_computeDraftsTitle(diffDrafts)]]</label>
 | 
						|
        </div>
 | 
						|
        <gr-comment-list
 | 
						|
            id="commentList"
 | 
						|
            comments="[[diffDrafts]]"
 | 
						|
            change-num="[[change._number]]"
 | 
						|
            project-config="[[projectConfig]]"
 | 
						|
            patch-num="[[patchNum]]"
 | 
						|
            hidden$="[[!_includeComments]]"></gr-comment-list>
 | 
						|
        <span
 | 
						|
            id="savingLabel"
 | 
						|
            class$="[[_computeSavingLabelClass(_savingComments)]]">
 | 
						|
          Saving comments...
 | 
						|
        </span>
 | 
						|
      </section>
 | 
						|
      <section class="actions">
 | 
						|
        <div class="left">
 | 
						|
          <template is="dom-if" if="[[canBeStarted]]">
 | 
						|
            <gr-button
 | 
						|
                link
 | 
						|
                tertiary
 | 
						|
                disabled="[[_isState(knownLatestState, 'not-latest')]]"
 | 
						|
                class="action save"
 | 
						|
                has-tooltip
 | 
						|
                title="[[_saveTooltip]]"
 | 
						|
                on-tap="_saveTapHandler">Save</gr-button>
 | 
						|
          </template>
 | 
						|
          <span
 | 
						|
              id="checkingStatusLabel"
 | 
						|
              hidden$="[[!_isState(knownLatestState, 'checking')]]">
 | 
						|
            Checking whether patch [[patchNum]] is latest...
 | 
						|
          </span>
 | 
						|
          <span
 | 
						|
              id="notLatestLabel"
 | 
						|
              hidden$="[[!_isState(knownLatestState, 'not-latest')]]">
 | 
						|
            [[_computePatchSetWarning(patchNum, _labelsChanged)]]
 | 
						|
            <gr-button link on-tap="_reload">Reload</gr-button>
 | 
						|
          </span>
 | 
						|
        </div>
 | 
						|
        <div class="right">
 | 
						|
          <gr-button
 | 
						|
              link
 | 
						|
              id="cancelButton"
 | 
						|
              class="action cancel"
 | 
						|
              on-tap="_cancelTapHandler">Cancel</gr-button>
 | 
						|
          <gr-button
 | 
						|
              link
 | 
						|
              primary
 | 
						|
              disabled="[[_computeSendButtonDisabled(_sendButtonLabel, diffDrafts, draft, _reviewersMutated, _labelsChanged, _includeComments)]]"
 | 
						|
              class="action send"
 | 
						|
              has-tooltip
 | 
						|
              title$="[[_computeSendButtonTooltip(canBeStarted)]]"
 | 
						|
              on-tap="_sendTapHandler">[[_sendButtonLabel]]</gr-button>
 | 
						|
        </div>
 | 
						|
      </section>
 | 
						|
    </div>
 | 
						|
    <gr-js-api-interface id="jsAPI"></gr-js-api-interface>
 | 
						|
    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
 | 
						|
    <gr-storage id="storage"></gr-storage>
 | 
						|
  </template>
 | 
						|
  <script src="gr-reply-dialog.js"></script>
 | 
						|
</dom-module>
 |