Implement list-view-behavior
Even though a gr-list-view element has been established for many of the common list view functions, The tables themselves are still generated by the parent element and passed as <content>. There were many common functions used in the table generation itself. Break out those common functions into a behavior, and implement in gr-admin-group-list and gr-admin-project list. This will be used in further admin pages as well. Change-Id: I60227b8c30ac18176bbf923ee1fb02bdd985e5c3
This commit is contained in:
		@@ -0,0 +1,55 @@
 | 
			
		||||
<!--
 | 
			
		||||
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="../base-url-behavior/base-url-behavior.html">
 | 
			
		||||
<link rel="import" href="../gr-url-encoding-behavior.html">
 | 
			
		||||
<script>
 | 
			
		||||
(function(window) {
 | 
			
		||||
  'use strict';
 | 
			
		||||
 | 
			
		||||
  /** @polymerBehavior Gerrit.ListViewBehavior */
 | 
			
		||||
  const ListViewBehavior = {
 | 
			
		||||
    computeLoadingClass(loading) {
 | 
			
		||||
      return loading ? 'loading' : '';
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    computeShownItems(items) {
 | 
			
		||||
      return items.slice(0, 25);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getUrl(path, item) {
 | 
			
		||||
      return this.getBaseUrl() + path + this.encodeURL(item, true);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getFilterValue(params) {
 | 
			
		||||
      if (!params) { return null; }
 | 
			
		||||
      return this._filter = params.filter || null;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    getOffsetValue(params) {
 | 
			
		||||
      if (params && params.offset) {
 | 
			
		||||
        return params.offset;
 | 
			
		||||
      }
 | 
			
		||||
      return 0;
 | 
			
		||||
    },
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  window.Gerrit = window.Gerrit || {};
 | 
			
		||||
  window.Gerrit.ListViewBehavior = [
 | 
			
		||||
    ListViewBehavior,
 | 
			
		||||
    window.Gerrit.BaseUrlBehavior,
 | 
			
		||||
    window.Gerrit.URLEncodingBehavior];
 | 
			
		||||
})(window);
 | 
			
		||||
</script>
 | 
			
		||||
@@ -0,0 +1,89 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
<!--
 | 
			
		||||
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.
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
 | 
			
		||||
<title>keyboard-shortcut-behavior</title>
 | 
			
		||||
 | 
			
		||||
<script src="../../bower_components/webcomponentsjs/webcomponents.min.js"></script>
 | 
			
		||||
<script src="../../bower_components/web-component-tester/browser.js"></script>
 | 
			
		||||
<link rel="import" href="../../test/common-test-setup.html"/>
 | 
			
		||||
<link rel="import" href="gr-list-view-behavior.html">
 | 
			
		||||
 | 
			
		||||
<test-fixture id="basic">
 | 
			
		||||
  <template>
 | 
			
		||||
    <test-element></test-element>
 | 
			
		||||
  </template>
 | 
			
		||||
</test-fixture>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
  suite('gr-list-view-behavior tests', () => {
 | 
			
		||||
    let element;
 | 
			
		||||
    // eslint-disable-next-line no-unused-vars
 | 
			
		||||
    let overlay;
 | 
			
		||||
 | 
			
		||||
    suiteSetup(() => {
 | 
			
		||||
      // Define a Polymer element that uses this behavior.
 | 
			
		||||
      Polymer({
 | 
			
		||||
        is: 'test-element',
 | 
			
		||||
        behaviors: [Gerrit.ListViewBehavior],
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    setup(() => {
 | 
			
		||||
      element = fixture('basic');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('computeLoadingClass', () => {
 | 
			
		||||
      assert.equal(element.computeLoadingClass(true), 'loading');
 | 
			
		||||
      assert.equal(element.computeLoadingClass(false), '');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('computeShownItems', () => {
 | 
			
		||||
      const myArr = new Array(26);
 | 
			
		||||
      assert.equal(element.computeShownItems(myArr).length, 25);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('getUrl', () => {
 | 
			
		||||
      assert.equal(element.getUrl('/path/to/something/', 'item'),
 | 
			
		||||
          '/path/to/something/item');
 | 
			
		||||
      assert.equal(element.getUrl('/path/to/something/', 'item%test'),
 | 
			
		||||
          '/path/to/something/item%2525test');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('getFilterValue', () => {
 | 
			
		||||
      let params;
 | 
			
		||||
      assert.equal(element.getFilterValue(params), null);
 | 
			
		||||
 | 
			
		||||
      params = {filter: null};
 | 
			
		||||
      assert.equal(element.getFilterValue(params), null);
 | 
			
		||||
 | 
			
		||||
      params = {filter: 'test'};
 | 
			
		||||
      assert.equal(element.getFilterValue(params), 'test');
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    test('getOffsetValue', () => {
 | 
			
		||||
      let params;
 | 
			
		||||
      assert.equal(element.getOffsetValue(params), 0);
 | 
			
		||||
 | 
			
		||||
      params = {offset: null};
 | 
			
		||||
      assert.equal(element.getOffsetValue(params), 0);
 | 
			
		||||
 | 
			
		||||
      params = {offset: 1};
 | 
			
		||||
      assert.equal(element.getOffsetValue(params), 1);
 | 
			
		||||
    });
 | 
			
		||||
  });
 | 
			
		||||
</script>
 | 
			
		||||
@@ -14,8 +14,7 @@ See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
 | 
			
		||||
<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
 | 
			
		||||
<link rel="import" href="../../../behaviors/gr-list-view-behavior/gr-list-view-behavior.html">
 | 
			
		||||
<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
 | 
			
		||||
<link rel="import" href="../../../bower_components/polymer/polymer.html">
 | 
			
		||||
<link rel="import" href="../../shared/gr-list-view/gr-list-view.html">
 | 
			
		||||
@@ -39,14 +38,14 @@ limitations under the License.
 | 
			
		||||
          <th class="description topHeader">Group Description</th>
 | 
			
		||||
          <th class="visibleToAll topHeader">Visible To All</th>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr id="loading" class$="loadingMsg [[_computeLoadingClass(_loading)]]">
 | 
			
		||||
        <tr id="loading" class$="loadingMsg [[computeLoadingClass(_loading)]]">
 | 
			
		||||
          <td>Loading...</td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <template is="dom-repeat" items="[[_shownGroups]]"
 | 
			
		||||
            class$="[[_computeLoadingClass(_loading)]]">
 | 
			
		||||
            class$="[[computeLoadingClass(_loading)]]">
 | 
			
		||||
          <tr class="table">
 | 
			
		||||
            <td class="name">
 | 
			
		||||
              <a href$="[[_getUrl(item.group_id)]]">[[item.name]]</a>
 | 
			
		||||
              <a href$="[[getUrl(path, item.group_id)]]">[[item.name]]</a>
 | 
			
		||||
            </td>
 | 
			
		||||
            <td class="description">[[item.description]]</td>
 | 
			
		||||
            <td class="visibleToAll">[[_visibleToAll(item)]]</td>
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,11 @@
 | 
			
		||||
       * Offset of currently visible query results.
 | 
			
		||||
       */
 | 
			
		||||
      _offset: Number,
 | 
			
		||||
 | 
			
		||||
      _path: {
 | 
			
		||||
        type: String,
 | 
			
		||||
        readOnly: true,
 | 
			
		||||
        value: '/admin/groups/',
 | 
			
		||||
      },
 | 
			
		||||
      _groups: Array,
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
@@ -39,7 +43,7 @@
 | 
			
		||||
       * */
 | 
			
		||||
      _shownGroups: {
 | 
			
		||||
        type: Array,
 | 
			
		||||
        computed: '_computeShownGroups(_groups)',
 | 
			
		||||
        computed: 'computeShownItems(_groups)',
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      _groupsPerPage: {
 | 
			
		||||
@@ -55,8 +59,7 @@
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    behaviors: [
 | 
			
		||||
      Gerrit.BaseUrlBehavior,
 | 
			
		||||
      Gerrit.URLEncodingBehavior,
 | 
			
		||||
      Gerrit.ListViewBehavior,
 | 
			
		||||
    ],
 | 
			
		||||
 | 
			
		||||
    listeners: {
 | 
			
		||||
@@ -64,18 +67,11 @@
 | 
			
		||||
      'previous-page': '_handlePreviousPage',
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _paramsChanged(value) {
 | 
			
		||||
    _paramsChanged(params) {
 | 
			
		||||
      this._loading = true;
 | 
			
		||||
      this._filter = this.getFilterValue(params);
 | 
			
		||||
      this._offset = this.getOffsetValue(params);
 | 
			
		||||
 | 
			
		||||
      if (value) {
 | 
			
		||||
        this._filter = value.filter || null;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (value && value.offset) {
 | 
			
		||||
        this._offset = value.offset;
 | 
			
		||||
      } else {
 | 
			
		||||
        this._offset = 0;
 | 
			
		||||
      }
 | 
			
		||||
      return this._getGroups(this._filter, this._groupsPerPage,
 | 
			
		||||
          this._offset);
 | 
			
		||||
    },
 | 
			
		||||
@@ -97,21 +93,8 @@
 | 
			
		||||
          });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _computeLoadingClass(loading) {
 | 
			
		||||
      return loading ? 'loading' : '';
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _visibleToAll(item) {
 | 
			
		||||
      return item.options.visible_to_all === true ? 'Y' : 'N';
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _getUrl(item) {
 | 
			
		||||
      return this.getBaseUrl() + '/admin/groups/' +
 | 
			
		||||
          this.encodeURL(item, true);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _computeShownGroups(groups) {
 | 
			
		||||
      return groups.slice(0, 25);
 | 
			
		||||
    },
 | 
			
		||||
  });
 | 
			
		||||
})();
 | 
			
		||||
 
 | 
			
		||||
@@ -130,14 +130,14 @@ limitations under the License.
 | 
			
		||||
    suite('loading', () => {
 | 
			
		||||
      test('correct contents are displayed', () => {
 | 
			
		||||
        assert.isTrue(element._loading);
 | 
			
		||||
        assert.equal(element._computeLoadingClass(element._loading), 'loading');
 | 
			
		||||
        assert.equal(element.computeLoadingClass(element._loading), 'loading');
 | 
			
		||||
        assert.equal(getComputedStyle(element.$.loading).display, 'block');
 | 
			
		||||
 | 
			
		||||
        element._loading = false;
 | 
			
		||||
        element._groups = _.times(25, groupGenerator);
 | 
			
		||||
 | 
			
		||||
        flushAsynchronousOperations();
 | 
			
		||||
        assert.equal(element._computeLoadingClass(element._loading), '');
 | 
			
		||||
        assert.equal(element.computeLoadingClass(element._loading), '');
 | 
			
		||||
        assert.equal(getComputedStyle(element.$.loading).display, 'none');
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 
 | 
			
		||||
@@ -14,8 +14,7 @@ See the License for the specific language governing permissions and
 | 
			
		||||
limitations under the License.
 | 
			
		||||
-->
 | 
			
		||||
 | 
			
		||||
<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
 | 
			
		||||
<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
 | 
			
		||||
<link rel="import" href="../../../behaviors/gr-list-view-behavior/gr-list-view-behavior.html">
 | 
			
		||||
<link rel="import" href="../../../bower_components/iron-input/iron-input.html">
 | 
			
		||||
<link rel="import" href="../../../bower_components/polymer/polymer.html">
 | 
			
		||||
<link rel="import" href="../../shared/gr-list-view/gr-list-view.html">
 | 
			
		||||
@@ -41,14 +40,14 @@ limitations under the License.
 | 
			
		||||
          <th class="repositoryBrowser topHeader">Repository Browser</th>
 | 
			
		||||
          <th class="readOnly topHeader">Read only</th>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <tr id="loading" class$="loadingMsg [[_computeLoadingClass(_loading)]]">
 | 
			
		||||
        <tr id="loading" class$="loadingMsg [[computeLoadingClass(_loading)]]">
 | 
			
		||||
          <td>Loading...</td>
 | 
			
		||||
        </tr>
 | 
			
		||||
        <template is="dom-repeat" items="[[_shownProjects]]"
 | 
			
		||||
            class$="[[_computeLoadingClass(_loading)]]">
 | 
			
		||||
            class$="[[computeLoadingClass(_loading)]]">
 | 
			
		||||
          <tr class="table">
 | 
			
		||||
            <td class="name">
 | 
			
		||||
              <a href$="[[_getUrl(item.name)]]">[[item.name]]</a>
 | 
			
		||||
              <a href$="[[getUrl(path, item.name)]]">[[item.name]]</a>
 | 
			
		||||
            </td>
 | 
			
		||||
            <td class="description">[[item.description]]</td>
 | 
			
		||||
            <td class="repositoryBrowser">
 | 
			
		||||
 
 | 
			
		||||
@@ -30,7 +30,11 @@
 | 
			
		||||
       * Offset of currently visible query results.
 | 
			
		||||
       */
 | 
			
		||||
      _offset: Number,
 | 
			
		||||
 | 
			
		||||
      _path: {
 | 
			
		||||
        type: String,
 | 
			
		||||
        readOnly: true,
 | 
			
		||||
        value: '/admin/projects/',
 | 
			
		||||
      },
 | 
			
		||||
      _projects: Array,
 | 
			
		||||
 | 
			
		||||
      /**
 | 
			
		||||
@@ -39,7 +43,7 @@
 | 
			
		||||
       * */
 | 
			
		||||
      _shownProjects: {
 | 
			
		||||
        type: Array,
 | 
			
		||||
        computed: '_computeShownProjects(_projects)',
 | 
			
		||||
        computed: 'computeShownItems(_projects)',
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      _projectsPerPage: {
 | 
			
		||||
@@ -55,22 +59,13 @@
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    behaviors: [
 | 
			
		||||
      Gerrit.BaseUrlBehavior,
 | 
			
		||||
      Gerrit.URLEncodingBehavior,
 | 
			
		||||
      Gerrit.ListViewBehavior,
 | 
			
		||||
    ],
 | 
			
		||||
 | 
			
		||||
    _paramsChanged(value) {
 | 
			
		||||
    _paramsChanged(params) {
 | 
			
		||||
      this._loading = true;
 | 
			
		||||
 | 
			
		||||
      if (value) {
 | 
			
		||||
        this._filter = value.filter || null;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (value && value.offset) {
 | 
			
		||||
        this._offset = value.offset;
 | 
			
		||||
      } else {
 | 
			
		||||
        this._offset = 0;
 | 
			
		||||
      }
 | 
			
		||||
      this._filter = this.getFilterValue(params);
 | 
			
		||||
      this._offset = this.getOffsetValue(params);
 | 
			
		||||
 | 
			
		||||
      return this._getProjects(this._filter, this._projectsPerPage,
 | 
			
		||||
          this._offset);
 | 
			
		||||
@@ -93,19 +88,10 @@
 | 
			
		||||
          });
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _computeLoadingClass(loading) {
 | 
			
		||||
      return loading ? 'loading' : '';
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _readOnly(item) {
 | 
			
		||||
      return item.state === 'READ_ONLY' ? 'Y' : 'N';
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _getUrl(item) {
 | 
			
		||||
      return this.getBaseUrl() + '/admin/projects/' +
 | 
			
		||||
          this.encodeURL(item, true);
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _computeWeblink(project) {
 | 
			
		||||
      if (!project.web_links) {
 | 
			
		||||
        return '';
 | 
			
		||||
@@ -113,9 +99,5 @@
 | 
			
		||||
      const webLinks = project.web_links;
 | 
			
		||||
      return webLinks.length ? webLinks : null;
 | 
			
		||||
    },
 | 
			
		||||
 | 
			
		||||
    _computeShownProjects(projects) {
 | 
			
		||||
      return projects.slice(0, 25);
 | 
			
		||||
    },
 | 
			
		||||
  });
 | 
			
		||||
})();
 | 
			
		||||
 
 | 
			
		||||
@@ -125,14 +125,14 @@ limitations under the License.
 | 
			
		||||
    suite('loading', () => {
 | 
			
		||||
      test('correct contents are displayed', () => {
 | 
			
		||||
        assert.isTrue(element._loading);
 | 
			
		||||
        assert.equal(element._computeLoadingClass(element._loading), 'loading');
 | 
			
		||||
        assert.equal(element.computeLoadingClass(element._loading), 'loading');
 | 
			
		||||
        assert.equal(getComputedStyle(element.$.loading).display, 'block');
 | 
			
		||||
 | 
			
		||||
        element._loading = false;
 | 
			
		||||
        element._projects = _.times(25, projectGenerator);
 | 
			
		||||
 | 
			
		||||
        flushAsynchronousOperations();
 | 
			
		||||
        assert.equal(element._computeLoadingClass(element._loading), '');
 | 
			
		||||
        assert.equal(element.computeLoadingClass(element._loading), '');
 | 
			
		||||
        assert.equal(getComputedStyle(element.$.loading).display, 'none');
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user