Add search to draft orders

This commit is contained in:
dominik-zeglen 2019-09-11 16:28:42 +02:00
parent 89e7aa82df
commit 38ca4b2444
9 changed files with 191 additions and 15 deletions

View file

@ -5,7 +5,6 @@ import DeleteIcon from "@material-ui/icons/Delete";
import React from "react"; import React from "react";
import { FormattedMessage, useIntl } from "react-intl"; import { FormattedMessage, useIntl } from "react-intl";
import { CategoryListUrlFilters } from "@saleor/categories/urls";
import ActionDialog from "@saleor/components/ActionDialog"; import ActionDialog from "@saleor/components/ActionDialog";
import DeleteFilterTabDialog from "@saleor/components/DeleteFilterTabDialog"; import DeleteFilterTabDialog from "@saleor/components/DeleteFilterTabDialog";
import SaveFilterTabDialog, { import SaveFilterTabDialog, {
@ -33,6 +32,7 @@ import {
collectionAddUrl, collectionAddUrl,
collectionListUrl, collectionListUrl,
CollectionListUrlDialog, CollectionListUrlDialog,
CollectionListUrlFilters,
CollectionListUrlQueryParams, CollectionListUrlQueryParams,
collectionUrl collectionUrl
} from "../../urls"; } from "../../urls";
@ -72,7 +72,7 @@ export const CollectionList: React.StatelessComponent<CollectionListProps> = ({
: 0 : 0
: parseInt(params.activeTab, 0); : parseInt(params.activeTab, 0);
const changeFilterField = (filter: CategoryListUrlFilters) => { const changeFilterField = (filter: CollectionListUrlFilters) => {
reset(); reset();
navigate( navigate(
collectionListUrl({ collectionListUrl({

View file

@ -6,18 +6,36 @@ import { FormattedMessage, useIntl } from "react-intl";
import Container from "@saleor/components/Container"; import Container from "@saleor/components/Container";
import PageHeader from "@saleor/components/PageHeader"; import PageHeader from "@saleor/components/PageHeader";
import SearchBar from "@saleor/components/SearchBar";
import { sectionNames } from "@saleor/intl"; import { sectionNames } from "@saleor/intl";
import { ListActions, PageListProps } from "@saleor/types"; import {
ListActions,
PageListProps,
SearchPageProps,
TabPageProps
} from "@saleor/types";
import { OrderDraftList_draftOrders_edges_node } from "../../types/OrderDraftList"; import { OrderDraftList_draftOrders_edges_node } from "../../types/OrderDraftList";
import OrderDraftList from "../OrderDraftList"; import OrderDraftList from "../OrderDraftList";
export interface OrderDraftListPageProps extends PageListProps, ListActions { export interface OrderDraftListPageProps
extends PageListProps,
ListActions,
SearchPageProps,
TabPageProps {
orders: OrderDraftList_draftOrders_edges_node[]; orders: OrderDraftList_draftOrders_edges_node[];
} }
const OrderDraftListPage: React.StatelessComponent<OrderDraftListPageProps> = ({ const OrderDraftListPage: React.StatelessComponent<OrderDraftListPageProps> = ({
currentTab,
disabled, disabled,
initialSearch,
onAdd, onAdd,
onAll,
onSearchChange,
onTabChange,
onTabDelete,
onTabSave,
tabs,
...listProps ...listProps
}) => { }) => {
const intl = useIntl(); const intl = useIntl();
@ -38,6 +56,19 @@ const OrderDraftListPage: React.StatelessComponent<OrderDraftListPageProps> = ({
</Button> </Button>
</PageHeader> </PageHeader>
<Card> <Card>
<SearchBar
currentTab={currentTab}
initialSearch={initialSearch}
searchPlaceholder={intl.formatMessage({
defaultMessage: "Search Collection"
})}
tabs={tabs}
onAll={onAll}
onSearchChange={onSearchChange}
onTabChange={onTabChange}
onTabDelete={onTabDelete}
onTabSave={onTabSave}
/>
<OrderDraftList disabled={disabled} {...listProps} /> <OrderDraftList disabled={disabled} {...listProps} />
</Card> </Card>
</Container> </Container>

View file

@ -221,8 +221,15 @@ export const orderDraftListQuery = gql`
$after: String $after: String
$last: Int $last: Int
$before: String $before: String
$filter: OrderDraftFilterInput
) { ) {
draftOrders(before: $before, after: $after, first: $first, last: $last) { draftOrders(
before: $before
after: $after
first: $first
last: $last
filter: $filter
) {
edges { edges {
node { node {
__typename __typename

View file

@ -2,7 +2,7 @@
/* eslint-disable */ /* eslint-disable */
// This file was automatically generated and should not be edited. // This file was automatically generated and should not be edited.
import { PaymentChargeStatusEnum, OrderStatus } from "./../../types/globalTypes"; import { OrderDraftFilterInput, PaymentChargeStatusEnum, OrderStatus } from "./../../types/globalTypes";
// ==================================================== // ====================================================
// GraphQL query operation: OrderDraftList // GraphQL query operation: OrderDraftList
@ -81,4 +81,5 @@ export interface OrderDraftListVariables {
after?: string | null; after?: string | null;
last?: number | null; last?: number | null;
before?: string | null; before?: string | null;
filter?: OrderDraftFilterInput | null;
} }

View file

@ -42,9 +42,15 @@ export const orderListUrl = (params?: OrderListUrlQueryParams): string => {
}; };
export const orderDraftListPath = urlJoin(orderSectionUrl, "drafts"); export const orderDraftListPath = urlJoin(orderSectionUrl, "drafts");
export type OrderDraftListUrlDialog = "remove"; export enum OrderDraftListUrlFiltersEnum {
export type OrderDraftListUrlQueryParams = BulkAction & query = "query"
}
export type OrderDraftListUrlFilters = Filters<OrderDraftListUrlFiltersEnum>;
export type OrderDraftListUrlDialog = "remove" | TabActionDialog;
export type OrderDraftListUrlQueryParams = ActiveTab &
BulkAction &
Dialog<OrderDraftListUrlDialog> & Dialog<OrderDraftListUrlDialog> &
OrderDraftListUrlFilters &
Pagination; Pagination;
export const orderDraftListUrl = ( export const orderDraftListUrl = (
params?: OrderDraftListUrlQueryParams params?: OrderDraftListUrlQueryParams

View file

@ -5,6 +5,10 @@ import React from "react";
import { FormattedMessage, useIntl } from "react-intl"; import { FormattedMessage, useIntl } from "react-intl";
import ActionDialog from "@saleor/components/ActionDialog"; import ActionDialog from "@saleor/components/ActionDialog";
import DeleteFilterTabDialog from "@saleor/components/DeleteFilterTabDialog";
import SaveFilterTabDialog, {
SaveFilterTabDialogFormData
} from "@saleor/components/SaveFilterTabDialog";
import useBulkActions from "@saleor/hooks/useBulkActions"; import useBulkActions from "@saleor/hooks/useBulkActions";
import useListSettings from "@saleor/hooks/useListSettings"; import useListSettings from "@saleor/hooks/useListSettings";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
@ -14,19 +18,29 @@ import usePaginator, {
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { getMutationState, maybe } from "@saleor/misc"; import { getMutationState, maybe } from "@saleor/misc";
import { ListViews } from "@saleor/types"; import { ListViews } from "@saleor/types";
import OrderDraftListPage from "../components/OrderDraftListPage"; import OrderDraftListPage from "../../components/OrderDraftListPage";
import { import {
TypedOrderDraftBulkCancelMutation, TypedOrderDraftBulkCancelMutation,
TypedOrderDraftCreateMutation TypedOrderDraftCreateMutation
} from "../mutations"; } from "../../mutations";
import { TypedOrderDraftListQuery } from "../queries"; import { TypedOrderDraftListQuery } from "../../queries";
import { OrderDraftBulkCancel } from "../types/OrderDraftBulkCancel"; import { OrderDraftBulkCancel } from "../../types/OrderDraftBulkCancel";
import { OrderDraftCreate } from "../types/OrderDraftCreate"; import { OrderDraftCreate } from "../../types/OrderDraftCreate";
import { import {
orderDraftListUrl, orderDraftListUrl,
OrderDraftListUrlDialog,
OrderDraftListUrlFilters,
OrderDraftListUrlQueryParams, OrderDraftListUrlQueryParams,
orderUrl orderUrl
} from "../urls"; } from "../../urls";
import {
areFiltersApplied,
deleteFilterTab,
getActiveFilters,
getFilterTabs,
getFilterVariables,
saveFilterTab
} from "./filter";
interface OrderDraftListProps { interface OrderDraftListProps {
params: OrderDraftListUrlQueryParams; params: OrderDraftListUrlQueryParams;
@ -46,6 +60,26 @@ export const OrderDraftList: React.StatelessComponent<OrderDraftListProps> = ({
); );
const intl = useIntl(); const intl = useIntl();
const tabs = getFilterTabs();
const currentTab =
params.activeTab === undefined
? areFiltersApplied(params)
? tabs.length + 1
: 0
: parseInt(params.activeTab, 0);
const changeFilterField = (filter: OrderDraftListUrlFilters) => {
reset();
navigate(
orderDraftListUrl({
...getActiveFilters(params),
...filter,
activeTab: undefined
})
);
};
const closeModal = () => const closeModal = () =>
navigate( navigate(
orderDraftListUrl({ orderDraftListUrl({
@ -64,12 +98,49 @@ export const OrderDraftList: React.StatelessComponent<OrderDraftListProps> = ({
navigate(orderUrl(data.draftOrderCreate.order.id)); navigate(orderUrl(data.draftOrderCreate.order.id));
}; };
const openModal = (action: OrderDraftListUrlDialog, ids?: string[]) =>
navigate(
orderDraftListUrl({
...params,
action,
ids
})
);
const handleTabChange = (tab: number) => {
reset();
navigate(
orderDraftListUrl({
activeTab: tab.toString(),
...getFilterTabs()[tab - 1].data
})
);
};
const handleTabDelete = () => {
deleteFilterTab(currentTab);
reset();
navigate(orderDraftListUrl());
};
const handleTabSave = (data: SaveFilterTabDialogFormData) => {
saveFilterTab(data.name, getActiveFilters(params));
handleTabChange(tabs.length + 1);
};
const paginationState = createPaginationState(settings.rowNumber, params); const paginationState = createPaginationState(settings.rowNumber, params);
const queryVariables = React.useMemo(
() => ({
...paginationState,
filter: getFilterVariables(params)
}),
[params]
);
return ( return (
<TypedOrderDraftCreateMutation onCompleted={handleCreateOrderCreateSuccess}> <TypedOrderDraftCreateMutation onCompleted={handleCreateOrderCreateSuccess}>
{createOrder => ( {createOrder => (
<TypedOrderDraftListQuery displayLoader variables={paginationState}> <TypedOrderDraftListQuery displayLoader variables={queryVariables}>
{({ data, loading, refetch }) => { {({ data, loading, refetch }) => {
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const { loadNextPage, loadPreviousPage, pageInfo } = paginate(
maybe(() => data.draftOrders.pageInfo), maybe(() => data.draftOrders.pageInfo),
@ -114,6 +185,14 @@ export const OrderDraftList: React.StatelessComponent<OrderDraftListProps> = ({
return ( return (
<> <>
<OrderDraftListPage <OrderDraftListPage
currentTab={currentTab}
initialSearch={params.query || ""}
onSearchChange={query => changeFilterField({ query })}
onAll={() => navigate(orderDraftListUrl())}
onTabChange={handleTabChange}
onTabDelete={() => openModal("delete-search")}
onTabSave={() => openModal("save-search")}
tabs={tabs.map(tab => tab.name)}
disabled={loading} disabled={loading}
settings={settings} settings={settings}
orders={maybe(() => orders={maybe(() =>
@ -174,6 +253,19 @@ export const OrderDraftList: React.StatelessComponent<OrderDraftListProps> = ({
/> />
</DialogContentText> </DialogContentText>
</ActionDialog> </ActionDialog>
<SaveFilterTabDialog
open={params.action === "save-search"}
confirmButtonState="default"
onClose={closeModal}
onSubmit={handleTabSave}
/>
<DeleteFilterTabDialog
open={params.action === "delete-search"}
confirmButtonState="default"
onClose={closeModal}
onSubmit={handleTabDelete}
tabName={maybe(() => tabs[currentTab - 1].name, "...")}
/>
</> </>
); );
}} }}

View file

@ -0,0 +1,31 @@
import { OrderDraftFilterInput } from "@saleor/types/globalTypes";
import {
createFilterTabUtils,
createFilterUtils
} from "../../../utils/filters";
import {
OrderDraftListUrlFilters,
OrderDraftListUrlFiltersEnum,
OrderDraftListUrlQueryParams
} from "../../urls";
export const ORDER_DRAFT_FILTERS_KEY = "orderDraftFilters";
export function getFilterVariables(
params: OrderDraftListUrlFilters
): OrderDraftFilterInput {
return {
search: params.query
};
}
export const {
deleteFilterTab,
getFilterTabs,
saveFilterTab
} = createFilterTabUtils<OrderDraftListUrlFilters>(ORDER_DRAFT_FILTERS_KEY);
export const { areFiltersApplied, getActiveFilters } = createFilterUtils<
OrderDraftListUrlQueryParams,
OrderDraftListUrlFilters
>(OrderDraftListUrlFiltersEnum);

View file

@ -0,0 +1,2 @@
export { default } from "./OrderDraftList";
export * from "./OrderDraftList";

View file

@ -452,6 +452,12 @@ export interface OrderAddNoteInput {
message?: string | null; message?: string | null;
} }
export interface OrderDraftFilterInput {
customer?: string | null;
created?: DateRangeInput | null;
search?: string | null;
}
export interface OrderFilterInput { export interface OrderFilterInput {
paymentStatus?: (PaymentChargeStatusEnum | null)[] | null; paymentStatus?: (PaymentChargeStatusEnum | null)[] | null;
status?: (OrderStatusFilter | null)[] | null; status?: (OrderStatusFilter | null)[] | null;