Map legacy create routes to new routes

Previous routes:

/admin/create-project/ --> /admin/projects#create
/admin/create-group/ --> /admin/groups#create

Now do not have dedicated pages, but instead modals on the group list
and project list pages, respectively.

This change redirects the routes, and opens the corresponding modal
when the user lands on the page.

Change-Id: Ic50ff8e00dc1bf6361b6bd36c38fe8bac1106f6c
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.js b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.js
index 00aeb91..72439e2 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.js
+++ b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.js
@@ -70,6 +70,7 @@
     attached() {
       this._getCreateGroupCapability();
       this.fire('title-change', {title: 'Groups'});
+      this._maybeOpenCreateOverlay(this.params);
     },
 
     _paramsChanged(params) {
@@ -81,6 +82,16 @@
           this._offset);
     },
 
+    /**
+     * Opens the create overlay if the route has a hash 'create'
+     * @param {!Object} params
+     */
+    _maybeOpenCreateOverlay(params) {
+      if (params && params.openCreateModal) {
+        this.$.createOverlay.open();
+      }
+    },
+
     _computeGroupUrl(id) {
       return this.getUrl(this._path + '/', id);
     },
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.html b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.html
index 4cc1afe..06428c7 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.html
@@ -90,6 +90,18 @@
       test('_shownGroups', () => {
         assert.equal(element._shownGroups.length, 25);
       });
+
+      test('_maybeOpenCreateOverlay', () => {
+        const overlayOpen = sandbox.stub(element.$.createOverlay, 'open');
+        element._maybeOpenCreateOverlay();
+        assert.isFalse(overlayOpen.called);
+        const params = {};
+        element._maybeOpenCreateOverlay(params);
+        assert.isFalse(overlayOpen.called);
+        params.openCreateModal = true;
+        element._maybeOpenCreateOverlay(params);
+        assert.isTrue(overlayOpen.called);
+      });
     });
 
     suite('test with less then 25 groups', () => {
diff --git a/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list.js b/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list.js
index 3b568ca..070cc2f 100644
--- a/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list.js
+++ b/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list.js
@@ -70,6 +70,7 @@
     attached() {
       this._getCreateProjectCapability();
       this.fire('title-change', {title: 'Projects'});
+      this._maybeOpenCreateOverlay(this.params);
     },
 
     _paramsChanged(params) {
@@ -81,6 +82,16 @@
           this._offset);
     },
 
+    /**
+     * Opens the create overlay if the route has a hash 'create'
+     * @param {!Object} params
+     */
+    _maybeOpenCreateOverlay(params) {
+      if (params && params.openCreateModal) {
+        this.$.createOverlay.open();
+      }
+    },
+
     _computeProjectUrl(name) {
       return this.getUrl(this._path + '/', name);
     },
diff --git a/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list_test.html b/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list_test.html
index 117df3a..87732b8 100644
--- a/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-project-list/gr-project-list_test.html
@@ -66,13 +66,11 @@
     suite('list with projects', () => {
       setup(done => {
         projects = _.times(26, projectGenerator);
-
         stub('gr-rest-api-interface', {
           getProjects(num, offset) {
             return Promise.resolve(projects);
           },
         });
-
         element._paramsChanged(value).then(() => { flush(done); });
       });
 
@@ -86,6 +84,18 @@
       test('_shownProjects', () => {
         assert.equal(element._shownProjects.length, 25);
       });
+
+      test('_maybeOpenCreateOverlay', () => {
+        const overlayOpen = sandbox.stub(element.$.createOverlay, 'open');
+        element._maybeOpenCreateOverlay();
+        assert.isFalse(overlayOpen.called);
+        const params = {};
+        element._maybeOpenCreateOverlay(params);
+        assert.isFalse(overlayOpen.called);
+        params.openCreateModal = true;
+        element._maybeOpenCreateOverlay(params);
+        assert.isTrue(overlayOpen.called);
+      });
     });
 
     suite('list with less then 25 projects', () => {
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router.js b/polygerrit-ui/app/elements/core/gr-router/gr-router.js
index 1ce3c23..fb74bfa 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router.js
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router.js
@@ -46,6 +46,12 @@
     GROUP_LIST_FILTER: '/admin/groups/q/filter::filter',
     GROUP_LIST_FILTER_OFFSET: '/admin/groups/q/filter::filter,:offset',
 
+    // Matches /admin/create-project
+    LEGACY_CREATE_PROJECT: /^\/admin\/create-project\/?$/,
+
+    // Matches /admin/create-project
+    LEGACY_CREATE_GROUP: /^\/admin\/create-group\/?$/,
+
     // Matches /admin/projects/<project>
     PROJECT: /^\/admin\/projects\/([^,]+)$/,
 
@@ -463,6 +469,12 @@
       this._mapRoute(RoutePattern.TAG_LIST_FILTER,
           '_handleTagListFilterRoute');
 
+      this._mapRoute(RoutePattern.LEGACY_CREATE_GROUP,
+          '_handleCreateGroupRoute', true);
+
+      this._mapRoute(RoutePattern.LEGACY_CREATE_PROJECT,
+          '_handleCreateProjectRoute', true);
+
       this._mapRoute(RoutePattern.PROJECT_LIST_OFFSET,
           '_handleProjectListOffsetRoute');
 
@@ -612,6 +624,7 @@
         adminView: 'gr-admin-group-list',
         offset: data.params[1] || 0,
         filter: null,
+        openCreateModal: data.hash === 'create',
       });
     },
 
