Add two new dynamic endpoints on gr-file-list
These endpoints are used to prepend new columns to the file list table. Also added a new plugin sample for demo purpose. Screenshot: https://imgur.com/gsr3n7I Change-Id: I89cc2797b39eb365dd63958b87943554e5479502
This commit is contained in:
		@@ -225,6 +225,11 @@ class GrFileList extends mixinBehaviors( [
 | 
			
		||||
        computed: '_computeShowDynamicColumns(_dynamicHeaderEndpoints, ' +
 | 
			
		||||
                '_dynamicContentEndpoints, _dynamicSummaryEndpoints)',
 | 
			
		||||
      },
 | 
			
		||||
      _showPrependedDynamicColumns: {
 | 
			
		||||
        type: Boolean,
 | 
			
		||||
        computed: '_computeShowPrependedDynamicColumns(' +
 | 
			
		||||
        '_dynamicPrependedHeaderEndpoints, _dynamicPrependedContentEndpoints)',
 | 
			
		||||
      },
 | 
			
		||||
      /** @type {Array<string>} */
 | 
			
		||||
      _dynamicHeaderEndpoints: {
 | 
			
		||||
        type: Array,
 | 
			
		||||
@@ -237,6 +242,14 @@ class GrFileList extends mixinBehaviors( [
 | 
			
		||||
      _dynamicSummaryEndpoints: {
 | 
			
		||||
        type: Array,
 | 
			
		||||
      },
 | 
			
		||||
      /** @type {Array<string>} */
 | 
			
		||||
      _dynamicPrependedHeaderEndpoints: {
 | 
			
		||||
        type: Array,
 | 
			
		||||
      },
 | 
			
		||||
      /** @type {Array<string>} */
 | 
			
		||||
      _dynamicPrependedContentEndpoints: {
 | 
			
		||||
        type: Array,
 | 
			
		||||
      },
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
@@ -295,18 +308,27 @@ class GrFileList extends mixinBehaviors( [
 | 
			
		||||
  attached() {
 | 
			
		||||
    super.attached();
 | 
			
		||||
    pluginLoader.awaitPluginsLoaded().then(() => {
 | 
			
		||||
      this._dynamicHeaderEndpoints = pluginEndpoints.getDynamicEndpoints(
 | 
			
		||||
          'change-view-file-list-header');
 | 
			
		||||
      this._dynamicContentEndpoints = pluginEndpoints.getDynamicEndpoints(
 | 
			
		||||
          'change-view-file-list-content');
 | 
			
		||||
      this._dynamicSummaryEndpoints = pluginEndpoints.getDynamicEndpoints(
 | 
			
		||||
          'change-view-file-list-summary');
 | 
			
		||||
      this._dynamicHeaderEndpoints = pluginEndpoints
 | 
			
		||||
          .getDynamicEndpoints('change-view-file-list-header');
 | 
			
		||||
      this._dynamicContentEndpoints = pluginEndpoints
 | 
			
		||||
          .getDynamicEndpoints('change-view-file-list-content');
 | 
			
		||||
      this._dynamicPrependedHeaderEndpoints = pluginEndpoints
 | 
			
		||||
          .getDynamicEndpoints('change-view-file-list-header-prepend');
 | 
			
		||||
      this._dynamicPrependedContentEndpoints = pluginEndpoints
 | 
			
		||||
          .getDynamicEndpoints('change-view-file-list-content-prepend');
 | 
			
		||||
      this._dynamicSummaryEndpoints = pluginEndpoints
 | 
			
		||||
          .getDynamicEndpoints('change-view-file-list-summary');
 | 
			
		||||
 | 
			
		||||
      if (this._dynamicHeaderEndpoints.length !==
 | 
			
		||||
          this._dynamicContentEndpoints.length) {
 | 
			
		||||
        console.warn(
 | 
			
		||||
            'Different number of dynamic file-list header and content.');
 | 
			
		||||
      }
 | 
			
		||||
      if (this._dynamicPrependedHeaderEndpoints.length !==
 | 
			
		||||
        this._dynamicPrependedContentEndpoints.length) {
 | 
			
		||||
        console.warn(
 | 
			
		||||
            'Different number of dynamic file-list header and content.');
 | 
			
		||||
      }
 | 
			
		||||
      if (this._dynamicHeaderEndpoints.length !==
 | 
			
		||||
          this._dynamicSummaryEndpoints.length) {
 | 
			
		||||
        console.warn(
 | 
			
		||||
@@ -1432,10 +1454,22 @@ class GrFileList extends mixinBehaviors( [
 | 
			
		||||
  _computeShowDynamicColumns(
 | 
			
		||||
      headerEndpoints, contentEndpoints, summaryEndpoints) {
 | 
			
		||||
    return headerEndpoints && contentEndpoints && summaryEndpoints &&
 | 
			
		||||
           headerEndpoints.length &&
 | 
			
		||||
           headerEndpoints.length === contentEndpoints.length &&
 | 
			
		||||
           headerEndpoints.length === summaryEndpoints.length;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Shows registered dynamic prepended columns iff the 'header', 'content'
 | 
			
		||||
   * endpoints are registered the exact same number of times.
 | 
			
		||||
   */
 | 
			
		||||
  _computeShowPrependedDynamicColumns(
 | 
			
		||||
      headerEndpoints, contentEndpoints) {
 | 
			
		||||
    return headerEndpoints && contentEndpoints &&
 | 
			
		||||
           headerEndpoints.length &&
 | 
			
		||||
           headerEndpoints.length === contentEndpoints.length;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Returns true if none of the inline diffs have been expanded.
 | 
			
		||||
   *
 | 
			
		||||
 
 | 
			
		||||
@@ -297,10 +297,22 @@ export const htmlTemplate = html`
 | 
			
		||||
  </style>
 | 
			
		||||
  <div id="container" on-click="_handleFileListClick">
 | 
			
		||||
    <div class="header-row row">
 | 
			
		||||
      <!-- endpoint: change-view-file-list-header-prepend -->
 | 
			
		||||
      <template is="dom-if" if="[[_showPrependedDynamicColumns]]">
 | 
			
		||||
        <template
 | 
			
		||||
          is="dom-repeat"
 | 
			
		||||
          items="[[_dynamicPrependedHeaderEndpoints]]"
 | 
			
		||||
          as="headerEndpoint"
 | 
			
		||||
        >
 | 
			
		||||
          <gr-endpoint-decorator name$="[[headerEndpoint]]">
 | 
			
		||||
          </gr-endpoint-decorator>
 | 
			
		||||
        </template>
 | 
			
		||||
      </template>
 | 
			
		||||
      <div class="path">File</div>
 | 
			
		||||
      <div class="comments">Comments</div>
 | 
			
		||||
      <div class="sizeBars">Size</div>
 | 
			
		||||
      <div class="header-stats">Delta</div>
 | 
			
		||||
      <!-- endpoint: change-view-file-list-header -->
 | 
			
		||||
      <template is="dom-if" if="[[_showDynamicColumns]]">
 | 
			
		||||
        <template
 | 
			
		||||
          is="dom-repeat"
 | 
			
		||||
@@ -332,6 +344,23 @@ export const htmlTemplate = html`
 | 
			
		||||
          data-file$="[[_computeFileRange(file)]]"
 | 
			
		||||
          tabindex="-1"
 | 
			
		||||
        >
 | 
			
		||||
          <!-- endpoint: change-view-file-list-content-prepend -->
 | 
			
		||||
          <template is="dom-if" if="[[_showPrependedDynamicColumns]]">
 | 
			
		||||
            <template
 | 
			
		||||
              is="dom-repeat"
 | 
			
		||||
              items="[[_dynamicPrependedContentEndpoints]]"
 | 
			
		||||
              as="contentEndpoint"
 | 
			
		||||
            >
 | 
			
		||||
              <gr-endpoint-decorator name="[[contentEndpoint]]">
 | 
			
		||||
                <gr-endpoint-param name="changeNum" value="[[changeNum]]">
 | 
			
		||||
                </gr-endpoint-param>
 | 
			
		||||
                <gr-endpoint-param name="patchRange" value="[[patchRange]]">
 | 
			
		||||
                </gr-endpoint-param>
 | 
			
		||||
                <gr-endpoint-param name="path" value="[[file.__path]]">
 | 
			
		||||
                </gr-endpoint-param>
 | 
			
		||||
              </gr-endpoint-decorator>
 | 
			
		||||
            </template>
 | 
			
		||||
          </template>
 | 
			
		||||
          <!-- TODO: Remove data-url as it appears its not used -->
 | 
			
		||||
          <span
 | 
			
		||||
            data-url="[[_computeDiffURL(change, patchRange, file.__path, editMode)]]"
 | 
			
		||||
@@ -433,6 +462,7 @@ export const htmlTemplate = html`
 | 
			
		||||
              file.size_delta)]]
 | 
			
		||||
            </span>
 | 
			
		||||
          </div>
 | 
			
		||||
          <!-- endpoint: change-view-file-list-content -->
 | 
			
		||||
          <template is="dom-if" if="[[_showDynamicColumns]]">
 | 
			
		||||
            <template
 | 
			
		||||
              is="dom-repeat"
 | 
			
		||||
@@ -537,6 +567,7 @@ export const htmlTemplate = html`
 | 
			
		||||
        -[[_patchChange.deleted]]
 | 
			
		||||
      </span>
 | 
			
		||||
    </div>
 | 
			
		||||
    <!-- endpoint: change-view-file-list-summary -->
 | 
			
		||||
    <template is="dom-if" if="[[_showDynamicColumns]]">
 | 
			
		||||
      <template
 | 
			
		||||
        is="dom-repeat"
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										77
									
								
								polygerrit-ui/app/samples/extra-column-on-file-list.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								polygerrit-ui/app/samples/extra-column-on-file-list.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,77 @@
 | 
			
		||||
/**
 | 
			
		||||
 * @license
 | 
			
		||||
 * Copyright (C) 2020 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.
 | 
			
		||||
 */
 | 
			
		||||
/**
 | 
			
		||||
 * This plugin will an extra column to file list on change page to show
 | 
			
		||||
 * the first character of the path.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
// Header of this extra column
 | 
			
		||||
class ColumnHeader extends Polymer.Element {
 | 
			
		||||
  static get is() { return 'column-header'; }
 | 
			
		||||
 | 
			
		||||
  static get template() {
 | 
			
		||||
    return Polymer.html`
 | 
			
		||||
      <style>
 | 
			
		||||
      :host {
 | 
			
		||||
        display: block;
 | 
			
		||||
        padding-right: var(--spacing-m);
 | 
			
		||||
        min-width: 5em;
 | 
			
		||||
      }
 | 
			
		||||
      </style>
 | 
			
		||||
      <div>First Char</div>
 | 
			
		||||
    `;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
customElements.define(ColumnHeader.is, ColumnHeader);
 | 
			
		||||
 | 
			
		||||
// Content of this extra column
 | 
			
		||||
class ColumnContent extends Polymer.Element {
 | 
			
		||||
  static get is() { return 'column-content'; }
 | 
			
		||||
 | 
			
		||||
  static get properties() {
 | 
			
		||||
    return {
 | 
			
		||||
      path: String,
 | 
			
		||||
    };
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  static get template() {
 | 
			
		||||
    return Polymer.html`
 | 
			
		||||
      <style>
 | 
			
		||||
      :host {
 | 
			
		||||
        display:block;
 | 
			
		||||
        padding-right: var(--spacing-m);
 | 
			
		||||
        min-width: 5em;
 | 
			
		||||
      }
 | 
			
		||||
      </style>
 | 
			
		||||
      <div>[[getStatus(path)]]</div>
 | 
			
		||||
    `;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  getStatus(path) {
 | 
			
		||||
    return path.charAt(0);
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
customElements.define(ColumnContent.is, ColumnContent);
 | 
			
		||||
 | 
			
		||||
Gerrit.install(plugin => {
 | 
			
		||||
  plugin.registerDynamicCustomComponent(
 | 
			
		||||
      'change-view-file-list-header-prepend', ColumnHeader.is);
 | 
			
		||||
  plugin.registerDynamicCustomComponent(
 | 
			
		||||
      'change-view-file-list-content-prepend', ColumnContent.is);
 | 
			
		||||
});
 | 
			
		||||
@@ -61,6 +61,7 @@ func main() {
 | 
			
		||||
 | 
			
		||||
	dirListingMux := http.NewServeMux()
 | 
			
		||||
	dirListingMux.Handle("/styles/", http.StripPrefix("/styles/", http.FileServer(http.Dir("app/styles"))))
 | 
			
		||||
	dirListingMux.Handle("/samples/", http.StripPrefix("/samples/", http.FileServer(http.Dir("app/samples"))))
 | 
			
		||||
	dirListingMux.Handle("/elements/", http.StripPrefix("/elements/", http.FileServer(http.Dir("app/elements"))))
 | 
			
		||||
	dirListingMux.Handle("/behaviors/", http.StripPrefix("/behaviors/", http.FileServer(http.Dir("app/behaviors"))))
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user