import { get } from "lodash";
import React from "react";
import Button from "antd/lib/button";
import Modal from "antd/lib/modal";
import routeWithUserSession from "@/components/ApplicationArea/routeWithUserSession";
import navigateTo from "@/components/ApplicationArea/navigateTo";
import Paginator from "@/components/Paginator";
import QuerySnippetDialog from "@/components/query-snippets/QuerySnippetDialog";
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 wrapSettingsTab from "@/components/SettingsWrapper";
import PlainButton from "@/components/PlainButton";
import QuerySnippet from "@/services/query-snippet";
import { currentUser } from "@/services/auth";
import { policy } from "@/services/policy";
import notification from "@/services/notification";
import routes from "@/services/routes";
import "./QuerySnippetsList.less";
const canEditQuerySnippet = querySnippet => currentUser.isAdmin || currentUser.id === get(querySnippet, "user.id");
class QuerySnippetsList extends React.Component {
static propTypes = {
controller: ControllerType.isRequired,
};
listColumns = [
Columns.custom.sortable(
(text, querySnippet) => (
{snippet}, {
title: "Snippet",
field: "snippet",
}),
Columns.avatar({ field: "user", className: "p-l-0 p-r-0" }, name => `Created by ${name}`),
Columns.date.sortable({
title: "Created At",
field: "created_at",
className: "text-nowrap",
width: "1%",
}),
Columns.custom(
(text, querySnippet) =>
canEditQuerySnippet(querySnippet) && (
),
{
width: "1%",
}
),
];
componentDidMount() {
const { isNewOrEditPage, querySnippetId } = this.props.controller.params;
if (isNewOrEditPage) {
if (querySnippetId === "new") {
if (policy.isCreateQuerySnippetEnabled()) {
this.showSnippetDialog();
} else {
navigateTo("query_snippets", true);
}
} else {
QuerySnippet.get({ id: querySnippetId })
.then(this.showSnippetDialog)
.catch(error => {
this.props.controller.handleError(error);
});
}
}
}
saveQuerySnippet = querySnippet => {
const saveSnippet = querySnippet.id ? QuerySnippet.save : QuerySnippet.create;
return saveSnippet(querySnippet);
};
deleteQuerySnippet = (event, querySnippet) => {
Modal.confirm({
title: "Delete Query Snippet",
content: "Are you sure you want to delete this query snippet?",
okText: "Yes",
okType: "danger",
cancelText: "No",
onOk: () => {
QuerySnippet.delete(querySnippet)
.then(() => {
notification.success("Query snippet deleted successfully.");
this.props.controller.update();
})
.catch(() => {
notification.error("Failed deleting query snippet.");
});
},
});
};
showSnippetDialog = (querySnippet = null) => {
const canSave = !querySnippet || canEditQuerySnippet(querySnippet);
navigateTo("query_snippets/" + get(querySnippet, "id", "new"), true);
const goToSnippetsList = () => navigateTo("query_snippets", true);
QuerySnippetDialog.showModal({
querySnippet,
readOnly: !canSave,
})
.onClose(querySnippet =>
this.saveQuerySnippet(querySnippet).then(() => {
this.props.controller.update();
goToSnippetsList();
})
)
.onDismiss(goToSnippetsList);
};
render() {
const { controller } = this.props;
return (