Show "File X of Y" next to file navigation links in diff view

Bug: Issue 4917
Change-Id: Ie993504fe80034da0e3d3ddee99687ba09ebc2ff
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
index a1c7340..2ce29db 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
@@ -41,6 +41,9 @@
       :host {
         background-color: var(--view-background-color);
       }
+      .hidden {
+        display: none;
+      }
       gr-patch-range-select {
         display: block;
       }
@@ -214,6 +217,10 @@
           </div>
         </h3>
         <div class="navLinks desktop">
+          <span class$="fileNum [[_computeFileNumVisible(_fileNum, _formattedFiles)]]">
+            File [[_fileNum]] of [[_formattedFiles.length]]
+            <span class="separator"></span>
+          </span>
           <a class="navLink"
               href$="[[_computeNavLinkURL(_change, _path, _fileList, -1, 1)]]">
             Prev</a>
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
index a8ada4a..bccf348 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.js
@@ -93,6 +93,10 @@
         type: String,
         observer: '_pathChanged',
       },
+      _fileNum: {
+        type: Number,
+        computed: '_computeFileNum(_path, _formattedFiles)',
+      },
       _loggedIn: {
         type: Boolean,
         value: false,
@@ -928,5 +932,19 @@
     _getRevisionInfo(change) {
       return new Gerrit.RevisionInfo(change);
     },
+
+    _computeFileNum(file, files) {
+      return files.findIndex(({value}) => value === file) + 1;
+    },
+
+    _computeFileNumVisible(file, files) {
+      if (!files) { return 'hidden'; }
+      const fileNum = this._computeFileNum(file, files);
+      if (!isNaN(fileNum) && isFinite(fileNum) && fileNum > 0) {
+        return '';
+      } else {
+        return 'hidden';
+      }
+    },
   });
 })();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
index 4daabe3..4565338 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view_test.html
@@ -876,6 +876,19 @@
       assert.isTrue(callCompute({basePatchNum: 1, patchNum: 'edit'}));
     });
 
+    test('_computeFileNum', () => {
+      assert.equal(element._computeFileNum('/foo',
+          [{value: '/foo'}, {value: '/bar'}]), 1);
+      assert.equal(element._computeFileNum('/bar',
+          [{value: '/foo'}, {value: '/bar'}]), 2);
+    });
+
+    test('_computeFileNumVisible', () => {
+      assert.equal(element._computeFileNumVisible('', []), 'hidden');
+      assert.equal(element._computeFileNumVisible('/bar',
+          [{value: '/foo'}, {value: '/bar'}]), '');
+    });
+
     suite('editMode behavior', () => {
       setup(() => {
         element._loggedIn = true;