Previously, PolyGerrit relied on the default value of the loading flag
in the diff view to show/hide the appropriate diff panels (or loading
message). Because of this, stale information is displayed when a user
navigates between different files within the same diff view.
With this change, the `_loading` flag is set before the major API calls
are made, and the loading message is made more obvious.
Bug: Issue 7381
Change-Id: Id70d981a2c72fef9f44a32c5463dc43c3ce41cf6
(cherry picked from commit 29b2ab4a69)
		
	
		
			
				
	
	
		
			372 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			372 lines
		
	
	
		
			12 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/gr-patch-set-behavior/gr-patch-set-behavior.html">
 | 
						|
<link rel="import" href="../../../behaviors/gr-path-list-behavior/gr-path-list-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-dropdown/iron-dropdown.html">
 | 
						|
<link rel="import" href="../../core/gr-navigation/gr-navigation.html">
 | 
						|
<link rel="import" href="../../shared/gr-button/gr-button.html">
 | 
						|
<link rel="import" href="../../shared/gr-fixed-panel/gr-fixed-panel.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="../gr-comment-api/gr-comment-api.html">
 | 
						|
<link rel="import" href="../gr-diff-cursor/gr-diff-cursor.html">
 | 
						|
<link rel="import" href="../gr-diff-preferences/gr-diff-preferences.html">
 | 
						|
<link rel="import" href="../gr-diff/gr-diff.html">
 | 
						|
<link rel="import" href="../gr-patch-range-select/gr-patch-range-select.html">
 | 
						|
<link rel="import" href="../../../styles/shared-styles.html">
 | 
						|
 | 
						|
