Add Group names and links to gr-rule-editor

Instead of just printing the group Id, display the name as a link to
the group page.

Change-Id: Id7abe3b82aed0962fdd1ac137ebd962a2e722ced
diff --git a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html
index c2b28d5..529e14c 100644
--- a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html
+++ b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.html
@@ -109,7 +109,8 @@
                 permission="{{permission}}"
                 labels="[[labels]]"
                 section="[[section.id]]"
-                editing="[[editing]]">
+                editing="[[editing]]"
+                groups="[[groups]]">
             </gr-permission>
           </template>
           <div id="addPermission">
diff --git a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js
index 16e6207..07a7a62 100644
--- a/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js
+++ b/polygerrit-ui/app/elements/admin/gr-access-section/gr-access-section.js
@@ -33,6 +33,7 @@
         notify: true,
         observer: '_sectionChanged',
       },
+      groups: Object,
       labels: Object,
       editing: {
         type: Boolean,
diff --git a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.html b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.html
index 1dfb06c..31171f7 100644
--- a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.html
+++ b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.html
@@ -92,7 +92,8 @@
             <gr-rule-editor
                 label="[[_label]]"
                 editing="[[editing]]"
-                group="[[rule.id]]"
+                group-id="[[rule.id]]"
+                group-name="[[_computeGroupName(groups, rule.id)]]"
                 permission="[[permission.id]]"
                 rule="{{rule}}"
                 section="[[section]]"></gr-rule-editor>
diff --git a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.js b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.js
index 97d4fe5..b99327c 100644
--- a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.js
+++ b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission.js
@@ -28,6 +28,7 @@
         observer: '_sortPermission',
         notify: true,
       },
+      groups: Object,
       section: String,
       editing: {
         type: Boolean,
@@ -129,6 +130,11 @@
       return groups;
     },
 
+    _computeGroupName(groups, groupId) {
+      return groups && groups[groupId] && groups[groupId].name ?
+          groups[groupId].name : groupId;
+    },
+
     _getGroupSuggestions() {
       return this.$.restAPI.getSuggestedGroups(
           this._groupFilter,
diff --git a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.html b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.html
index 3c229d1..73eac54 100644
--- a/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-permission/gr-permission_test.html
@@ -158,6 +158,14 @@
             'editing deleted');
       });
 
+      test('_computeGroupName', () => {
+        const groups = {
+          abc123: {name: 'test group'},
+          bcd234: {},
+        };
+        assert.equal(element._computeGroupName(groups, 'abc123'), 'test group');
+        assert.equal(element._computeGroupName(groups, 'bcd234'), 'bcd234');
+      });
 
       test('_computeGroupsWithRules', () => {
         const rules = [
diff --git a/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.html b/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.html
index d776763..686aa10 100644
--- a/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.html
+++ b/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.html
@@ -40,7 +40,8 @@
             capabilities="[[_capabilities]]"
             section="{{section}}"
             labels="[[_labels]]"
-            editing="[[_editing]]"></gr-access-section>
+            editing="[[_editing]]"
+            groups="[[_groups]]"></gr-access-section>
       </template>
       <template is="dom-if" if="[[_inheritsFrom]]">
         <h3 id="inheritsFrom">Rights Inherit From
diff --git a/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.js b/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.js
index 6f04a11..8e1b1f5 100644
--- a/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.js
+++ b/polygerrit-ui/app/elements/admin/gr-project-access/gr-project-access.js
@@ -24,6 +24,7 @@
       },
 
       _capabilities: Object,
+      _groups: Object,
       /** @type {?} */
       _inheritsFrom: Object,
       _labels: Object,
@@ -54,6 +55,7 @@
       promises.push(this.$.restAPI.getProjectAccessRights(project).then(res => {
         this._inheritsFrom = res.inherits_from;
         this._local = res.local;
+        this._groups = res.groups;
         return this.toSortedArray(this._local);
       }));
 
diff --git a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.html b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.html
index 0a8f382..18612c8 100644
--- a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.html
+++ b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.html
@@ -16,7 +16,9 @@
 
 <link rel="import" href="../../../bower_components/polymer/polymer.html">
 
+<link rel="import" href="../../../behaviors/base-url-behavior/base-url-behavior.html">
 <link rel="import" href="../../../behaviors/gr-access-behavior/gr-access-behavior.html">
+<link rel="import" href="../../../behaviors/gr-url-encoding-behavior.html">
 <link rel="import" href="../../../styles/gr-form-styles.html">
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../shared/gr-button/gr-button.html">
@@ -64,6 +66,9 @@
       #deletedContainer.deleted {
         display: block;
       }
+      .groupPath {
+        color: #666;
+      }
     </style>
     <style include="gr-form-styles"></style>
     <div id="mainContainer"
@@ -100,7 +105,9 @@
             </select>
           </gr-select>
         </template>
-        <span>[[group]]</span>
+        <a class="groupPath" href$="[[_computeGroupPath(groupId)]]">
+          [[groupName]]
+        </a>
         <gr-select
             id="force"
             class$="[[_computeForceClass(permission)]]"
@@ -126,7 +133,7 @@
     <div
         id="deletedContainer"
         class$="gr-form-styles [[_computeSectionClass(editing, _deleted)]]">
-      [[group]] was deleted
+      [[groupName]] was deleted
       <gr-button id="undoRemoveBtn" on-tap="_handleUndoRemove">Undo</gr-button>
     </div>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
diff --git a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.js b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.js
index 6f404bf..7f1a245 100644
--- a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.js
+++ b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.js
@@ -57,7 +57,8 @@
         type: Boolean,
         value: false,
       },
-      group: String,
+      groupId: String,
+      groupName: String,
       permission: String,
       /** @type {?} */
       rule: {
@@ -78,6 +79,8 @@
 
     behaviors: [
       Gerrit.AccessBehavior,
+      Gerrit.BaseUrlBehavior,
+      Gerrit.URLEncodingBehavior,
     ],
 
     observers: [
@@ -107,6 +110,10 @@
       return this._computeForce(permission) ? 'force' : '';
     },
 
+    _computeGroupPath(group) {
+      return `${this.getBaseUrl()}/admin/groups/${this.encodeURL(group, true)}`;
+    },
+
     _computeSectionClass(editing, deleted) {
       const classList = [];
       if (editing) {
diff --git a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor_test.html b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor_test.html
index 2b02419..3594e4b 100644
--- a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor_test.html
@@ -240,6 +240,12 @@
         MockInteractions.tap(element.$.undoRemoveBtn);
         assert.isNotOk(element.rule.value.deleted);
       });
+
+      test('_computeGroupPath', () => {
+        const group = '123';
+        assert.equal(element._computeGroupPath(group),
+            `/admin/groups/123`);
+      });
     });
 
     suite('new edit rule', () => {