diff --git a/webui/.eslintrc.js b/webui/.eslintrc.js
index 7adbb8d5..2dfa7543 100644
--- a/webui/.eslintrc.js
+++ b/webui/.eslintrc.js
@@ -29,9 +29,13 @@ module.exports = {
position: 'after',
},
],
- groups: [['builtin', 'external'], 'parent', ['sibling', 'index']],
+ pathGroupsExcludedImportTypes: ["builtin"],
+ groups: [['builtin', 'external'], ['internal', 'parent'], ['sibling', 'index']],
'newlines-between': 'always',
},
],
},
+ settings: {
+ 'import/internal-regex': '^src/',
+ },
};
diff --git a/webui/src/App.tsx b/webui/src/App.tsx
index 6f66a6ec..16663870 100644
--- a/webui/src/App.tsx
+++ b/webui/src/App.tsx
@@ -1,68 +1,17 @@
-import AppBar from '@material-ui/core/AppBar';
-import CssBaseline from '@material-ui/core/CssBaseline';
-import Toolbar from '@material-ui/core/Toolbar';
-import {
- createMuiTheme,
- ThemeProvider,
- makeStyles,
-} from '@material-ui/core/styles';
import React from 'react';
import { Route, Switch } from 'react-router';
-import { Link } from 'react-router-dom';
-import CurrentIdentity from './CurrentIdentity';
-import BugQuery from './bug/BugQuery';
-import ListQuery from './list/ListQuery';
-
-const theme = createMuiTheme({
- palette: {
- primary: {
- main: '#263238',
- },
- },
-});
-
-const useStyles = makeStyles(theme => ({
- offset: {
- ...theme.mixins.toolbar,
- },
- filler: {
- flexGrow: 1,
- },
- appTitle: {
- ...theme.typography.h6,
- color: 'white',
- textDecoration: 'none',
- display: 'flex',
- alignItems: 'center',
- },
- logo: {
- height: '42px',
- marginRight: theme.spacing(2),
- },
-}));
+import Layout from './layout';
+import BugPage from './pages/bug';
+import ListPage from './pages/list';
export default function App() {
- const classes = useStyles();
-
return (
-
-
-
-
-
-
- git-bug
-
-
-
-
-
-
+
-
-
+
+
-
+
);
}
diff --git a/webui/src/__tests__/query.ts b/webui/src/__tests__/query.ts
index 5f4b58eb..2f04817c 100644
--- a/webui/src/__tests__/query.ts
+++ b/webui/src/__tests__/query.ts
@@ -1,4 +1,4 @@
-import { parse, stringify, quote } from '../list/Filter';
+import { parse, stringify, quote } from 'src/pages/list/Filter';
it('parses a simple query', () => {
expect(parse('foo:bar')).toEqual({
diff --git a/webui/src/apollo.ts b/webui/src/apollo.ts
new file mode 100644
index 00000000..785f0e7f
--- /dev/null
+++ b/webui/src/apollo.ts
@@ -0,0 +1,18 @@
+import ApolloClient from 'apollo-boost';
+import {
+ IntrospectionFragmentMatcher,
+ InMemoryCache,
+} from 'apollo-cache-inmemory';
+
+import introspectionQueryResultData from './fragmentTypes';
+
+const client = new ApolloClient({
+ uri: '/graphql',
+ cache: new InMemoryCache({
+ fragmentMatcher: new IntrospectionFragmentMatcher({
+ introspectionQueryResultData,
+ }),
+ }),
+});
+
+export default client;
diff --git a/webui/src/components/Author.tsx b/webui/src/components/Author.tsx
index 43fd108e..9ac1da52 100644
--- a/webui/src/components/Author.tsx
+++ b/webui/src/components/Author.tsx
@@ -1,6 +1,7 @@
+import React from 'react';
+
import MAvatar from '@material-ui/core/Avatar';
import Tooltip from '@material-ui/core/Tooltip/Tooltip';
-import React from 'react';
import { AuthoredFragment } from './fragments.generated';
diff --git a/webui/src/components/Content/ImageTag.tsx b/webui/src/components/Content/ImageTag.tsx
index bdb36873..70ee1bc0 100644
--- a/webui/src/components/Content/ImageTag.tsx
+++ b/webui/src/components/Content/ImageTag.tsx
@@ -1,6 +1,7 @@
-import { makeStyles } from '@material-ui/styles';
import React from 'react';
+import { makeStyles } from '@material-ui/styles';
+
const useStyles = makeStyles({
tag: {
maxWidth: '100%',
diff --git a/webui/src/components/Content/PreTag.tsx b/webui/src/components/Content/PreTag.tsx
index d3b4c273..5256ab12 100644
--- a/webui/src/components/Content/PreTag.tsx
+++ b/webui/src/components/Content/PreTag.tsx
@@ -1,6 +1,7 @@
-import { makeStyles } from '@material-ui/styles';
import React from 'react';
+import { makeStyles } from '@material-ui/styles';
+
const useStyles = makeStyles({
tag: {
maxWidth: '100%',
diff --git a/webui/src/components/Date.tsx b/webui/src/components/Date.tsx
index a830546c..be0f5835 100644
--- a/webui/src/components/Date.tsx
+++ b/webui/src/components/Date.tsx
@@ -1,8 +1,9 @@
-import Tooltip from '@material-ui/core/Tooltip/Tooltip';
import moment from 'moment';
import React from 'react';
import Moment from 'react-moment';
+import Tooltip from '@material-ui/core/Tooltip/Tooltip';
+
const HOUR = 1000 * 3600;
const DAY = 24 * HOUR;
const WEEK = 7 * DAY;
diff --git a/webui/src/components/Label.tsx b/webui/src/components/Label.tsx
index 48c20096..1fb8caea 100644
--- a/webui/src/components/Label.tsx
+++ b/webui/src/components/Label.tsx
@@ -1,13 +1,15 @@
+import React from 'react';
+
import { common } from '@material-ui/core/colors';
import { makeStyles } from '@material-ui/core/styles';
import {
getContrastRatio,
darken,
} from '@material-ui/core/styles/colorManipulator';
-import React from 'react';
+
+import { Color } from 'src/gqlTypes';
import { LabelFragment } from './fragments.generated';
-import { Color } from '../gqlTypes';
// Minimum contrast between the background and the text color
const contrastThreshold = 2.5;
diff --git a/webui/src/index.tsx b/webui/src/index.tsx
index c64daf0c..9bdaddca 100644
--- a/webui/src/index.tsx
+++ b/webui/src/index.tsx
@@ -1,36 +1,19 @@
-import { createMuiTheme } from '@material-ui/core/styles';
-import ThemeProvider from '@material-ui/styles/ThemeProvider';
-import ApolloClient from 'apollo-boost';
-import {
- IntrospectionFragmentMatcher,
- InMemoryCache,
-} from 'apollo-cache-inmemory';
import React from 'react';
import { ApolloProvider } from 'react-apollo';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
+import ThemeProvider from '@material-ui/styles/ThemeProvider';
+
import App from './App';
-import introspectionQueryResultData from './fragmentTypes';
-
-const theme = createMuiTheme();
-
-const client = new ApolloClient({
- uri: '/graphql',
- cache: new InMemoryCache({
- fragmentMatcher: new IntrospectionFragmentMatcher({
- introspectionQueryResultData,
- }),
- }),
-});
+import apolloClient from './apollo';
+import theme from './theme';
ReactDOM.render(
-
+
-
-
-
+
,
diff --git a/webui/src/CurrentIdentity.graphql b/webui/src/layout/CurrentIdentity.graphql
similarity index 100%
rename from webui/src/CurrentIdentity.graphql
rename to webui/src/layout/CurrentIdentity.graphql
diff --git a/webui/src/CurrentIdentity.tsx b/webui/src/layout/CurrentIdentity.tsx
similarity index 99%
rename from webui/src/CurrentIdentity.tsx
rename to webui/src/layout/CurrentIdentity.tsx
index 256f44c4..21f489ef 100644
--- a/webui/src/CurrentIdentity.tsx
+++ b/webui/src/layout/CurrentIdentity.tsx
@@ -1,6 +1,7 @@
+import React from 'react';
+
import Avatar from '@material-ui/core/Avatar';
import { makeStyles } from '@material-ui/core/styles';
-import React from 'react';
import { useCurrentIdentityQuery } from './CurrentIdentity.generated';
diff --git a/webui/src/layout/Header.tsx b/webui/src/layout/Header.tsx
new file mode 100644
index 00000000..317d3e23
--- /dev/null
+++ b/webui/src/layout/Header.tsx
@@ -0,0 +1,50 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+
+import AppBar from '@material-ui/core/AppBar';
+import Toolbar from '@material-ui/core/Toolbar';
+import { makeStyles } from '@material-ui/core/styles';
+
+import CurrentIdentity from './CurrentIdentity';
+
+const useStyles = makeStyles(theme => ({
+ offset: {
+ ...theme.mixins.toolbar,
+ },
+ filler: {
+ flexGrow: 1,
+ },
+ appTitle: {
+ ...theme.typography.h6,
+ color: 'white',
+ textDecoration: 'none',
+ display: 'flex',
+ alignItems: 'center',
+ },
+ logo: {
+ height: '42px',
+ marginRight: theme.spacing(2),
+ },
+}));
+
+function Header() {
+ const classes = useStyles();
+
+ return (
+ <>
+
+
+
+
+ git-bug
+
+
+
+
+
+
+ >
+ );
+}
+
+export default Header;
diff --git a/webui/src/layout/index.tsx b/webui/src/layout/index.tsx
new file mode 100644
index 00000000..42a0cfc1
--- /dev/null
+++ b/webui/src/layout/index.tsx
@@ -0,0 +1,18 @@
+import React from 'react';
+
+import CssBaseline from '@material-ui/core/CssBaseline';
+
+import Header from './Header';
+
+type Props = { children: React.ReactNode };
+function Layout({ children }: Props) {
+ return (
+ <>
+
+
+ {children}
+ >
+ );
+}
+
+export default Layout;
diff --git a/webui/src/bug/Bug.graphql b/webui/src/pages/bug/Bug.graphql
similarity index 100%
rename from webui/src/bug/Bug.graphql
rename to webui/src/pages/bug/Bug.graphql
diff --git a/webui/src/bug/Bug.tsx b/webui/src/pages/bug/Bug.tsx
similarity index 94%
rename from webui/src/bug/Bug.tsx
rename to webui/src/pages/bug/Bug.tsx
index 0e53e447..998c9528 100644
--- a/webui/src/bug/Bug.tsx
+++ b/webui/src/pages/bug/Bug.tsx
@@ -1,10 +1,11 @@
-import Typography from '@material-ui/core/Typography/Typography';
-import { makeStyles } from '@material-ui/core/styles';
import React from 'react';
-import Author from '../components/Author';
-import Date from '../components/Date';
-import Label from '../components/Label';
+import Typography from '@material-ui/core/Typography/Typography';
+import { makeStyles } from '@material-ui/core/styles';
+
+import Author from 'src/components/Author';
+import Date from 'src/components/Date';
+import Label from 'src/components/Label';
import { BugFragment } from './Bug.generated';
import CommentForm from './CommentForm';
diff --git a/webui/src/bug/BugQuery.graphql b/webui/src/pages/bug/BugQuery.graphql
similarity index 100%
rename from webui/src/bug/BugQuery.graphql
rename to webui/src/pages/bug/BugQuery.graphql
diff --git a/webui/src/bug/BugQuery.tsx b/webui/src/pages/bug/BugQuery.tsx
similarity index 99%
rename from webui/src/bug/BugQuery.tsx
rename to webui/src/pages/bug/BugQuery.tsx
index 2ecf718c..2a70a2f8 100644
--- a/webui/src/bug/BugQuery.tsx
+++ b/webui/src/pages/bug/BugQuery.tsx
@@ -1,7 +1,8 @@
-import CircularProgress from '@material-ui/core/CircularProgress';
import React from 'react';
import { RouteComponentProps } from 'react-router-dom';
+import CircularProgress from '@material-ui/core/CircularProgress';
+
import Bug from './Bug';
import { useGetBugQuery } from './BugQuery.generated';
diff --git a/webui/src/bug/CommentForm.graphql b/webui/src/pages/bug/CommentForm.graphql
similarity index 100%
rename from webui/src/bug/CommentForm.graphql
rename to webui/src/pages/bug/CommentForm.graphql
diff --git a/webui/src/bug/CommentForm.tsx b/webui/src/pages/bug/CommentForm.tsx
similarity index 98%
rename from webui/src/bug/CommentForm.tsx
rename to webui/src/pages/bug/CommentForm.tsx
index a915ecf0..3724baf0 100644
--- a/webui/src/bug/CommentForm.tsx
+++ b/webui/src/pages/bug/CommentForm.tsx
@@ -1,12 +1,13 @@
+import React, { useState, useRef } from 'react';
+
import Button from '@material-ui/core/Button';
import Paper from '@material-ui/core/Paper';
import Tab from '@material-ui/core/Tab';
import Tabs from '@material-ui/core/Tabs';
import TextField from '@material-ui/core/TextField';
import { makeStyles, Theme } from '@material-ui/core/styles';
-import React, { useState, useRef } from 'react';
-import Content from '../components/Content';
+import Content from 'src/components/Content';
import { useAddCommentMutation } from './CommentForm.generated';
import { TimelineDocument } from './TimelineQuery.generated';
diff --git a/webui/src/bug/LabelChange.tsx b/webui/src/pages/bug/LabelChange.tsx
similarity index 89%
rename from webui/src/bug/LabelChange.tsx
rename to webui/src/pages/bug/LabelChange.tsx
index a3950524..764947ee 100644
--- a/webui/src/bug/LabelChange.tsx
+++ b/webui/src/pages/bug/LabelChange.tsx
@@ -1,9 +1,10 @@
-import { makeStyles } from '@material-ui/core/styles';
import React from 'react';
-import Author from '../components/Author';
-import Date from '../components/Date';
-import Label from '../components/Label';
+import { makeStyles } from '@material-ui/core/styles';
+
+import Author from 'src/components/Author';
+import Date from 'src/components/Date';
+import Label from 'src/components/Label';
import { LabelChangeFragment } from './LabelChangeFragment.generated';
diff --git a/webui/src/bug/LabelChangeFragment.graphql b/webui/src/pages/bug/LabelChangeFragment.graphql
similarity index 74%
rename from webui/src/bug/LabelChangeFragment.graphql
rename to webui/src/pages/bug/LabelChangeFragment.graphql
index 01b94a98..82d41235 100644
--- a/webui/src/bug/LabelChangeFragment.graphql
+++ b/webui/src/pages/bug/LabelChangeFragment.graphql
@@ -1,4 +1,4 @@
-#import "../components/fragments.graphql"
+#import "../../components/fragments.graphql"
fragment LabelChange on LabelChangeTimelineItem {
date
diff --git a/webui/src/bug/Message.tsx b/webui/src/pages/bug/Message.tsx
similarity index 92%
rename from webui/src/bug/Message.tsx
rename to webui/src/pages/bug/Message.tsx
index a61ed3f2..ebb42f6b 100644
--- a/webui/src/bug/Message.tsx
+++ b/webui/src/pages/bug/Message.tsx
@@ -1,10 +1,11 @@
-import Paper from '@material-ui/core/Paper';
-import { makeStyles } from '@material-ui/core/styles';
import React from 'react';
-import Author, { Avatar } from '../components/Author';
-import Date from '../components/Date';
-import Content from '../components/Content';
+import Paper from '@material-ui/core/Paper';
+import { makeStyles } from '@material-ui/core/styles';
+
+import Author, { Avatar } from 'src/components/Author';
+import Content from 'src/components/Content';
+import Date from 'src/components/Date';
import { AddCommentFragment } from './MessageCommentFragment.generated';
import { CreateFragment } from './MessageCreateFragment.generated';
diff --git a/webui/src/bug/MessageCommentFragment.graphql b/webui/src/pages/bug/MessageCommentFragment.graphql
similarity index 68%
rename from webui/src/bug/MessageCommentFragment.graphql
rename to webui/src/pages/bug/MessageCommentFragment.graphql
index 61156fee..00f8342d 100644
--- a/webui/src/bug/MessageCommentFragment.graphql
+++ b/webui/src/pages/bug/MessageCommentFragment.graphql
@@ -1,4 +1,4 @@
-#import "../components/fragments.graphql"
+#import "../../components/fragments.graphql"
fragment AddComment on AddCommentTimelineItem {
createdAt
diff --git a/webui/src/bug/MessageCreateFragment.graphql b/webui/src/pages/bug/MessageCreateFragment.graphql
similarity index 66%
rename from webui/src/bug/MessageCreateFragment.graphql
rename to webui/src/pages/bug/MessageCreateFragment.graphql
index e371b9dc..4cae819d 100644
--- a/webui/src/bug/MessageCreateFragment.graphql
+++ b/webui/src/pages/bug/MessageCreateFragment.graphql
@@ -1,4 +1,4 @@
-#import "../components/fragments.graphql"
+#import "../../components/fragments.graphql"
fragment Create on CreateTimelineItem {
createdAt
diff --git a/webui/src/bug/SetStatus.tsx b/webui/src/pages/bug/SetStatus.tsx
similarity index 87%
rename from webui/src/bug/SetStatus.tsx
rename to webui/src/pages/bug/SetStatus.tsx
index 86105c8a..251abf69 100644
--- a/webui/src/bug/SetStatus.tsx
+++ b/webui/src/pages/bug/SetStatus.tsx
@@ -1,8 +1,9 @@
-import { makeStyles } from '@material-ui/core/styles';
import React from 'react';
-import Author from '../components/Author';
-import Date from '../components/Date';
+import { makeStyles } from '@material-ui/core/styles';
+
+import Author from 'src/components/Author';
+import Date from 'src/components/Date';
import { SetStatusFragment } from './SetStatusFragment.generated';
diff --git a/webui/src/bug/SetStatusFragment.graphql b/webui/src/pages/bug/SetStatusFragment.graphql
similarity index 63%
rename from webui/src/bug/SetStatusFragment.graphql
rename to webui/src/pages/bug/SetStatusFragment.graphql
index 5a3986d0..d8380409 100644
--- a/webui/src/bug/SetStatusFragment.graphql
+++ b/webui/src/pages/bug/SetStatusFragment.graphql
@@ -1,4 +1,4 @@
-#import "../components/fragments.graphql"
+#import "../../components/fragments.graphql"
fragment SetStatus on SetStatusTimelineItem {
date
diff --git a/webui/src/bug/SetTitle.tsx b/webui/src/pages/bug/SetTitle.tsx
similarity index 90%
rename from webui/src/bug/SetTitle.tsx
rename to webui/src/pages/bug/SetTitle.tsx
index e57aaafb..304fd2e2 100644
--- a/webui/src/bug/SetTitle.tsx
+++ b/webui/src/pages/bug/SetTitle.tsx
@@ -1,8 +1,9 @@
-import { makeStyles } from '@material-ui/core/styles';
import React from 'react';
-import Author from '../components/Author';
-import Date from '../components/Date';
+import { makeStyles } from '@material-ui/core/styles';
+
+import Author from 'src/components/Author';
+import Date from 'src/components/Date';
import { SetTitleFragment } from './SetTitleFragment.generated';
diff --git a/webui/src/bug/SetTitleFragment.graphql b/webui/src/pages/bug/SetTitleFragment.graphql
similarity index 64%
rename from webui/src/bug/SetTitleFragment.graphql
rename to webui/src/pages/bug/SetTitleFragment.graphql
index 22d2185c..2225dfd3 100644
--- a/webui/src/bug/SetTitleFragment.graphql
+++ b/webui/src/pages/bug/SetTitleFragment.graphql
@@ -1,4 +1,4 @@
-#import "../components/fragments.graphql"
+#import "../../components/fragments.graphql"
fragment SetTitle on SetTitleTimelineItem {
date
diff --git a/webui/src/bug/Timeline.tsx b/webui/src/pages/bug/Timeline.tsx
similarity index 99%
rename from webui/src/bug/Timeline.tsx
rename to webui/src/pages/bug/Timeline.tsx
index ba0f9fc7..73c88cdf 100644
--- a/webui/src/bug/Timeline.tsx
+++ b/webui/src/pages/bug/Timeline.tsx
@@ -1,6 +1,7 @@
-import { makeStyles } from '@material-ui/core/styles';
import React from 'react';
+import { makeStyles } from '@material-ui/core/styles';
+
import LabelChange from './LabelChange';
import Message from './Message';
import SetStatus from './SetStatus';
diff --git a/webui/src/bug/TimelineQuery.graphql b/webui/src/pages/bug/TimelineQuery.graphql
similarity index 100%
rename from webui/src/bug/TimelineQuery.graphql
rename to webui/src/pages/bug/TimelineQuery.graphql
diff --git a/webui/src/bug/TimelineQuery.tsx b/webui/src/pages/bug/TimelineQuery.tsx
similarity index 99%
rename from webui/src/bug/TimelineQuery.tsx
rename to webui/src/pages/bug/TimelineQuery.tsx
index 9c4cf183..74eed52b 100644
--- a/webui/src/bug/TimelineQuery.tsx
+++ b/webui/src/pages/bug/TimelineQuery.tsx
@@ -1,6 +1,7 @@
-import CircularProgress from '@material-ui/core/CircularProgress';
import React from 'react';
+import CircularProgress from '@material-ui/core/CircularProgress';
+
import Timeline from './Timeline';
import { useTimelineQuery } from './TimelineQuery.generated';
diff --git a/webui/src/pages/bug/index.tsx b/webui/src/pages/bug/index.tsx
new file mode 100644
index 00000000..a3bbcea4
--- /dev/null
+++ b/webui/src/pages/bug/index.tsx
@@ -0,0 +1 @@
+export { default } from './BugQuery';
diff --git a/webui/src/list/BugRow.graphql b/webui/src/pages/list/BugRow.graphql
similarity index 71%
rename from webui/src/list/BugRow.graphql
rename to webui/src/pages/list/BugRow.graphql
index c2966f10..547c09d8 100644
--- a/webui/src/list/BugRow.graphql
+++ b/webui/src/pages/list/BugRow.graphql
@@ -1,4 +1,4 @@
-#import "../components/fragments.graphql"
+#import "../../components/fragments.graphql"
fragment BugRow on Bug {
id
diff --git a/webui/src/list/BugRow.tsx b/webui/src/pages/list/BugRow.tsx
similarity index 95%
rename from webui/src/list/BugRow.tsx
rename to webui/src/pages/list/BugRow.tsx
index 181aec2e..829877ef 100644
--- a/webui/src/list/BugRow.tsx
+++ b/webui/src/pages/list/BugRow.tsx
@@ -1,15 +1,16 @@
+import React from 'react';
+import { Link } from 'react-router-dom';
+
import TableCell from '@material-ui/core/TableCell/TableCell';
import TableRow from '@material-ui/core/TableRow/TableRow';
import Tooltip from '@material-ui/core/Tooltip/Tooltip';
import { makeStyles } from '@material-ui/core/styles';
import CheckCircleOutline from '@material-ui/icons/CheckCircleOutline';
import ErrorOutline from '@material-ui/icons/ErrorOutline';
-import React from 'react';
-import { Link } from 'react-router-dom';
-import Date from '../components/Date';
-import Label from '../components/Label';
-import { Status } from '../gqlTypes';
+import Date from 'src/components/Date';
+import Label from 'src/components/Label';
+import { Status } from 'src/gqlTypes';
import { BugRowFragment } from './BugRow.generated';
diff --git a/webui/src/list/Filter.tsx b/webui/src/pages/list/Filter.tsx
similarity index 99%
rename from webui/src/list/Filter.tsx
rename to webui/src/pages/list/Filter.tsx
index 30b52de8..1a3cdd6b 100644
--- a/webui/src/list/Filter.tsx
+++ b/webui/src/pages/list/Filter.tsx
@@ -1,12 +1,13 @@
+import clsx from 'clsx';
+import { LocationDescriptor } from 'history';
+import React, { useState, useRef } from 'react';
+import { Link } from 'react-router-dom';
+
import Menu from '@material-ui/core/Menu';
import MenuItem from '@material-ui/core/MenuItem';
import { SvgIconProps } from '@material-ui/core/SvgIcon';
import { makeStyles } from '@material-ui/core/styles';
import ArrowDropDown from '@material-ui/icons/ArrowDropDown';
-import clsx from 'clsx';
-import { LocationDescriptor } from 'history';
-import React, { useState, useRef } from 'react';
-import { Link } from 'react-router-dom';
export type Query = { [key: string]: Array };
diff --git a/webui/src/list/FilterToolbar.graphql b/webui/src/pages/list/FilterToolbar.graphql
similarity index 100%
rename from webui/src/list/FilterToolbar.graphql
rename to webui/src/pages/list/FilterToolbar.graphql
diff --git a/webui/src/list/FilterToolbar.tsx b/webui/src/pages/list/FilterToolbar.tsx
similarity index 99%
rename from webui/src/list/FilterToolbar.tsx
rename to webui/src/pages/list/FilterToolbar.tsx
index b95b10bc..825a9dee 100644
--- a/webui/src/list/FilterToolbar.tsx
+++ b/webui/src/pages/list/FilterToolbar.tsx
@@ -1,10 +1,11 @@
import { pipe } from '@arrows/composition';
+import { LocationDescriptor } from 'history';
+import React from 'react';
+
import Toolbar from '@material-ui/core/Toolbar';
import { makeStyles } from '@material-ui/core/styles';
import CheckCircleOutline from '@material-ui/icons/CheckCircleOutline';
import ErrorOutline from '@material-ui/icons/ErrorOutline';
-import { LocationDescriptor } from 'history';
-import React from 'react';
import {
FilterDropdown,
diff --git a/webui/src/list/List.tsx b/webui/src/pages/list/List.tsx
similarity index 99%
rename from webui/src/list/List.tsx
rename to webui/src/pages/list/List.tsx
index cebd13f2..c1cae122 100644
--- a/webui/src/list/List.tsx
+++ b/webui/src/pages/list/List.tsx
@@ -1,6 +1,7 @@
+import React from 'react';
+
import Table from '@material-ui/core/Table/Table';
import TableBody from '@material-ui/core/TableBody/TableBody';
-import React from 'react';
import BugRow from './BugRow';
import { BugListFragment } from './ListQuery.generated';
diff --git a/webui/src/list/ListQuery.graphql b/webui/src/pages/list/ListQuery.graphql
similarity index 100%
rename from webui/src/list/ListQuery.graphql
rename to webui/src/pages/list/ListQuery.graphql
diff --git a/webui/src/list/ListQuery.tsx b/webui/src/pages/list/ListQuery.tsx
similarity index 99%
rename from webui/src/list/ListQuery.tsx
rename to webui/src/pages/list/ListQuery.tsx
index 84b72431..6858b6c6 100644
--- a/webui/src/list/ListQuery.tsx
+++ b/webui/src/pages/list/ListQuery.tsx
@@ -1,3 +1,7 @@
+import { ApolloError } from 'apollo-boost';
+import React, { useState, useEffect, useRef } from 'react';
+import { useLocation, useHistory, Link } from 'react-router-dom';
+
import IconButton from '@material-ui/core/IconButton';
import InputBase from '@material-ui/core/InputBase';
import Paper from '@material-ui/core/Paper';
@@ -6,9 +10,6 @@ import ErrorOutline from '@material-ui/icons/ErrorOutline';
import KeyboardArrowLeft from '@material-ui/icons/KeyboardArrowLeft';
import KeyboardArrowRight from '@material-ui/icons/KeyboardArrowRight';
import Skeleton from '@material-ui/lab/Skeleton';
-import { ApolloError } from 'apollo-boost';
-import React, { useState, useEffect, useRef } from 'react';
-import { useLocation, useHistory, Link } from 'react-router-dom';
import FilterToolbar from './FilterToolbar';
import List from './List';
diff --git a/webui/src/pages/list/index.ts b/webui/src/pages/list/index.ts
new file mode 100644
index 00000000..8a91ce70
--- /dev/null
+++ b/webui/src/pages/list/index.ts
@@ -0,0 +1 @@
+export { default } from './ListQuery';
diff --git a/webui/src/theme.ts b/webui/src/theme.ts
new file mode 100644
index 00000000..d41cd731
--- /dev/null
+++ b/webui/src/theme.ts
@@ -0,0 +1,11 @@
+import { createMuiTheme } from '@material-ui/core/styles';
+
+const theme = createMuiTheme({
+ palette: {
+ primary: {
+ main: '#263238',
+ },
+ },
+});
+
+export default theme;
diff --git a/webui/tsconfig.json b/webui/tsconfig.json
index 30ba544b..4e83eef3 100644
--- a/webui/tsconfig.json
+++ b/webui/tsconfig.json
@@ -1,7 +1,11 @@
{
"compilerOptions": {
"target": "es5",
- "lib": ["dom", "dom.iterable", "esnext"],
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
"allowJs": true,
"skipLibCheck": true,
"esModuleInterop": true,
@@ -14,7 +18,13 @@
"isolatedModules": true,
"noEmit": true,
"jsx": "react",
- "typeRoots": ["node_modules/@types/", "types/"]
+ "typeRoots": [
+ "node_modules/@types/",
+ "types/"
+ ],
+ "baseUrl": "."
},
- "include": ["src"]
+ "include": [
+ "src"
+ ]
}