summaryrefslogtreecommitdiffstats
path: root/polygerrit-ui/app/elements/shared/gr-list-view/gr-list-view.js
blob: 8b83eb345ef53c697f0c1a3666145fa7f6e20737 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/**
 * @license
 * 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.
 */
(function() {
  'use strict';

  const REQUEST_DEBOUNCE_INTERVAL_MS = 200;

  Polymer({
    is: 'gr-list-view',

    properties: {
      createNew: Boolean,
      items: Array,
      itemsPerPage: Number,
      filter: {
        type: String,
        observer: '_filterChanged',
      },
      offset: Number,
      loading: Boolean,
      path: String,
    },

    behaviors: [
      Gerrit.BaseUrlBehavior,
      Gerrit.URLEncodingBehavior,
    ],

    detached() {
      this.cancelDebouncer('reload');
    },

    _filterChanged(newFilter, oldFilter) {
      if (!newFilter && !oldFilter) {
        return;
      }

      this._debounceReload(newFilter);
    },

    _debounceReload(filter) {
      this.debounce('reload', () => {
        if (filter) {
          return page.show(`${this.path}/q/filter:` +
              this.encodeURL(filter, false));
        }
        page.show(this.path);
      }, REQUEST_DEBOUNCE_INTERVAL_MS);
    },

    _createNewItem() {
      this.fire('create-clicked');
    },

    _computeNavLink(offset, direction, itemsPerPage, filter, path) {
      // Offset could be a string when passed from the router.
      offset = +(offset || 0);
      const newOffset = Math.max(0, offset + (itemsPerPage * direction));
      let href = this.getBaseUrl() + path;
      if (filter) {
        href += '/q/filter:' + this.encodeURL(filter, false);
      }
      if (newOffset > 0) {
        href += ',' + newOffset;
      }
      return href;
    },

    _computeCreateClass(createNew) {
      return createNew ? 'show' : '';
    },

    _hidePrevArrow(loading, offset) {
      return loading || offset === 0;
    },

    _hideNextArrow(loading, items) {
      let lastPage = false;
      if (items.length < this.itemsPerPage + 1) {
        lastPage = true;
      }
      return loading || lastPage || !items || !items.length;
    },
  });
})();