client/app/pages/alerts/AlertsList.jsx (134 lines of code) (raw):
import { toUpper } from "lodash";
import React from "react";
import Button from "antd/lib/button";
import routeWithUserSession from "@/components/ApplicationArea/routeWithUserSession";
import PageHeader from "@/components/PageHeader";
import Paginator from "@/components/Paginator";
import EmptyState from "@/components/empty-state/EmptyState";
import { wrap as itemsList, ControllerType } from "@/components/items-list/ItemsList";
import { ResourceItemsSource } from "@/components/items-list/classes/ItemsSource";
import { StateStorage } from "@/components/items-list/classes/StateStorage";
import LoadingState from "@/components/items-list/components/LoadingState";
import ItemsTable, { Columns } from "@/components/items-list/components/ItemsTable";
import Alert from "@/services/alert";
import { currentUser } from "@/services/auth";
import routes from "@/services/routes";
export const STATE_CLASS = {
unknown: "label-warning",
ok: "label-success",
triggered: "label-danger",
};
class AlertsList extends React.Component {
static propTypes = {
controller: ControllerType.isRequired,
};
listColumns = [
Columns.custom.sortable(
(text, alert) => <i className={`fa fa-bell-${alert.options.muted ? "slash" : "o"} p-r-0`} />,
{
title: <i className="fa fa-bell p-r-0" />,
field: "muted",
width: "1%",
}
),
Columns.custom.sortable(
(text, alert) => (
<div>
<a className="table-main-title" href={"alerts/" + alert.id}>
{alert.name}
</a>
</div>
),
{
title: "Name",
field: "name",
}
),
Columns.custom((text, item) => item.user.name, { title: "Created By" }),
Columns.custom.sortable(
(text, alert) => (
<div>
<span className={`label ${STATE_CLASS[alert.state]}`}>{toUpper(alert.state)}</span>
</div>
),
{
title: "State",
field: "state",
width: "1%",
}
),
Columns.timeAgo.sortable({ title: "Last Updated At", field: "updated_at", className: "text-nowrap", width: "1%" }),
Columns.dateTime.sortable({ title: "Created At", field: "created_at", className: "text-nowrap", width: "1%" }),
];
render() {
const { controller } = this.props;
return (
<div className="page-alerts-list">
<div className="container">
<PageHeader
title={controller.params.pageTitle}
actions={
currentUser.hasPermission("list_alerts") ? (
<Button block type="primary" href="alerts/new">
<i className="fa fa-plus m-r-5" />
New Alert
</Button>
) : null
}
/>
<div>
{!controller.isLoaded && <LoadingState className="" />}
{controller.isLoaded && controller.isEmpty && (
<EmptyState
icon="fa fa-bell-o"
illustration="alert"
description="Get notified on certain events"
helpLink="https://redash.io/help/user-guide/alerts/"
showAlertStep
/>
)}
{controller.isLoaded && !controller.isEmpty && (
<div className="table-responsive bg-white tiled">
<ItemsTable
items={controller.pageItems}
columns={this.listColumns}
orderByField={controller.orderByField}
orderByReverse={controller.orderByReverse}
toggleSorting={controller.toggleSorting}
/>
<Paginator
totalCount={controller.totalItemsCount}
itemsPerPage={controller.itemsPerPage}
page={controller.page}
onChange={page => controller.updatePagination({ page })}
/>
</div>
)}
</div>
</div>
</div>
);
}
}
const AlertsListPage = itemsList(
AlertsList,
() =>
new ResourceItemsSource({
isPlainList: true,
getRequest() {
return {};
},
getResource() {
return Alert.query.bind(Alert);
},
}),
() => new StateStorage({ orderByField: "created_at", orderByReverse: true, itemsPerPage: 20 })
);
routes.register(
"Alerts.List",
routeWithUserSession({
path: "/alerts",
title: "Alerts",
render: pageProps => <AlertsListPage {...pageProps} currentPage="alerts" />,
})
);