client/app/pages/dashboards/DashboardList.jsx (167 lines of code) (raw):
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 { DashboardTagsControl } from "@/components/tags-control/TagsControl";
import { wrap as itemsList, ControllerType } from "@/components/items-list/ItemsList";
import { ResourceItemsSource } from "@/components/items-list/classes/ItemsSource";
import { UrlStateStorage } from "@/components/items-list/classes/StateStorage";
import LoadingState from "@/components/items-list/components/LoadingState";
import * as Sidebar from "@/components/items-list/components/Sidebar";
import ItemsTable, { Columns } from "@/components/items-list/components/ItemsTable";
import CreateDashboardDialog from "@/components/dashboards/CreateDashboardDialog";
import Layout from "@/components/layouts/ContentWithSidebar";
import { Dashboard } from "@/services/dashboard";
import { currentUser } from "@/services/auth";
import routes from "@/services/routes";
import DashboardListEmptyState from "./components/DashboardListEmptyState";
import "./dashboard-list.css";
class DashboardList extends React.Component {
static propTypes = {
controller: ControllerType.isRequired,
};
sidebarMenu = [
{
key: "all",
href: "dashboards",
title: "All Dashboards",
},
{
key: "favorites",
href: "dashboards/favorites",
title: "Favorites",
icon: () => <Sidebar.MenuIcon icon="fa fa-star" />,
},
];
listColumns = [
Columns.favorites({ className: "p-r-0" }),
Columns.custom.sortable(
(text, item) => (
<React.Fragment>
<a className="table-main-title" href={"dashboard/" + item.slug} data-test={item.slug}>
{item.name}
</a>
<DashboardTagsControl
className="d-block"
tags={item.tags}
isDraft={item.is_draft}
isArchived={item.is_archived}
/>
</React.Fragment>
),
{
title: "Name",
field: "name",
width: null,
}
),
Columns.custom((text, item) => item.user.name, { title: "Created By" }),
Columns.dateTime.sortable({
title: "Created At",
field: "created_at",
className: "text-nowrap",
width: "1%",
}),
];
render() {
const { controller } = this.props;
return (
<div className="page-dashboard-list">
<div className="container">
<PageHeader
title={controller.params.pageTitle}
actions={
currentUser.hasPermission("create_dashboard") ? (
<Button block type="primary" onClick={() => CreateDashboardDialog.showModal()}>
<i className="fa fa-plus m-r-5" />
New Dashboard
</Button>
) : null
}
/>
<Layout>
<Layout.Sidebar className="m-b-0">
<Sidebar.SearchInput
placeholder="Search Dashboards..."
value={controller.searchTerm}
onChange={controller.updateSearch}
/>
<Sidebar.Menu items={this.sidebarMenu} selected={controller.params.currentPage} />
<Sidebar.Tags url="api/dashboards/tags" onChange={controller.updateSelectedTags} />
<Sidebar.PageSizeSelect
className="m-b-10"
options={controller.pageSizeOptions}
value={controller.itemsPerPage}
onChange={itemsPerPage => controller.updatePagination({ itemsPerPage })}
/>
</Layout.Sidebar>
<Layout.Content>
{controller.isLoaded ? (
<div data-test="DashboardLayoutContent">
{controller.isEmpty ? (
<DashboardListEmptyState
page={controller.params.currentPage}
searchTerm={controller.searchTerm}
selectedTags={controller.selectedTags}
/>
) : (
<div className="bg-white tiled table-responsive">
<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>
) : (
<LoadingState />
)}
</Layout.Content>
</Layout>
</div>
</div>
);
}
}
const DashboardListPage = itemsList(
DashboardList,
() =>
new ResourceItemsSource({
getResource({ params: { currentPage } }) {
return {
all: Dashboard.query.bind(Dashboard),
favorites: Dashboard.favorites.bind(Dashboard),
}[currentPage];
},
getItemProcessor() {
return item => new Dashboard(item);
},
}),
() => new UrlStateStorage({ orderByField: "created_at", orderByReverse: true })
);
routes.register(
"Dashboards.List",
routeWithUserSession({
path: "/dashboards",
title: "Dashboards",
render: pageProps => <DashboardListPage {...pageProps} currentPage="all" />,
})
);
routes.register(
"Dashboards.Favorites",
routeWithUserSession({
path: "/dashboards/favorites",
title: "Favorite Dashboards",
render: pageProps => <DashboardListPage {...pageProps} currentPage="favorites" />,
})
);