2019-06-19 14:40:52 +00:00
import DialogContentText from "@material-ui/core/DialogContentText" ;
import IconButton from "@material-ui/core/IconButton" ;
import DeleteIcon from "@material-ui/icons/Delete" ;
2019-08-09 10:26:22 +00:00
import React from "react" ;
2019-08-26 17:44:42 +00:00
import { FormattedMessage , useIntl } from "react-intl" ;
2019-06-19 14:40:52 +00:00
import ActionDialog from "@saleor/components/ActionDialog" ;
2019-09-11 14:28:42 +00:00
import DeleteFilterTabDialog from "@saleor/components/DeleteFilterTabDialog" ;
import SaveFilterTabDialog , {
SaveFilterTabDialogFormData
} from "@saleor/components/SaveFilterTabDialog" ;
2019-06-19 14:40:52 +00:00
import useBulkActions from "@saleor/hooks/useBulkActions" ;
2019-08-09 11:14:35 +00:00
import useListSettings from "@saleor/hooks/useListSettings" ;
2019-06-19 14:40:52 +00:00
import useNavigator from "@saleor/hooks/useNavigator" ;
import useNotifier from "@saleor/hooks/useNotifier" ;
import usePaginator , {
createPaginationState
} from "@saleor/hooks/usePaginator" ;
2019-12-06 17:11:46 +00:00
import { maybe } from "@saleor/misc" ;
2019-08-09 11:14:35 +00:00
import { ListViews } from "@saleor/types" ;
2019-12-17 17:13:56 +00:00
import createSortHandler from "@saleor/utils/handlers/sortHandler" ;
import { getSortParams } from "@saleor/utils/sort" ;
2019-12-06 14:58:28 +00:00
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers" ;
2020-01-02 16:55:34 +00:00
import useShop from "@saleor/hooks/useShop" ;
2020-01-09 13:45:22 +00:00
import createFilterHandlers from "@saleor/utils/handlers/filterHandlers" ;
2019-09-11 14:28:42 +00:00
import OrderDraftListPage from "../../components/OrderDraftListPage" ;
2019-06-19 14:40:52 +00:00
import {
TypedOrderDraftBulkCancelMutation ,
2019-11-22 15:52:19 +00:00
useOrderDraftCreateMutation
2019-09-11 14:28:42 +00:00
} from "../../mutations" ;
2019-12-17 17:13:56 +00:00
import { useOrderDraftListQuery } from "../../queries" ;
2019-09-11 14:28:42 +00:00
import { OrderDraftBulkCancel } from "../../types/OrderDraftBulkCancel" ;
import { OrderDraftCreate } from "../../types/OrderDraftCreate" ;
2019-06-19 14:40:52 +00:00
import {
orderDraftListUrl ,
OrderDraftListUrlQueryParams ,
2019-12-06 14:58:28 +00:00
orderUrl ,
OrderDraftListUrlDialog
2019-09-11 14:28:42 +00:00
} from "../../urls" ;
import {
areFiltersApplied ,
deleteFilterTab ,
getActiveFilters ,
getFilterTabs ,
getFilterVariables ,
2020-01-02 16:55:34 +00:00
saveFilterTab ,
getFilterQueryParam ,
getFilterOpts
2020-01-10 13:20:03 +00:00
} from "./filters" ;
2019-12-17 17:13:56 +00:00
import { getSortQueryVariables } from "./sort" ;
2019-06-19 14:40:52 +00:00
interface OrderDraftListProps {
params : OrderDraftListUrlQueryParams ;
}
2019-11-07 11:34:54 +00:00
export const OrderDraftList : React.FC < OrderDraftListProps > = ( { params } ) = > {
2019-06-19 14:40:52 +00:00
const navigate = useNavigator ( ) ;
const notify = useNotifier ( ) ;
const paginate = usePaginator ( ) ;
const { isSelected , listElements , reset , toggle , toggleAll } = useBulkActions (
params . ids
) ;
2019-08-09 11:14:35 +00:00
const { updateListSettings , settings } = useListSettings (
ListViews . DRAFT_LIST
) ;
2019-08-26 17:44:42 +00:00
const intl = useIntl ( ) ;
2020-01-02 16:55:34 +00:00
const shop = useShop ( ) ;
2019-06-19 14:40:52 +00:00
2019-11-22 15:52:19 +00:00
const handleCreateOrderCreateSuccess = ( data : OrderDraftCreate ) = > {
notify ( {
text : intl.formatMessage ( {
defaultMessage : "Order draft succesfully created"
} )
} ) ;
navigate ( orderUrl ( data . draftOrderCreate . order . id ) ) ;
} ;
const [ createOrder ] = useOrderDraftCreateMutation ( {
onCompleted : handleCreateOrderCreateSuccess
} ) ;
2019-09-11 14:28:42 +00:00
const tabs = getFilterTabs ( ) ;
const currentTab =
params . activeTab === undefined
? areFiltersApplied ( params )
? tabs . length + 1
: 0
: parseInt ( params . activeTab , 0 ) ;
2020-01-09 13:45:22 +00:00
const [
changeFilters ,
resetFilters ,
handleSearchChange
] = createFilterHandlers ( {
cleanupFn : reset ,
createUrl : orderDraftListUrl ,
getFilterQueryParam ,
navigate ,
params
} ) ;
2020-01-02 16:55:34 +00:00
2019-12-06 14:58:28 +00:00
const [ openModal , closeModal ] = createDialogActionHandlers <
OrderDraftListUrlDialog ,
OrderDraftListUrlQueryParams
> ( navigate , orderDraftListUrl , params ) ;
2019-09-11 14:28:42 +00:00
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 ) ;
} ;
2019-08-09 11:14:35 +00:00
const paginationState = createPaginationState ( settings . rowNumber , params ) ;
2019-09-11 14:28:42 +00:00
const queryVariables = React . useMemo (
( ) = > ( {
. . . paginationState ,
2019-12-17 17:13:56 +00:00
filter : getFilterVariables ( params ) ,
sort : getSortQueryVariables ( params )
2019-09-11 14:28:42 +00:00
} ) ,
[ params ]
) ;
2019-12-17 17:13:56 +00:00
const { data , loading , refetch } = useOrderDraftListQuery ( {
displayLoader : true ,
variables : queryVariables
} ) ;
2019-06-19 14:40:52 +00:00
2019-12-17 17:13:56 +00:00
const { loadNextPage , loadPreviousPage , pageInfo } = paginate (
maybe ( ( ) = > data . draftOrders . pageInfo ) ,
paginationState ,
params
) ;
2019-06-19 14:40:52 +00:00
2019-12-17 17:13:56 +00:00
const handleOrderDraftBulkCancel = ( data : OrderDraftBulkCancel ) = > {
if ( data . draftOrderBulkDelete . errors . length === 0 ) {
notify ( {
text : intl.formatMessage ( {
defaultMessage : "Deleted draft orders"
} )
} ) ;
refetch ( ) ;
reset ( ) ;
closeModal ( ) ;
}
} ;
const handleSort = createSortHandler ( navigate , orderDraftListUrl , params ) ;
2020-01-02 16:55:34 +00:00
const currencySymbol = maybe ( ( ) = > shop . defaultCurrency , "USD" ) ;
2019-12-17 17:13:56 +00:00
return (
< TypedOrderDraftBulkCancelMutation onCompleted = { handleOrderDraftBulkCancel } >
{ ( orderDraftBulkDelete , orderDraftBulkDeleteOpts ) = > {
const onOrderDraftBulkDelete = ( ) = >
orderDraftBulkDelete ( {
variables : {
ids : params.ids
}
} ) ;
2019-06-19 14:40:52 +00:00
2019-11-22 15:52:19 +00:00
return (
2019-12-17 17:13:56 +00:00
< >
< OrderDraftListPage
2020-01-02 16:55:34 +00:00
currencySymbol = { currencySymbol }
2019-12-17 17:13:56 +00:00
currentTab = { currentTab }
2020-01-02 16:55:34 +00:00
filterOpts = { getFilterOpts ( params ) }
2019-12-17 17:13:56 +00:00
initialSearch = { params . query || "" }
2020-01-02 16:55:34 +00:00
onSearchChange = { handleSearchChange }
onFilterChange = { changeFilters }
2020-01-03 09:16:37 +00:00
onAll = { resetFilters }
2019-12-17 17:13:56 +00:00
onTabChange = { handleTabChange }
onTabDelete = { ( ) = > openModal ( "delete-search" ) }
onTabSave = { ( ) = > openModal ( "save-search" ) }
tabs = { tabs . map ( tab = > tab . name ) }
disabled = { loading }
settings = { settings }
orders = { maybe ( ( ) = >
data . draftOrders . edges . map ( edge = > edge . node )
) }
pageInfo = { pageInfo }
onAdd = { createOrder }
onNextPage = { loadNextPage }
onPreviousPage = { loadPreviousPage }
onRowClick = { id = > ( ) = > navigate ( orderUrl ( id ) ) }
onSort = { handleSort }
onUpdateListSettings = { updateListSettings }
isChecked = { isSelected }
selected = { listElements . length }
sort = { getSortParams ( params ) }
toggle = { toggle }
toggleAll = { toggleAll }
toolbar = {
< IconButton
color = "primary"
onClick = { ( ) = >
2019-12-06 14:58:28 +00:00
openModal ( "remove" , {
ids : listElements
} )
2019-11-22 15:52:19 +00:00
}
2019-12-17 17:13:56 +00:00
>
< DeleteIcon / >
< / IconButton >
}
/ >
< ActionDialog
confirmButtonState = { orderDraftBulkDeleteOpts . status }
onClose = { closeModal }
onConfirm = { onOrderDraftBulkDelete }
open = { params . action === "remove" }
title = { intl . formatMessage ( {
defaultMessage : "Delete Order Drafts" ,
description : "dialog header"
} ) }
variant = "delete"
>
< DialogContentText >
< FormattedMessage
2020-02-13 11:14:16 +00:00
defaultMessage = "{counter,plural,one{Are you sure you want to delete this order draft?} other{Are you sure you want to delete {displayQuantity} order drafts?}}"
2019-12-17 17:13:56 +00:00
description = "dialog content"
values = { {
counter : maybe ( ( ) = > params . ids . length ) ,
displayQuantity : (
< strong > { maybe ( ( ) = > params . ids . length ) } < / strong >
)
} }
/ >
< / DialogContentText >
< / 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 , "..." ) }
/ >
< / >
2019-11-22 15:52:19 +00:00
) ;
} }
2019-12-17 17:13:56 +00:00
< / TypedOrderDraftBulkCancelMutation >
2019-06-19 14:40:52 +00:00
) ;
} ;
export default OrderDraftList ;