<dom-module id="gr-diff-view">
 | 
						|
  <template>
 | 
						|
    <style include="shared-styles">
 | 
						|
      :host {
 | 
						|
        background-color: var(--view-background-color);
 | 
						|
      }
 | 
						|
      gr-patch-range-select {
 | 
						|
        display: block;
 | 
						|
      }
 | 
						|
      gr-diff {
 | 
						|
        border: none;
 | 
						|
      }
 | 
						|
      gr-fixed-panel {
 | 
						|
        background-color: #fff;
 | 
						|
        border-bottom: 1px #eee solid;
 | 
						|
        z-index: 1;
 | 
						|
      }
 | 
						|
      header,
 | 
						|
      .subHeader {
 | 
						|
        align-items: center;
 | 
						|
        display: flex;
 | 
						|
        justify-content: space-between;
 | 
						|
      }
 | 
						|
      header {
 | 
						|
        padding: .75em var(--default-horizontal-margin);
 | 
						|
      }
 | 
						|
      .patchRangeLeft {
 | 
						|
        align-items: center;
 | 
						|
        display: flex;
 | 
						|
      }
 | 
						|
      .navLink:not([href]),
 | 
						|
      .downloadLink:not([href]) {
 | 
						|
        color: #999;
 | 
						|
      }
 | 
						|
      .navLinks {
 | 
						|
        white-space: nowrap;
 | 
						|
      }
 | 
						|
      .reviewed {
 | 
						|
        display: inline-block;
 | 
						|
        margin: 0 .25em;
 | 
						|
        vertical-align: .15em;
 | 
						|
      }
 | 
						|
      .jumpToFileContainer {
 | 
						|
        display: inline-block;
 | 
						|
      }
 | 
						|
      .mobile {
 | 
						|
        display: none;
 | 
						|
      }
 | 
						|
      .dropdown-trigger {
 | 
						|
        cursor: pointer;
 | 
						|
        padding: 0;
 | 
						|
      }
 | 
						|
      iron-dropdown {
 | 
						|
        position: absolute;
 | 
						|
      }
 | 
						|
      .dropdown-content {
 | 
						|
        background-color: #fff;
 | 
						|
        box-shadow: 0 1px 5px rgba(0, 0, 0, .3);
 | 
						|
        max-height: 70vh;
 | 
						|
      }
 | 
						|
      .dropdown-content a {
 | 
						|
        cursor: pointer;
 | 
						|
        display: block;
 | 
						|
        font-weight: normal;
 | 
						|
        padding: .3em .5em;
 | 
						|
      }
 | 
						|
      .dropdown-content a:before {
 | 
						|
        color: #ccc;
 | 
						|
        content: attr(data-key-nav);
 | 
						|
        display: inline-block;
 | 
						|
        margin-right: .5em;
 | 
						|
        width: .3em;
 | 
						|
      }
 | 
						|
      .dropdown-content a:hover {
 | 
						|
        background-color: var(--color-link);
 | 
						|
        color: #fff;
 | 
						|
      }
 | 
						|
      .dropdown-content a[selected] {
 | 
						|
        color: #000;
 | 
						|
        font-family: var(--font-family-bold);
 | 
						|
        pointer-events: none;
 | 
						|
        text-decoration: none;
 | 
						|
      }
 | 
						|
      .dropdown-content a[selected]:hover {
 | 
						|
        background-color: #fff;
 | 
						|
        color: #000;
 | 
						|
      }
 | 
						|
      gr-button {
 | 
						|
        padding: .3em 0;
 | 
						|
        text-decoration: none;
 | 
						|
      }
 | 
						|
      .loading {
 | 
						|
        color: #777;
 | 
						|
        font-size: 2em;
 | 
						|
        height: 100%;
 | 
						|
        padding: 1em var(--default-horizontal-margin);
 | 
						|
        text-align: center;
 | 
						|
      }
 | 
						|
      .subHeader {
 | 
						|
        flex-wrap: wrap;
 | 
						|
        margin: 0 var(--default-horizontal-margin) .75em;
 | 
						|
      }
 | 
						|
      .subHeader > div {
 | 
						|
        margin-top: .25em;
 | 
						|
      }
 | 
						|
      .prefsButton {
 | 
						|
        text-align: right;
 | 
						|
      }
 | 
						|
      .separator {
 | 
						|
        margin: 0 .25em;
 | 
						|
      }
 | 
						|
      .noOverflow {
 | 
						|
        display: block;
 | 
						|
        overflow: auto;
 | 
						|
      }
 | 
						|
      #trigger {
 | 
						|
        -moz-user-select: text;
 | 
						|
        -ms-user-select: text;
 | 
						|
        -webkit-user-select: text;
 | 
						|
        user-select: text;
 | 
						|
      }
 | 
						|
      .editLoaded .hideOnEdit {
 | 
						|
        display: none;
 | 
						|
      }
 | 
						|
      .blameLoader {
 | 
						|
        display: none;
 | 
						|
      }
 | 
						|
      .blameLoader.show {
 | 
						|
        display: inline;
 | 
						|
      }
 | 
						|
      @media screen and (max-width: 50em) {
 | 
						|
        header {
 | 
						|
          padding: .5em var(--default-horizontal-margin);
 | 
						|
        }
 | 
						|
        .dash {
 | 
						|
          display: none;
 | 
						|
        }
 | 
						|
        .desktop {
 | 
						|
          display: none;
 | 
						|
        }
 | 
						|
        .fileNav {
 | 
						|
          align-items: flex-start;
 | 
						|
          display: flex;
 | 
						|
          margin: 0 .25em;
 | 
						|
        }
 | 
						|
        .fullFileName {
 | 
						|
          display: block;
 | 
						|
          font-size: .9em;
 | 
						|
          font-style: italic;
 | 
						|
          min-width: 50%;
 | 
						|
          padding: 0 .1em;
 | 
						|
          text-align: center;
 | 
						|
          width: 100%;
 | 
						|
          word-wrap: break-word;
 | 
						|
        }
 | 
						|
        .reviewed {
 | 
						|
          vertical-align: -.1em;
 | 
						|
        }
 | 
						|
        .mobileJumpToFileContainer {
 | 
						|
          display: block;
 | 
						|
          width: 100%;
 | 
						|
        }
 | 
						|
        .mobileJumpToFileContainer select {
 | 
						|
          width: 100%;
 | 
						|
        }
 | 
						|
        .mobileNavLink {
 | 
						|
          color: #000;
 | 
						|
          font-size: 1.5em;
 | 
						|
          font-family: var(--font-family-bold);
 | 
						|
          text-decoration: none;
 | 
						|
        }
 | 
						|
        .mobileNavLink:not([href]) {
 | 
						|
          color: #bbb;
 | 
						|
        }
 | 
						|
      }
 | 
						|
    </style>
 | 
						|
    <gr-fixed-panel
 | 
						|
        class$="[[_computeContainerClass(_editLoaded)]]"
 | 
						|
        floating-disabled="[[_panelFloatingDisabled]]"
 | 
						|
        keep-on-scroll
 | 
						|
        ready-for-measure="[[!_loading]]">
 | 
						|
      <header>
 | 
						|
        <h3>
 | 
						|
          <a href$="[[_computeChangePath(_change, _patchRange.*, _change.revisions)]]">
 | 
						|
            [[_changeNum]]</a><span>:</span>
 | 
						|
          <span>[[_change.subject]]</span>
 | 
						|
          <span class="dash">—</span>
 | 
						|
          <input id="reviewed"
 | 
						|
              class="reviewed hideOnEdit"
 | 
						|
              type="checkbox"
 | 
						|
              on-change="_handleReviewedChange"
 | 
						|
              hidden$="[[!_loggedIn]]" hidden>
 | 
						|
          <div class="jumpToFileContainer desktop">
 | 
						|
            <gr-button
 | 
						|
                down-arrow
 | 
						|
                no-uppercase
 | 
						|
                link
 | 
						|
                class="dropdown-trigger"
 | 
						|
                id="trigger"
 | 
						|
                on-tap="_showDropdownTapHandler">
 | 
						|
              <span>[[computeDisplayPath(_path)]]</span>
 | 
						|
            </gr-button>
 | 
						|
            <!-- *-align="" to disable iron-dropdown's element positioning. -->
 | 
						|
            <iron-dropdown id="dropdown"
 | 
						|
                allow-outside-scroll
 | 
						|
                vertical-align=""
 | 
						|
                horizontal-align="">
 | 
						|
              <div class="dropdown-content" slot="dropdown-content">
 | 
						|
                <template
 | 
						|
                    is="dom-repeat"
 | 
						|
                    items="[[_fileList]]"
 | 
						|
                    as="path"
 | 
						|
                    initial-count="75">
 | 
						|
                  <a href$="[[_computeDiffURL(_change, _patchRange.*, path)]]"
 | 
						|
                    selected$="[[_computeFileSelected(path, _path)]]"
 | 
						|
                    data-key-nav$="[[_computeKeyNav(path, _path, _fileList)]]"
 | 
						|
                    on-tap="_handleFileTap">[[computeDisplayPath(path)]]</a>
 | 
						|
                </template>
 | 
						|
              </div>
 | 
						|
            </iron-dropdown>
 | 
						|
          </div>
 | 
						|
          <div class="mobileJumpToFileContainer mobile">
 | 
						|
            <select on-change="_handleMobileSelectChange">
 | 
						|
              <template is="dom-repeat" items="[[_fileList]]" as="path">
 | 
						|
                <option
 | 
						|
                    value$="[[path]]"
 | 
						|
                    selected$="[[_computeFileSelected(path, _path)]]">
 | 
						|
                  [[computeTruncatedPath(path)]]
 | 
						|
                </option>
 | 
						|
              </template>
 | 
						|
            </select>
 | 
						|
          </div>
 | 
						|
        </h3>
 | 
						|
        <div class="navLinks desktop">
 | 
						|
          <a class="navLink"
 | 
						|
              href$="[[_computeNavLinkURL(_change, _path, _fileList, -1, 1)]]">
 | 
						|
            Prev</a>
 | 
						|
          /
 | 
						|
          <a class="navLink"
 | 
						|
              href$="[[_computeChangePath(_change, _patchRange.*, _change.revisions)]]">
 | 
						|
            Up</a>
 | 
						|
          /
 | 
						|
          <a class="navLink"
 | 
						|
              href$="[[_computeNavLinkURL(_change, _path, _fileList, 1, 1)]]">
 | 
						|
            Next</a>
 | 
						|
        </div>
 | 
						|
      </header>
 | 
						|
      <div class="subHeader">
 | 
						|
        <div class="patchRangeLeft">
 | 
						|
          <gr-patch-range-select
 | 
						|
              id="rangeSelect"
 | 
						|
              change-num="[[_changeNum]]"
 | 
						|
              patch-num="{{_patchNum}}"
 | 
						|
              base-patch-num="{{_basePatchNum}}"
 | 
						|
              files-weblinks="[[_filesWeblinks]]"
 | 
						|
              available-patches="[[_allPatchSets]]"
 | 
						|
              revisions="[[_change.revisions]]">
 | 
						|
          </gr-patch-range-select>
 | 
						|
          <span class="download desktop">
 | 
						|
            <span class="separator">/</span>
 | 
						|
            <a
 | 
						|
              class="downloadLink"
 | 
						|
              download
 | 
						|
              href$="[[_computeDownloadLink(_changeNum, _patchRange, _path)]]">
 | 
						|
              Download
 | 
						|
            </a>
 | 
						|
          </span>
 | 
						|
        </div>
 | 
						|
        <div>
 | 
						|
          <gr-select
 | 
						|
              id="modeSelect"
 | 
						|
              bind-value="{{changeViewState.diffMode}}"
 | 
						|
              hidden$="[[_computeModeSelectHidden(_isImageDiff)]]">
 | 
						|
            <select>
 | 
						|
              <option value="SIDE_BY_SIDE">Side By Side</option>
 | 
						|
              <option value="UNIFIED_DIFF">Unified</option>
 | 
						|
            </select>
 | 
						|
          </gr-select>
 | 
						|
          <span id="diffPrefsContainer"
 | 
						|
              hidden$="[[_computePrefsButtonHidden(_prefs, _loggedIn)]]" hidden>
 | 
						|
            <span class="preferences desktop">
 | 
						|
              <span
 | 
						|
                  hidden$="[[_computeModeSelectHidden(_isImageDiff)]]">/</span>
 | 
						|
              <gr-button link
 | 
						|
                  class="prefsButton"
 | 
						|
                  on-tap="_handlePrefsTap">Preferences</gr-button>
 | 
						|
            </span>
 | 
						|
          </span>
 | 
						|
          <span class$="blameLoader [[_computeBlameLoaderClass(_isImageDiff, _isBlameSupported)]]">
 | 
						|
            <span class="separator">/</span>
 | 
						|
            <gr-button
 | 
						|
                link
 | 
						|
                disabled="[[_isBlameLoading]]"
 | 
						|
                on-tap="_toggleBlame">[[_computeBlameToggleLabel(_isBlameLoaded, _isBlameLoading)]]</gr-button>
 | 
						|
          </span>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
      <div class="fileNav mobile">
 | 
						|
        <a class="mobileNavLink"
 | 
						|
          href$="[[_computeNavLinkURL(_change, _path, _fileList, -1, 1)]]">
 | 
						|
          <</a>
 | 
						|
        <div class="fullFileName mobile">[[computeDisplayPath(_path)]]
 | 
						|
        </div>
 | 
						|
        <a class="mobileNavLink"
 | 
						|
            href$="[[_computeNavLinkURL(_change, _path, _fileList, 1, 1)]]">
 | 
						|
          ></a>
 | 
						|
      </div>
 | 
						|
    </gr-fixed-panel>
 | 
						|
    <div class="loading" hidden$="[[!_loading]]">Loading...</div>
 | 
						|
    <gr-diff
 | 
						|
        id="diff"
 | 
						|
        hidden
 | 
						|
        hidden$="[[_loading]]"
 | 
						|
        class$="[[_computeDiffClass(_panelFloatingDisabled)]]"
 | 
						|
        is-image-diff="{{_isImageDiff}}"
 | 
						|
        files-weblinks="{{_filesWeblinks}}"
 | 
						|
        change-num="[[_changeNum]]"
 | 
						|
        patch-range="[[_patchRange]]"
 | 
						|
        path="[[_path]]"
 | 
						|
        prefs="[[_prefs]]"
 | 
						|
        project-config="[[_projectConfig]]"
 | 
						|
        project-name="[[_change.project]]"
 | 
						|
        view-mode="[[_diffMode]]"
 | 
						|
        is-blame-loaded="{{_isBlameLoaded}}"
 | 
						|
        on-line-selected="_onLineSelected">
 | 
						|
    </gr-diff>
 | 
						|
    <gr-diff-preferences
 | 
						|
        id="diffPreferences"
 | 
						|
        prefs="{{_prefs}}"
 | 
						|
        local-prefs="{{_localPrefs}}"></gr-diff-preferences>
 | 
						|
    <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
 | 
						|
    <gr-storage id="storage"></gr-storage>
 | 
						|
    <gr-diff-cursor id="cursor"></gr-diff-cursor>
 | 
						|
    <gr-comment-api id="commentAPI"></gr-comment-api>
 | 
						|
  </template>
 | 
						|
  <script src="gr-diff-view.js"></script>
 | 
						|
</dom-module>
 |