Improve admin page layout

This commit is contained in:
Jan Tuomi
2019-03-11 20:52:41 +02:00
parent 4986078b0b
commit da2a1db61b
5 changed files with 118 additions and 57 deletions
@@ -23,4 +23,15 @@
padding: 0.5rem 1rem;
color: $white;
}
h1 {
margin-top: 0;
}
.error {
border: 1px solid $orange2;
padding: 8px 16px;
color: $orange2;
display: inline-block;
}
}
+45 -24
View File
@@ -13,6 +13,7 @@ export interface AdminEventPageProps {
}
export interface AdminEventPageState {
events: Event[];
error?: string;
}
class AdminEventPage extends React.Component<AdminEventPageProps, AdminEventPageState> {
@@ -45,42 +46,62 @@ class AdminEventPage extends React.Component<AdminEventPageProps, AdminEventPage
}
}
fetchEvents = () => {
fetchEvents = async () => {
const getEventsPromise = getEvents();
getEventsPromise.then(events => {
try {
const events = await getEventsPromise;
this.setState({
events,
});
});
return getEventsPromise;
return getEventsPromise;
} catch (err) {
this.setState({
error: String(err),
});
}
}
renderData = () => {
const { events, error } = this.state;
if (error) {
return <div className="error">{ error }</div>;
}
if (!events || events.length === 0) {
return <div>No events.</div>;
}
return (
<table>
<thead>
<tr>
<th>Title</th>
<th>Start time</th>
<th>End time</th>
</tr>
</thead>
<tbody>
{events.map(event => (
<tr key={event.id}>
<td><Link to={`/admin/events/${event.id}`}>{event.title}</Link></td>
<td>{formatRelative(new Date(event.start_time), new Date())}</td>
<td>{formatRelative(new Date(event.end_time), new Date())}</td>
</tr>
))}
</tbody>
</table>
);
}
render() {
const { events } = this.state;
return (
<div className="admin-event-page">
<Helmet>
<link rel="canonical" href="https://sik.ayy.fi/admin/events" />
</Helmet>
<table>
<thead>
<tr>
<th>Title</th>
<th>Start time</th>
<th>End time</th>
</tr>
</thead>
<tbody>
{events.map(event => (
<tr key={event.id}>
<td><Link to={`/admin/events/${event.id}`}>{event.title}</Link></td>
<td>{formatRelative(new Date(event.start_time), new Date())}</td>
<td>{formatRelative(new Date(event.end_time), new Date())}</td>
</tr>
))}
</tbody>
</table>
<h1>Events</h1>
{ this.renderData() }
</div>
);
}
+55 -32
View File
@@ -6,12 +6,14 @@ import { StaticContext } from "../../server/StaticContext";
import{Feed, getFeed} from "../../models/Feed";
import { getEvents } from "../../models/Event";
import { formatRelative } from "date-fns";
import { th } from "date-fns/esm/locale";
export interface AdminFeedPageProps {
staticContext: StaticContext;
}
export interface AdminFeedPageState {
feeds: Feed[];
feed: Feed[];
error?: string;
}
class AdminFeedPage extends React.Component<AdminFeedPageProps, AdminFeedPageState> {
@@ -25,61 +27,82 @@ class AdminFeedPage extends React.Component<AdminFeedPageProps, AdminFeedPageSta
we have to store all promises in it. Otherwise, operate
normally. See server/index.ts. */
if (staticContext.resolutions.getFeed) {
const feeds = staticContext.resolutions.getFeed as Feed[];
const feed = staticContext.resolutions.getFeed as Feed[];
this.state = {
feeds,
feed,
};
} else {
this.state = {
feeds: [],
feed: [],
};
const promiseFeeds = this.fetchFeed();
staticContext.promises.getFeed = promiseFeeds;
const promiseFeed = this.fetchFeed();
staticContext.promises.getFeed = promiseFeed;
}
} else {
this.state = {
feeds: [],
feed: [],
};
this.fetchFeed();
}
}
fetchFeed = () => {
const getFeedsPromise = getFeed();
getFeedsPromise.then(feeds => {
fetchFeed = async () => {
const getFeedPromise = getFeed();
try {
const feed = await getFeedPromise;
this.setState({
feeds,
feed,
});
});
return getFeedsPromise;
return getFeedPromise;
} catch (err) {
this.setState({
error: String(err),
});
}
}
renderData = () => {
const { feed, error } = this.state;
if (error) {
return <div className="error">{error}</div>;
}
if (!feed || feed.length === 0) {
return <div>No posts.</div>;
}
return (
<table>
<thead>
<tr>
<th>Title</th>
<th>Description</th>
<th>Publish time</th>
</tr>
</thead>
<tbody>
{feed.map(post => (
<tr key={post.id}>
<td><Link to={`/admin/feed/${post.id}`}>{post.title}</Link></td>
<td>{post.description}</td>
<td>{formatRelative(new Date(post.publish_time), new Date())}</td>
</tr>
))}
</tbody>
</table>
);
}
render() {
const { feeds } = this.state;
return (
<div className="admin-feed-page">
<Helmet>
<link rel="canonical" href="https://sik.ayy.fi/admin/feed" />
</Helmet>
<table>
<thead>
<tr>
<th>Title</th>
<th>Description</th>
<th>Publish time</th>
</tr>
</thead>
<tbody>
{feeds.map(feed => (
<tr key={feed.id}>
<td><Link to={`/admin/feed/${feed.id}`}>{feed.title}</Link></td>
<td>{feed.description}</td>
<td>{formatRelative(new Date(feed.publish_time), new Date())}</td>
</tr>
))}
</tbody>
</table>
<h1>Feed</h1>
{ this.renderData() }
</div>
);
}
@@ -1,3 +1,8 @@
.admin-front-page {
margin: 0 1rem;
a {
text-decoration: underline;
display: block;
}
}
+2 -1
View File
@@ -13,8 +13,9 @@ class AdminFrontPage extends React.Component<AdminFrontPageProps, AdminFrontPage
<Helmet>
<link rel="canonical" href="https://sik.ayy.fi/admin" />
</Helmet>
<div>Admin Front Page</div>
<h1>SIK Admin</h1>
<Link to="/admin/events">Events</Link>
<Link to="/admin/feed">Feed</Link>
</div>
);
}