Account for 'value' when parsing votable labels

In addition to permitted_voting_range, user may vote on a label if the
label has 'value' property.

Bug: b/77913572
Change-Id: I0db60a8e1dbf92c83e443c600f8b1e6c0fcbbf94
diff --git a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.js b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.js
index aa3ddea..ab1f55e 100644
--- a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.js
+++ b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list.js
@@ -126,10 +126,16 @@
       if (!change.labels[label].all) { return NaN; }
       const detailed = change.labels[label].all.filter(
           ({_account_id}) => reviewer._account_id === _account_id).pop();
-      if (!detailed || !detailed.hasOwnProperty('permitted_voting_range')) {
+      if (!detailed) {
         return NaN;
       }
-      return detailed.permitted_voting_range.max;
+      if (detailed.hasOwnProperty('permitted_voting_range')) {
+        return detailed.permitted_voting_range.max;
+      } else if (detailed.hasOwnProperty('value')) {
+        // If preset, user can vote on the label.
+        return 0;
+      }
+      return NaN;
     },
 
     _computeReviewerTooltip(reviewer, change) {
diff --git a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.html b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.html
index 4e085d0..1a406c9 100644
--- a/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.html
+++ b/polygerrit-ui/app/elements/change/gr-reviewer-list/gr-reviewer-list_test.html
@@ -206,7 +206,6 @@
           CC: reviewers,
         },
       };
-      flushAsynchronousOperations();
       assert.equal(element._hiddenReviewerCount, 0);
       assert.equal(element._displayedReviewers.length, 6);
       assert.equal(element._reviewers.length, 6);
@@ -230,7 +229,6 @@
           CC: reviewers,
         },
       };
-      flushAsynchronousOperations();
       assert.equal(element._hiddenReviewerCount, 2);
       assert.equal(element._displayedReviewers.length, 5);
       assert.equal(element._reviewers.length, 7);
@@ -254,7 +252,6 @@
           CC: reviewers,
         },
       };
-      flushAsynchronousOperations();
       assert.equal(element._hiddenReviewerCount, 0);
       assert.equal(element._displayedReviewers.length, 7);
       assert.equal(element._reviewers.length, 7);
@@ -278,14 +275,13 @@
           CC: reviewers,
         },
       };
-      flushAsynchronousOperations();
       assert.equal(element._hiddenReviewerCount, 95);
       assert.equal(element._displayedReviewers.length, 5);
       assert.equal(element._reviewers.length, 100);
       assert.isFalse(element.$$('.hiddenReviewers').hidden);
 
       MockInteractions.tap(element.$$('.hiddenReviewers'));
-      flushAsynchronousOperations();
+
       assert.equal(element._hiddenReviewerCount, 0);
       assert.equal(element._displayedReviewers.length, 100);
       assert.equal(element._reviewers.length, 100);
@@ -303,7 +299,7 @@
                   {_account_id: 7, permitted_voting_range: {max: 1}}],
           },
           FooBar: {
-            all: [{_account_id: 7, permitted_voting_range: {max: 0}}],
+            all: [{_account_id: 7, value: 0}],
           },
         },
         permitted_labels: {
@@ -324,23 +320,13 @@
 
     test('fails gracefully when all is not included', () => {
       const change = {
-        labels: {
-          Foo: {},
-          Bar: {},
-          FooBar: {},
-        },
+        labels: {Foo: {}},
         permitted_labels: {
           Foo: ['-1', ' 0', '+1', '+2'],
-          Bar: ['-1', ' 0', '+1', '+2'],
-          FooBar: ['-1', ' 0'],
         },
       };
       assert.strictEqual(
           element._computeReviewerTooltip({_account_id: 1}, change), '');
-      assert.strictEqual(
-          element._computeReviewerTooltip({_account_id: 7}, change), '');
-      assert.strictEqual(
-          element._computeReviewerTooltip({_account_id: 2}, change), '');
     });
   });
 </script>