Create view state files for `settings` and `admin`

This is the first step of creating all view states in the directory
`models/views/`.

Release-Notes: skip
Google-Bug-Id: b/244279450
Change-Id: I48472e41b3ff24e01d6a9e2b19e95dfb429e5186
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.ts b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.ts
index 654aae6..02b4d31 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.ts
+++ b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list.ts
@@ -8,7 +8,6 @@
 import '../../shared/gr-overlay/gr-overlay';
 import '../gr-create-group-dialog/gr-create-group-dialog';
 import {GerritNav} from '../../core/gr-navigation/gr-navigation';
-import {AppElementAdminParams} from '../../gr-app-types';
 import {GrOverlay} from '../../shared/gr-overlay/gr-overlay';
 import {GroupId, GroupInfo, GroupName} from '../../../types/common';
 import {GrCreateGroupDialog} from '../gr-create-group-dialog/gr-create-group-dialog';
@@ -20,6 +19,7 @@
 import {LitElement, PropertyValues, css, html} from 'lit';
 import {customElement, query, property, state} from 'lit/decorators.js';
 import {assertIsDefined} from '../../../utils/common-util';
+import {AdminViewState} from '../../../models/views/admin';
 
 declare global {
   interface HTMLElementTagNameMap {
@@ -36,7 +36,7 @@
   @query('#createNewModal') private createNewModal?: GrCreateGroupDialog;
 
   @property({type: Object})
-  params?: AppElementAdminParams;
+  params?: AdminViewState;
 
   /**
    * Offset of currently visible query results.
@@ -166,7 +166,7 @@
    *
    * private but used in test
    */
-  maybeOpenCreateOverlay(params?: AppElementAdminParams) {
+  maybeOpenCreateOverlay(params?: AdminViewState) {
     if (params?.openCreateModal) {
       assertIsDefined(this.createOverlay, 'createOverlay');
       this.createOverlay.open();
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.ts b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.ts
index fc3b3d7..0555cc2 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.ts
+++ b/polygerrit-ui/app/elements/admin/gr-admin-group-list/gr-admin-group-list_test.ts
@@ -13,13 +13,13 @@
   GroupName,
   GroupNameToGroupInfoMap,
 } from '../../../types/common';
-import {AppElementAdminParams} from '../../gr-app-types';
 import {GerritView} from '../../../services/router/router-model';
 import {GrListView} from '../../shared/gr-list-view/gr-list-view';
 import {GrDialog} from '../../shared/gr-dialog/gr-dialog';
 import {GrOverlay} from '../../shared/gr-overlay/gr-overlay';
 import {SHOWN_ITEMS_COUNT} from '../../../constants/constants';
 import {fixture, html, assert} from '@open-wc/testing';
+import {AdminChildView, AdminViewState} from '../../../models/views/admin';
 
 function createGroup(name: string, counter: number) {
   return {
@@ -56,7 +56,10 @@
   let element: GrAdminGroupList;
   let groups: GroupNameToGroupInfoMap;
 
-  const value: AppElementAdminParams = {view: GerritView.ADMIN, adminView: ''};
+  const value: AdminViewState = {
+    view: GerritView.ADMIN,
+    adminView: AdminChildView.GROUPS,
+  };
 
   setup(async () => {
     element = await fixture(html`<gr-admin-group-list></gr-admin-group-list>`);
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.ts b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.ts
index a6a81cd..4ff5575 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.ts
+++ b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.ts
@@ -26,11 +26,7 @@
   NavLink,
   SubsectionInterface,
 } from '../../../utils/admin-nav-util';
-import {
-  AppElementAdminParams,
-  AppElementGroupParams,
-  AppElementRepoParams,
-} from '../../gr-app-types';
+import {AppElementGroupParams, AppElementRepoParams} from '../../gr-app-types';
 import {
   AccountDetailInfo,
   GroupId,
@@ -48,6 +44,7 @@
 import {ifDefined} from 'lit/directives/if-defined.js';
 import {ValueChangedEvent} from '../../../types/events';
 import {GroupDetailView, RepoDetailView} from '../../../utils/router-util';
+import {AdminChildView, AdminViewState} from '../../../models/views/admin';
 
 const INTERNAL_GROUP_REGEX = /^[\da-f]{40}$/;
 
@@ -62,7 +59,7 @@
 
 // The type is matched to the _showAdminView function from the gr-app-element
 type AdminViewParams =
-  | AppElementAdminParams
+  | AdminViewState
   | AppElementGroupParams
   | AppElementRepoParams;
 
@@ -250,11 +247,11 @@
   }
 
   private renderRepoList() {
-    const params = this.params as AppElementAdminParams;
+    const params = this.params as AdminViewState;
     if (
       !(
         params?.view === GerritView.ADMIN &&
-        params?.adminView === 'gr-repo-list'
+        params?.adminView === AdminChildView.REPOS
       )
     )
       return;
@@ -267,11 +264,11 @@
   }
 
   private renderGroupList() {
-    const params = this.params as AppElementAdminParams;
+    const params = this.params as AdminViewState;
     if (
       !(
         params?.view === GerritView.ADMIN &&
-        params?.adminView === 'gr-admin-group-list'
+        params?.adminView === AdminChildView.GROUPS
       )
     )
       return;
@@ -285,11 +282,11 @@
   }
 
   private renderPluginList() {
-    const params = this.params as AppElementAdminParams;
+    const params = this.params as AdminViewState;
     if (
       !(
         params?.view === GerritView.ADMIN &&
-        params?.adminView === 'gr-plugin-list'
+        params?.adminView === AdminChildView.PLUGINS
       )
     )
       return;
@@ -598,7 +595,7 @@
   }
 
   private computeSelectedClass(
-    itemView?: GerritView,
+    itemView?: GerritView | AdminChildView,
     detailType?: GroupDetailView | RepoDetailView
   ) {
     const params = this.params;
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.ts b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.ts
index 5f2cb26..d9e09ee 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.ts
+++ b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view_test.ts
@@ -22,6 +22,7 @@
 import {GrGroup} from '../gr-group/gr-group';
 import {GroupDetailView, RepoDetailView} from '../../../utils/router-util';
 import {fixture, html, assert} from '@open-wc/testing';
+import {AdminChildView} from '../../../models/views/admin';
 
 function createAdminCapabilities() {
   return {
@@ -81,7 +82,7 @@
 
     element.params = {
       view: GerritView.ADMIN,
-      adminView: 'gr-repo-list',
+      adminView: AdminChildView.REPOS,
     };
 
     await element.updateComplete;
@@ -563,7 +564,7 @@
       test('repo list', async () => {
         element.params = {
           view: GerritView.ADMIN,
-          adminView: 'gr-repo-list',
+          adminView: AdminChildView.REPOS,
           openCreateModal: false,
         };
         await element.updateComplete;
@@ -637,7 +638,7 @@
       test('group list', async () => {
         element.params = {
           view: GerritView.ADMIN,
-          adminView: 'gr-admin-group-list',
+          adminView: AdminChildView.GROUPS,
           openCreateModal: false,
         };
         await element.updateComplete;
diff --git a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.ts b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.ts
index 0c52811..383b4a7 100644
--- a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.ts
+++ b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list.ts
@@ -10,11 +10,11 @@
 import {ErrorCallback} from '../../../api/rest';
 import {encodeURL, getBaseUrl} from '../../../utils/url-util';
 import {SHOWN_ITEMS_COUNT} from '../../../constants/constants';
-import {AppElementAdminParams} from '../../gr-app-types';
 import {tableStyles} from '../../../styles/gr-table-styles';
 import {sharedStyles} from '../../../styles/shared-styles';
 import {LitElement, PropertyValues, css, html} from 'lit';
 import {customElement, property, state} from 'lit/decorators.js';
+import {AdminViewState} from '../../../models/views/admin';
 
 // Exported for tests
 export interface PluginInfoWithName extends PluginInfo {
@@ -29,7 +29,7 @@
    * URL params passed from the router.
    */
   @property({type: Object})
-  params?: AppElementAdminParams;
+  params?: AdminViewState;
 
   /**
    * Offset of currently visible query results.
diff --git a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.ts b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.ts
index b6b6e9f..f3d2188 100644
--- a/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.ts
+++ b/polygerrit-ui/app/elements/admin/gr-plugin-list/gr-plugin-list_test.ts
@@ -15,11 +15,11 @@
   stubRestApi,
 } from '../../../test/test-utils';
 import {PluginInfo} from '../../../types/common';
-import {AppElementAdminParams} from '../../gr-app-types';
 import {GerritView} from '../../../services/router/router-model';
 import {PageErrorEvent} from '../../../types/events';
 import {SHOWN_ITEMS_COUNT} from '../../../constants/constants';
 import {fixture, html, assert} from '@open-wc/testing';
+import {AdminChildView, AdminViewState} from '../../../models/views/admin';
 
 function pluginGenerator(counter: number) {
   const plugin: PluginInfo = {
@@ -59,7 +59,10 @@
   let element: GrPluginList;
   let plugins: {[pluginName: string]: PluginInfo} | undefined;
 
-  const value: AppElementAdminParams = {view: GerritView.ADMIN, adminView: ''};
+  const value: AdminViewState = {
+    view: GerritView.ADMIN,
+    adminView: AdminChildView.PLUGINS,
+  };
 
   setup(async () => {
     element = await fixture(html`<gr-plugin-list></gr-plugin-list>`);
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list.ts b/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list.ts
index 0c043ac..254bc3a 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list.ts
+++ b/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list.ts
@@ -8,7 +8,6 @@
 import '../../shared/gr-overlay/gr-overlay';
 import '../gr-create-repo-dialog/gr-create-repo-dialog';
 import {GerritNav} from '../../core/gr-navigation/gr-navigation';
-import {AppElementAdminParams} from '../../gr-app-types';
 import {GrOverlay} from '../../shared/gr-overlay/gr-overlay';
 import {
   RepoName,
@@ -24,6 +23,7 @@
 import {sharedStyles} from '../../../styles/shared-styles';
 import {LitElement, PropertyValues, css, html} from 'lit';
 import {customElement, property, query, state} from 'lit/decorators.js';
+import {AdminViewState} from '../../../models/views/admin';
 
 declare global {
   interface HTMLElementTagNameMap {
@@ -40,7 +40,7 @@
   @query('#createNewModal') private createNewModal?: GrCreateRepoDialog;
 
   @property({type: Object})
-  params?: AppElementAdminParams;
+  params?: AdminViewState;
 
   // private but used in test
   @state() offset = 0;
@@ -204,7 +204,7 @@
    *
    * private but used in test
    */
-  maybeOpenCreateOverlay(params?: AppElementAdminParams) {
+  maybeOpenCreateOverlay(params?: AdminViewState) {
     if (params?.openCreateModal) {
       this.createOverlay?.open();
     }
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list_test.ts b/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list_test.ts
index 292c0ad..ea8b238 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list_test.ts
+++ b/polygerrit-ui/app/elements/admin/gr-repo-list/gr-repo-list_test.ts
@@ -17,13 +17,13 @@
   ProjectInfoWithName,
   RepoName,
 } from '../../../types/common';
-import {AppElementAdminParams} from '../../gr-app-types';
 import {ProjectState, SHOWN_ITEMS_COUNT} from '../../../constants/constants';
 import {GerritView} from '../../../services/router/router-model';
 import {GrOverlay} from '../../shared/gr-overlay/gr-overlay';
 import {GrDialog} from '../../shared/gr-dialog/gr-dialog';
 import {GrListView} from '../../shared/gr-list-view/gr-list-view';
 import {fixture, html, assert} from '@open-wc/testing';
+import {AdminChildView, AdminViewState} from '../../../models/views/admin';
 
 function createRepo(name: string, counter: number) {
   return {
@@ -633,9 +633,9 @@
       assert.isFalse(overlayOpen.called);
       element.maybeOpenCreateOverlay(undefined);
       assert.isFalse(overlayOpen.called);
-      const params: AppElementAdminParams = {
+      const params: AdminViewState = {
         view: GerritView.ADMIN,
-        adminView: '',
+        adminView: AdminChildView.REPOS,
         openCreateModal: true,
       };
       element.maybeOpenCreateOverlay(params);
@@ -669,10 +669,10 @@
       repoStub.returns(Promise.resolve(repos));
       element.params = {
         view: GerritView.ADMIN,
-        adminView: '',
+        adminView: AdminChildView.REPOS,
         filter: 'test',
         offset: 25,
-      } as AppElementAdminParams;
+      } as AdminViewState;
       await element._paramsChanged();
       assert.isTrue(repoStub.lastCall.calledWithExactly('test', 25, 25));
     });
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router.ts b/polygerrit-ui/app/elements/core/gr-router/gr-router.ts
index 0e88b06..fe298702 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router.ts
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router.ts
@@ -61,6 +61,7 @@
   LATEST_ATTEMPT,
   stringToAttemptChoice,
 } from '../../../models/checks/checks-util';
+import {AdminChildView} from '../../../models/views/admin';
 
 const RoutePattern = {
   ROOT: '/',
@@ -1201,7 +1202,7 @@
   handleGroupListOffsetRoute(data: PageContextWithQueryMap) {
     this.setParams({
       view: GerritView.ADMIN,
-      adminView: 'gr-admin-group-list',
+      adminView: AdminChildView.GROUPS,
       offset: data.params[1] || 0,
       filter: null,
       openCreateModal: data.hash === 'create',
@@ -1211,7 +1212,7 @@
   handleGroupListFilterOffsetRoute(data: PageContextWithQueryMap) {
     this.setParams({
       view: GerritView.ADMIN,
-      adminView: 'gr-admin-group-list',
+      adminView: AdminChildView.GROUPS,
       offset: data.params['offset'],
       filter: data.params['filter'],
     });
@@ -1220,7 +1221,7 @@
   handleGroupListFilterRoute(data: PageContextWithQueryMap) {
     this.setParams({
       view: GerritView.ADMIN,
-      adminView: 'gr-admin-group-list',
+      adminView: AdminChildView.GROUPS,
       filter: data.params['filter'] || null,
     });
   }
@@ -1338,7 +1339,7 @@
   handleRepoListOffsetRoute(data: PageContextWithQueryMap) {
     this.setParams({
       view: GerritView.ADMIN,
-      adminView: 'gr-repo-list',
+      adminView: AdminChildView.REPOS,
       offset: data.params[1] || 0,
       filter: null,
       openCreateModal: data.hash === 'create',
@@ -1348,7 +1349,7 @@
   handleRepoListFilterOffsetRoute(data: PageContextWithQueryMap) {
     this.setParams({
       view: GerritView.ADMIN,
-      adminView: 'gr-repo-list',
+      adminView: AdminChildView.REPOS,
       offset: data.params['offset'],
       filter: data.params['filter'],
     });
@@ -1357,7 +1358,7 @@
   handleRepoListFilterRoute(data: PageContextWithQueryMap) {
     this.setParams({
       view: GerritView.ADMIN,
-      adminView: 'gr-repo-list',
+      adminView: AdminChildView.REPOS,
       filter: data.params['filter'] || null,
     });
   }
@@ -1381,7 +1382,7 @@
   handlePluginListOffsetRoute(data: PageContextWithQueryMap) {
     this.setParams({
       view: GerritView.ADMIN,
-      adminView: 'gr-plugin-list',
+      adminView: AdminChildView.PLUGINS,
       offset: data.params[1] || 0,
       filter: null,
     });
@@ -1390,7 +1391,7 @@
   handlePluginListFilterOffsetRoute(data: PageContextWithQueryMap) {
     this.setParams({
       view: GerritView.ADMIN,
-      adminView: 'gr-plugin-list',
+      adminView: AdminChildView.PLUGINS,
       offset: data.params['offset'],
       filter: data.params['filter'],
     });
@@ -1399,7 +1400,7 @@
   handlePluginListFilterRoute(data: PageContextWithQueryMap) {
     this.setParams({
       view: GerritView.ADMIN,
-      adminView: 'gr-plugin-list',
+      adminView: AdminChildView.PLUGINS,
       filter: data.params['filter'] || null,
     });
   }
@@ -1407,7 +1408,7 @@
   handlePluginListRoute(_: PageContextWithQueryMap) {
     this.setParams({
       view: GerritView.ADMIN,
-      adminView: 'gr-plugin-list',
+      adminView: AdminChildView.PLUGINS,
     });
   }
 
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.ts b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.ts
index 29b8e7a..1528918 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.ts
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.ts
@@ -43,6 +43,7 @@
   RepoDetailView,
 } from '../../../utils/router-util';
 import {assert} from '@open-wc/testing';
+import {AdminChildView} from '../../../models/views/admin';
 
 suite('gr-router tests', () => {
   let router: GrRouter;
@@ -819,7 +820,7 @@
         const data = createPageContext();
         assertDataToParams(data, 'handleGroupListOffsetRoute', {
           view: GerritView.ADMIN,
-          adminView: 'gr-admin-group-list',
+          adminView: AdminChildView.GROUPS,
           offset: 0,
           filter: null,
           openCreateModal: false,
@@ -828,7 +829,7 @@
         data.params[1] = '42';
         assertDataToParams(data, 'handleGroupListOffsetRoute', {
           view: GerritView.ADMIN,
-          adminView: 'gr-admin-group-list',
+          adminView: AdminChildView.GROUPS,
           offset: '42',
           filter: null,
           openCreateModal: false,
@@ -837,7 +838,7 @@
         data.hash = 'create';
         assertDataToParams(data, 'handleGroupListOffsetRoute', {
           view: GerritView.ADMIN,
-          adminView: 'gr-admin-group-list',
+          adminView: AdminChildView.GROUPS,
           offset: '42',
           filter: null,
           openCreateModal: true,
@@ -851,7 +852,7 @@
         };
         assertDataToParams(data, 'handleGroupListFilterOffsetRoute', {
           view: GerritView.ADMIN,
-          adminView: 'gr-admin-group-list',
+          adminView: AdminChildView.GROUPS,
           offset: '42',
           filter: 'foo',
         });
@@ -861,7 +862,7 @@
         const data = {...createPageContext(), params: {filter: 'foo'}};
         assertDataToParams(data, 'handleGroupListFilterRoute', {
           view: GerritView.ADMIN,
-          adminView: 'gr-admin-group-list',
+          adminView: AdminChildView.GROUPS,
           filter: 'foo',
         });
       });
@@ -1042,7 +1043,7 @@
           const data = createPageContext();
           assertDataToParams(data, 'handleRepoListOffsetRoute', {
             view: GerritView.ADMIN,
-            adminView: 'gr-repo-list',
+            adminView: AdminChildView.REPOS,
             offset: 0,
             filter: null,
             openCreateModal: false,
@@ -1051,7 +1052,7 @@
           data.params[1] = '42';
           assertDataToParams(data, 'handleRepoListOffsetRoute', {
             view: GerritView.ADMIN,
-            adminView: 'gr-repo-list',
+            adminView: AdminChildView.REPOS,
             offset: '42',
             filter: null,
             openCreateModal: false,
@@ -1060,7 +1061,7 @@
           data.hash = 'create';
           assertDataToParams(data, 'handleRepoListOffsetRoute', {
             view: GerritView.ADMIN,
-            adminView: 'gr-repo-list',
+            adminView: AdminChildView.REPOS,
             offset: '42',
             filter: null,
             openCreateModal: true,
@@ -1074,7 +1075,7 @@
           };
           assertDataToParams(data, 'handleRepoListFilterOffsetRoute', {
             view: GerritView.ADMIN,
-            adminView: 'gr-repo-list',
+            adminView: AdminChildView.REPOS,
             offset: '42',
             filter: 'foo',
           });
@@ -1084,14 +1085,14 @@
           const data = createPageContext();
           assertDataToParams(data, 'handleRepoListFilterRoute', {
             view: GerritView.ADMIN,
-            adminView: 'gr-repo-list',
+            adminView: AdminChildView.REPOS,
             filter: null,
           });
 
           data.params.filter = 'foo';
           assertDataToParams(data, 'handleRepoListFilterRoute', {
             view: GerritView.ADMIN,
-            adminView: 'gr-repo-list',
+            adminView: AdminChildView.REPOS,
             filter: 'foo',
           });
         });
@@ -1103,7 +1104,7 @@
         const data = createPageContext();
         assertDataToParams(data, 'handlePluginListOffsetRoute', {
           view: GerritView.ADMIN,
-          adminView: 'gr-plugin-list',
+          adminView: AdminChildView.PLUGINS,
           offset: 0,
           filter: null,
         });
@@ -1111,7 +1112,7 @@
         data.params[1] = '42';
         assertDataToParams(data, 'handlePluginListOffsetRoute', {
           view: GerritView.ADMIN,
-          adminView: 'gr-plugin-list',
+          adminView: AdminChildView.PLUGINS,
           offset: '42',
           filter: null,
         });
@@ -1124,7 +1125,7 @@
         };
         assertDataToParams(data, 'handlePluginListFilterOffsetRoute', {
           view: GerritView.ADMIN,
-          adminView: 'gr-plugin-list',
+          adminView: AdminChildView.PLUGINS,
           offset: '42',
           filter: 'foo',
         });
@@ -1134,14 +1135,14 @@
         const data = createPageContext();
         assertDataToParams(data, 'handlePluginListFilterRoute', {
           view: GerritView.ADMIN,
-          adminView: 'gr-plugin-list',
+          adminView: AdminChildView.PLUGINS,
           filter: null,
         });
 
         data.params.filter = 'foo';
         assertDataToParams(data, 'handlePluginListFilterRoute', {
           view: GerritView.ADMIN,
-          adminView: 'gr-plugin-list',
+          adminView: AdminChildView.PLUGINS,
           filter: 'foo',
         });
       });
@@ -1150,7 +1151,7 @@
         const data = createPageContext();
         assertDataToParams(data, 'handlePluginListRoute', {
           view: GerritView.ADMIN,
-          adminView: 'gr-plugin-list',
+          adminView: AdminChildView.PLUGINS,
         });
       });
     });
diff --git a/polygerrit-ui/app/elements/gr-app-types.ts b/polygerrit-ui/app/elements/gr-app-types.ts
index 6abcedf..ea1ae02 100644
--- a/polygerrit-ui/app/elements/gr-app-types.ts
+++ b/polygerrit-ui/app/elements/gr-app-types.ts
@@ -20,6 +20,8 @@
   RepoDetailView,
 } from '../utils/router-util';
 import {AttemptChoice} from '../models/checks/checks-util';
+import {SettingsViewState} from '../models/views/settings';
+import {AdminViewState} from '../models/views/admin';
 
 export interface AppElement extends HTMLElement {
   params: AppElementParams | GenerateUrlParameters;
@@ -48,12 +50,6 @@
   offset?: number | string;
 }
 
-export interface AppElementAdminParams extends ListViewParams {
-  view: GerritView.ADMIN;
-  adminView: string;
-  openCreateModal?: boolean;
-}
-
 export interface AppElementRepoParams extends ListViewParams {
   view: GerritView.REPO;
   detail?: RepoDetailView;
@@ -77,11 +73,6 @@
   offset: string;
 }
 
-export interface AppElementSettingsParam {
-  view: GerritView.SETTINGS;
-  emailToken?: string;
-}
-
 export interface AppElementAgreementParam {
   view: GerritView.AGREEMENTS;
 }
@@ -138,13 +129,13 @@
 export type AppElementParams =
   | AppElementDashboardParams
   | AppElementGroupParams
-  | AppElementAdminParams
+  | AdminViewState
   | AppElementChangeViewParams
   | AppElementRepoParams
   | AppElementDocSearchParams
   | AppElementPluginScreenParams
   | AppElementSearchParam
-  | AppElementSettingsParam
+  | SettingsViewState
   | AppElementAgreementParam
   | AppElementDiffViewParam
   | AppElementDiffEditViewParam
diff --git a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.ts b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.ts
index 10be124..79fb3e5 100644
--- a/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.ts
+++ b/polygerrit-ui/app/elements/settings/gr-settings-view/gr-settings-view_test.ts
@@ -32,9 +32,9 @@
   createServerInfo,
 } from '../../../test/test-data-generators';
 import {GrSelect} from '../../shared/gr-select/gr-select';
-import {AppElementSettingsParam} from '../../gr-app-types';
 import {fixture, html, assert} from '@open-wc/testing';
 import {EventType} from '../../../types/events';
+import {SettingsViewState} from '../../../models/views/settings';
 
 suite('gr-settings-view tests', () => {
   let element: GrSettingsView;
@@ -757,7 +757,7 @@
     const emailEditorLoadDataStub = sinon.stub(element.emailEditor, 'loadData');
     element.params = {
       view: GerritView.SETTINGS,
-    } as AppElementSettingsParam;
+    } as SettingsViewState;
     element.firstUpdated();
     assert.isTrue(emailEditorLoadDataStub.calledOnce);
   });
diff --git a/polygerrit-ui/app/models/views/admin.ts b/polygerrit-ui/app/models/views/admin.ts
new file mode 100644
index 0000000..1a919c5
--- /dev/null
+++ b/polygerrit-ui/app/models/views/admin.ts
@@ -0,0 +1,36 @@
+/**
+ * @license
+ * Copyright 2022 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+import {GerritView} from '../../services/router/router-model';
+import {Model} from '../model';
+import {ViewState} from './base';
+
+export enum AdminChildView {
+  REPOS = 'gr-repo-list',
+  GROUPS = 'gr-admin-group-list',
+  PLUGINS = 'gr-plugin-list',
+}
+export interface AdminViewState extends ViewState {
+  view: GerritView.ADMIN;
+  adminView: AdminChildView;
+  openCreateModal?: boolean;
+  filter?: string | null;
+  offset?: number | string;
+}
+
+const DEFAULT_STATE: AdminViewState = {
+  view: GerritView.ADMIN,
+  adminView: AdminChildView.REPOS,
+};
+
+export class AdminViewModel extends Model<AdminViewState> {
+  constructor() {
+    super(DEFAULT_STATE);
+  }
+
+  updateState(state: AdminViewState) {
+    this.subject$.next({...state});
+  }
+}
diff --git a/polygerrit-ui/app/models/views/base.ts b/polygerrit-ui/app/models/views/base.ts
new file mode 100644
index 0000000..065495d
--- /dev/null
+++ b/polygerrit-ui/app/models/views/base.ts
@@ -0,0 +1,10 @@
+/**
+ * @license
+ * Copyright 2022 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+import {GerritView} from '../../services/router/router-model';
+
+export interface ViewState {
+  view: GerritView;
+}
diff --git a/polygerrit-ui/app/models/views/settings.ts b/polygerrit-ui/app/models/views/settings.ts
new file mode 100644
index 0000000..b53a473
--- /dev/null
+++ b/polygerrit-ui/app/models/views/settings.ts
@@ -0,0 +1,25 @@
+/**
+ * @license
+ * Copyright 2022 Google LLC
+ * SPDX-License-Identifier: Apache-2.0
+ */
+import {GerritView} from '../../services/router/router-model';
+import {Model} from '../model';
+import {ViewState} from './base';
+
+export interface SettingsViewState extends ViewState {
+  view: GerritView.SETTINGS;
+  emailToken?: string;
+}
+
+const DEFAULT_STATE: SettingsViewState = {view: GerritView.SETTINGS};
+
+export class SettingsViewModel extends Model<SettingsViewState> {
+  constructor() {
+    super(DEFAULT_STATE);
+  }
+
+  updateState(state: SettingsViewState) {
+    this.subject$.next({...state});
+  }
+}
diff --git a/polygerrit-ui/app/utils/admin-nav-util.ts b/polygerrit-ui/app/utils/admin-nav-util.ts
index 62f686d..e559467 100644
--- a/polygerrit-ui/app/utils/admin-nav-util.ts
+++ b/polygerrit-ui/app/utils/admin-nav-util.ts
@@ -14,6 +14,7 @@
 import {GerritView} from '../services/router/router-model';
 import {MenuLink} from '../api/admin';
 import {GroupDetailView, RepoDetailView} from './router-util';
+import {AdminChildView} from '../models/views/admin';
 
 const ADMIN_LINKS: NavLink[] = [
   {
@@ -238,7 +239,7 @@
   name: string;
   noBaseUrl: boolean;
   url: string;
-  view?: GerritView;
+  view?: GerritView | AdminChildView;
   viewableToAll?: boolean;
   section?: string;
   capability?: string;