import { map, uniqueId } from "lodash"; import React from "react"; import Switch from "antd/lib/switch"; import routeWithUserSession from "@/components/ApplicationArea/routeWithUserSession"; import Link from "@/components/Link"; import Paginator from "@/components/Paginator"; import { QueryTagsControl } from "@/components/tags-control/TagsControl"; import SchedulePhrase from "@/components/queries/SchedulePhrase"; import TimeAgo from "@/components/TimeAgo"; import Layout from "@/components/admin/Layout"; import { wrap as itemsList, ControllerType } from "@/components/items-list/ItemsList"; import { ItemsSource } 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 { axios } from "@/services/axios"; import { Query } from "@/services/query"; import recordEvent from "@/services/recordEvent"; import routes from "@/services/routes"; class OutdatedQueries extends React.Component { static propTypes = { controller: ControllerType.isRequired, }; listColumns = [ { title: "ID", field: "id", width: "1%", align: "right", sorter: true, }, Columns.custom.sortable( (text, item) => ( {item.name} ), { title: "Name", field: "name", width: null, } ), Columns.avatar({ field: "user", className: "p-l-0 p-r-0" }, name => `Created by ${name}`), Columns.dateTime.sortable({ title: "Created At", field: "created_at" }), Columns.duration.sortable({ title: "Runtime", field: "runtime" }), Columns.dateTime.sortable({ title: "Last Executed At", field: "retrieved_at", orderByField: "executed_at" }), Columns.custom.sortable((text, item) => , { title: "Update Schedule", field: "schedule", }), ]; state = { autoUpdate: true, }; _updateTimer = null; autoUpdateSwitchId = uniqueId("auto-update-switch"); componentDidMount() { recordEvent("view", "page", "admin/queries/outdated"); this.update(true); } componentWillUnmount() { clearTimeout(this._updateTimer); } update = (isInitialCall = false) => { if (!isInitialCall && this.state.autoUpdate) { this.props.controller.update(); } this._updateTimer = setTimeout(this.update, 60 * 1000); }; render() { const { controller } = this.props; return ( Auto update this.setState({ autoUpdate })} /> {controller.params.lastUpdatedAt && ( Last updated: )} {!controller.isLoaded && } {controller.isLoaded && controller.isEmpty && ( There are no outdated queries. )} {controller.isLoaded && !controller.isEmpty && ( controller.updatePagination({ itemsPerPage })} page={controller.page} onChange={page => controller.updatePagination({ page })} /> )} ); } } const OutdatedQueriesPage = itemsList( OutdatedQueries, () => new ItemsSource({ doRequest(request, context) { return ( axios .get("/api/admin/queries/outdated") // eslint-disable-next-line camelcase .then(({ queries, updated_at }) => { context.setCustomParams({ lastUpdatedAt: parseFloat(updated_at) }); return queries; }) ); }, processResults(items) { return map(items, item => new Query(item)); }, isPlainList: true, }), () => new StateStorage({ orderByField: "created_at", orderByReverse: true }) ); routes.register( "Admin.OutdatedQueries", routeWithUserSession({ path: "/admin/queries/outdated", title: "Outdated Queries", render: pageProps => , }) );