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" ;
import ActionDialog from "@saleor/components/ActionDialog" ;
2019-09-12 10:06:28 +00:00
import DeleteFilterTabDialog from "@saleor/components/DeleteFilterTabDialog" ;
import SaveFilterTabDialog , {
SaveFilterTabDialogFormData
} from "@saleor/components/SaveFilterTabDialog" ;
2019-06-19 14:40:52 +00:00
import { WindowTitle } from "@saleor/components/WindowTitle" ;
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" ;
import useShop from "@saleor/hooks/useShop" ;
2019-08-26 13:59:32 +00:00
import { commonMessages , sectionNames } from "@saleor/intl" ;
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-06 14:58:28 +00:00
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers" ;
2020-01-09 13:45:22 +00:00
import createFilterHandlers from "@saleor/utils/handlers/filterHandlers" ;
2020-05-14 09:30:32 +00:00
import createSortHandler from "@saleor/utils/handlers/sortHandler" ;
import { getSortParams } from "@saleor/utils/sort" ;
import React from "react" ;
import { FormattedMessage , useIntl } from "react-intl" ;
2019-09-12 10:06:28 +00:00
import VoucherListPage from "../../components/VoucherListPage" ;
import { TypedVoucherBulkDelete } from "../../mutations" ;
2019-12-17 17:13:56 +00:00
import { useVoucherListQuery } from "../../queries" ;
2019-09-12 10:06:28 +00:00
import { VoucherBulkDelete } from "../../types/VoucherBulkDelete" ;
2019-06-19 14:40:52 +00:00
import {
voucherAddUrl ,
voucherListUrl ,
2020-05-14 09:30:32 +00:00
VoucherListUrlDialog ,
2019-06-19 14:40:52 +00:00
VoucherListUrlQueryParams ,
2020-05-14 09:30:32 +00:00
voucherUrl
2019-09-12 10:06:28 +00:00
} from "../../urls" ;
import {
areFiltersApplied ,
deleteFilterTab ,
getActiveFilters ,
2020-05-14 09:30:32 +00:00
getFilterOpts ,
getFilterQueryParam ,
2019-09-12 10:06:28 +00:00
getFilterTabs ,
getFilterVariables ,
2020-05-14 09:30:32 +00:00
saveFilterTab
2020-01-10 13:01:26 +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 VoucherListProps {
params : VoucherListUrlQueryParams ;
}
2019-11-07 11:34:54 +00:00
export const VoucherList : React.FC < VoucherListProps > = ( { params } ) = > {
2019-06-19 14:40:52 +00:00
const navigate = useNavigator ( ) ;
const notify = useNotifier ( ) ;
const paginate = usePaginator ( ) ;
const shop = useShop ( ) ;
const { isSelected , listElements , reset , toggle , toggleAll } = useBulkActions (
params . ids
) ;
2019-08-09 11:14:35 +00:00
const { updateListSettings , settings } = useListSettings (
ListViews . VOUCHER_LIST
) ;
2019-08-26 13:59:32 +00:00
const intl = useIntl ( ) ;
2019-06-19 14:40:52 +00:00
2019-12-17 17:13:56 +00:00
const paginationState = createPaginationState ( settings . rowNumber , params ) ;
const queryVariables = React . useMemo (
( ) = > ( {
. . . paginationState ,
filter : getFilterVariables ( params ) ,
sort : getSortQueryVariables ( params )
} ) ,
[ params ]
) ;
const { data , loading , refetch } = useVoucherListQuery ( {
displayLoader : true ,
variables : queryVariables
} ) ;
2019-09-12 10:06:28 +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 : voucherListUrl ,
getFilterQueryParam ,
navigate ,
params
} ) ;
2020-01-03 15:17:51 +00:00
2019-12-06 14:58:28 +00:00
const [ openModal , closeModal ] = createDialogActionHandlers <
VoucherListUrlDialog ,
VoucherListUrlQueryParams
> ( navigate , voucherListUrl , params ) ;
2019-09-12 10:06:28 +00:00
const handleTabChange = ( tab : number ) = > {
reset ( ) ;
navigate (
voucherListUrl ( {
activeTab : tab.toString ( ) ,
. . . getFilterTabs ( ) [ tab - 1 ] . data
} )
) ;
} ;
const handleTabDelete = ( ) = > {
deleteFilterTab ( currentTab ) ;
reset ( ) ;
navigate ( voucherListUrl ( ) ) ;
} ;
const handleTabSave = ( data : SaveFilterTabDialogFormData ) = > {
saveFilterTab ( data . name , getActiveFilters ( params ) ) ;
handleTabChange ( tabs . length + 1 ) ;
} ;
2019-06-19 14:40:52 +00:00
2019-12-17 17:13:56 +00:00
const canOpenBulkActionDialog = maybe ( ( ) = > params . ids . length > 0 ) ;
const { loadNextPage , loadPreviousPage , pageInfo } = paginate (
maybe ( ( ) = > data . vouchers . pageInfo ) ,
paginationState ,
params
2019-09-12 10:06:28 +00:00
) ;
2019-12-17 17:13:56 +00:00
const handleVoucherBulkDelete = ( data : VoucherBulkDelete ) = > {
if ( data . voucherBulkDelete . errors . length === 0 ) {
notify ( {
2020-07-01 09:39:36 +00:00
status : "success" ,
2019-12-17 17:13:56 +00:00
text : intl.formatMessage ( commonMessages . savedChanges )
} ) ;
reset ( ) ;
closeModal ( ) ;
refetch ( ) ;
}
} ;
2019-06-19 14:40:52 +00:00
2019-12-17 17:13:56 +00:00
const handleSort = createSortHandler ( navigate , voucherListUrl , params ) ;
2020-01-03 15:17:51 +00:00
const currencySymbol = maybe ( ( ) = > shop . defaultCurrency , "USD" ) ;
2019-06-19 14:40:52 +00:00
2019-12-17 17:13:56 +00:00
return (
< TypedVoucherBulkDelete onCompleted = { handleVoucherBulkDelete } >
{ ( voucherBulkDelete , voucherBulkDeleteOpts ) = > {
const onVoucherBulkDelete = ( ) = >
voucherBulkDelete ( {
variables : {
ids : params.ids
}
} ) ;
2019-06-19 14:40:52 +00:00
return (
2019-12-17 17:13:56 +00:00
< >
< WindowTitle title = { intl . formatMessage ( sectionNames . vouchers ) } / >
< VoucherListPage
2020-01-03 15:17:51 +00:00
currencySymbol = { currencySymbol }
2019-12-17 17:13:56 +00:00
currentTab = { currentTab }
2020-01-03 15:17:51 +00:00
filterOpts = { getFilterOpts ( params ) }
2019-12-17 17:13:56 +00:00
initialSearch = { params . query || "" }
2020-01-03 15:17:51 +00:00
onSearchChange = { handleSearchChange }
onFilterChange = { filter = > changeFilters ( filter ) }
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 ) }
defaultCurrency = { maybe ( ( ) = > shop . defaultCurrency ) }
settings = { settings }
vouchers = { maybe ( ( ) = > data . vouchers . edges . map ( edge = > edge . node ) ) }
disabled = { loading }
pageInfo = { pageInfo }
onAdd = { ( ) = > navigate ( voucherAddUrl ) }
onNextPage = { loadNextPage }
onPreviousPage = { loadPreviousPage }
onUpdateListSettings = { updateListSettings }
onRowClick = { id = > ( ) = > navigate ( voucherUrl ( id ) ) }
onSort = { handleSort }
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-06-19 14:40:52 +00:00
}
2019-12-17 17:13:56 +00:00
>
< DeleteIcon / >
< / IconButton >
}
/ >
< ActionDialog
confirmButtonState = { voucherBulkDeleteOpts . status }
onClose = { closeModal }
onConfirm = { onVoucherBulkDelete }
open = { params . action === "remove" && canOpenBulkActionDialog }
title = { intl . formatMessage ( {
defaultMessage : "Delete Vouchers" ,
description : "dialog header"
} ) }
variant = "delete"
>
{ canOpenBulkActionDialog && (
< DialogContentText >
< FormattedMessage
2020-02-13 11:14:16 +00:00
defaultMessage = "{counter,plural,one{Are you sure you want to delete this voucher?} other{Are you sure you want to delete {displayQuantity} vouchers?}}"
2019-12-17 17:13:56 +00:00
description = "dialog content"
values = { {
counter : params.ids.length ,
displayQuantity : < strong > { params . ids . length } < / strong >
} }
2019-09-12 10:06:28 +00:00
/ >
2019-12-17 17:13:56 +00:00
< / 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-06-19 14:40:52 +00:00
) ;
} }
2019-12-17 17:13:56 +00:00
< / TypedVoucherBulkDelete >
2019-06-19 14:40:52 +00:00
) ;
} ;
export default VoucherList ;