@@ -728,6 +741,7 @@
         adminView: 'gr-project-list',
         offset: data.params[1] || 0,
         filter: null,
+        openCreateModal: data.hash === 'create',
       });
     },
 
@@ -748,6 +762,18 @@
       });
     },
 
+    _handleCreateProjectRoute(data) {
+      // Redirects the legacy route to the new route, which displays the project
+      // list with a hash 'create'.
+      this._redirect('/admin/projects#create');
+    },
+
+    _handleCreateGroupRoute(data) {
+      // Redirects the legacy route to the new route, which displays the group
+      // list with a hash 'create'.
+      this._redirect('/admin/groups#create');
+    },
+
     _handleProjectRoute(data) {
       this._setParams({
         view: Gerrit.Nav.View.ADMIN,
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html
index c32f6d4..831b905 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.html
@@ -125,6 +125,8 @@
       const shouldRequireAutoAuth = [
         '_handleAdminPlaceholderRoute',
         '_handleAgreementsRoute',
+        '_handleCreateGroupRoute',
+        '_handleCreateProjectRoute',
         '_handleDiffEditRoute',
         '_handleGroupAuditLogRoute',
         '_handleGroupInfoRoute',
@@ -641,6 +643,7 @@
             adminView: 'gr-admin-group-list',
             offset: 0,
             filter: null,
+            openCreateModal: false,
           });
 
           data.params[1] = 42;
@@ -649,6 +652,16 @@
             adminView: 'gr-admin-group-list',
             offset: 42,
             filter: null,
+            openCreateModal: false,
+          });
+
+          data.hash = 'create';
+          assertDataToParams(data, '_handleGroupListOffsetRoute', {
+            view: Gerrit.Nav.View.ADMIN,
+            adminView: 'gr-admin-group-list',
+            offset: 42,
+            filter: null,
+            openCreateModal: true,
           });
         });
 
@@ -812,6 +825,7 @@
               adminView: 'gr-project-list',
               offset: 0,
               filter: null,
+              openCreateModal: false,
             });
 
             data.params[1] = 42;
@@ -820,6 +834,16 @@
               adminView: 'gr-project-list',
               offset: 42,
               filter: null,
+              openCreateModal: false,
+            });
+
+            data.hash = 'create';
+            assertDataToParams(data, '_handleProjectListOffsetRoute', {
+              view: Gerrit.Nav.View.ADMIN,
+              adminView: 'gr-project-list',
+              offset: 42,
+              filter: null,
+              openCreateModal: true,
             });
           });