2019-06-19 14:40:52 +00:00
import Button from "@material-ui/core/Button" ;
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-11 14:00:02 +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" ;
2020-05-14 09:30:32 +00:00
import useShop from "@saleor/hooks/useShop" ;
2019-08-21 12:31:55 +00:00
import { commonMessages } 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-11 14:00:02 +00:00
import CollectionListPage from "../../components/CollectionListPage/CollectionListPage" ;
2019-06-19 14:40:52 +00:00
import {
2020-08-28 12:45:11 +00:00
useCollectionBulkDelete ,
useCollectionBulkPublish
2019-09-11 14:00:02 +00:00
} from "../../mutations" ;
2019-12-17 17:13:56 +00:00
import { useCollectionListQuery } from "../../queries" ;
2019-06-19 14:40:52 +00:00
import {
collectionAddUrl ,
collectionListUrl ,
2020-05-14 09:30:32 +00:00
CollectionListUrlDialog ,
2019-06-19 14:40:52 +00:00
CollectionListUrlQueryParams ,
2020-05-14 09:30:32 +00:00
collectionUrl
2019-09-11 14:00:02 +00:00
} from "../../urls" ;
import {
areFiltersApplied ,
deleteFilterTab ,
getActiveFilters ,
2020-05-14 09:30:32 +00:00
getFilterOpts ,
getFilterQueryParam ,
2019-09-11 14:00:02 +00:00
getFilterTabs ,
getFilterVariables ,
2020-05-14 09:30:32 +00:00
saveFilterTab
2020-01-10 12:45:56 +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 CollectionListProps {
params : CollectionListUrlQueryParams ;
}
2019-11-07 11:34:54 +00:00
export const CollectionList : React.FC < CollectionListProps > = ( { params } ) = > {
2019-06-19 14:40:52 +00:00
const navigate = useNavigator ( ) ;
const notify = useNotifier ( ) ;
const paginate = usePaginator ( ) ;
2020-01-07 13:34:45 +00:00
const shop = useShop ( ) ;
2019-06-19 14:40:52 +00:00
const { isSelected , listElements , reset , toggle , toggleAll } = useBulkActions (
params . ids
) ;
2019-08-09 11:14:35 +00:00
const { updateListSettings , settings } = useListSettings (
ListViews . COLLECTION_LIST
) ;
2019-08-21 12:31:55 +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 } = useCollectionListQuery ( {
displayLoader : true ,
variables : queryVariables
} ) ;
2020-08-28 12:45:11 +00:00
const [
collectionBulkDelete ,
collectionBulkDeleteOpts
] = useCollectionBulkDelete ( {
onCompleted : data = > {
if ( data . collectionBulkDelete . errors . length === 0 ) {
notify ( {
status : "success" ,
text : intl.formatMessage ( commonMessages . savedChanges )
} ) ;
refetch ( ) ;
reset ( ) ;
closeModal ( ) ;
}
}
} ) ;
const [
collectionBulkPublish ,
collectionBulkPublishOpts
] = useCollectionBulkPublish ( {
onCompleted : data = > {
if ( data . collectionBulkPublish . errors . length === 0 ) {
notify ( {
status : "success" ,
text : intl.formatMessage ( commonMessages . savedChanges )
} ) ;
refetch ( ) ;
reset ( ) ;
closeModal ( ) ;
}
}
} ) ;
2019-09-11 14:00:02 +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 : collectionListUrl ,
getFilterQueryParam ,
navigate ,
params
} ) ;
2020-01-07 13:34:45 +00:00
2019-12-06 14:58:28 +00:00
const [ openModal , closeModal ] = createDialogActionHandlers <
CollectionListUrlDialog ,
CollectionListUrlQueryParams
> ( navigate , collectionListUrl , params ) ;
2019-06-19 14:40:52 +00:00
2019-09-11 14:00:02 +00:00
const handleTabChange = ( tab : number ) = > {
reset ( ) ;
navigate (
collectionListUrl ( {
activeTab : tab.toString ( ) ,
. . . getFilterTabs ( ) [ tab - 1 ] . data
} )
) ;
} ;
const handleTabDelete = ( ) = > {
deleteFilterTab ( currentTab ) ;
reset ( ) ;
navigate ( collectionListUrl ( ) ) ;
} ;
const handleTabSave = ( data : SaveFilterTabDialogFormData ) = > {
saveFilterTab ( data . name , getActiveFilters ( params ) ) ;
handleTabChange ( tabs . length + 1 ) ;
} ;
2019-12-17 17:13:56 +00:00
const { loadNextPage , loadPreviousPage , pageInfo } = paginate (
maybe ( ( ) = > data . collections . pageInfo ) ,
paginationState ,
params
2019-09-11 14:00:02 +00:00
) ;
2019-12-17 17:13:56 +00:00
const handleSort = createSortHandler ( navigate , collectionListUrl , params ) ;
2020-01-07 13:34:45 +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 (
2020-08-28 12:45:11 +00:00
< >
< CollectionListPage
currencySymbol = { currencySymbol }
currentTab = { currentTab }
filterOpts = { getFilterOpts ( params ) }
initialSearch = { params . query || "" }
onSearchChange = { handleSearchChange }
onFilterChange = { changeFilters }
onAdd = { ( ) = > navigate ( collectionAddUrl ) }
onAll = { resetFilters }
onTabChange = { handleTabChange }
onTabDelete = { ( ) = > openModal ( "delete-search" ) }
onTabSave = { ( ) = > openModal ( "save-search" ) }
tabs = { tabs . map ( tab = > tab . name ) }
disabled = { loading }
collections = { maybe ( ( ) = > data . collections . edges . map ( edge = > edge . node ) ) }
settings = { settings }
onNextPage = { loadNextPage }
onPreviousPage = { loadPreviousPage }
onSort = { handleSort }
onUpdateListSettings = { updateListSettings }
pageInfo = { pageInfo }
sort = { getSortParams ( params ) }
onRowClick = { id = > ( ) = > navigate ( collectionUrl ( id ) ) }
toolbar = {
< >
< Button
color = "primary"
onClick = { ( ) = >
openModal ( "unpublish" , {
ids : listElements
} )
}
>
< FormattedMessage
defaultMessage = "Unpublish"
description = "unpublish collections"
2019-12-17 17:13:56 +00:00
/ >
2020-08-28 12:45:11 +00:00
< / Button >
< Button
color = "primary"
onClick = { ( ) = >
openModal ( "publish" , {
ids : listElements
} )
}
>
< FormattedMessage
defaultMessage = "Publish"
description = "publish collections"
2019-12-17 17:13:56 +00:00
/ >
2020-08-28 12:45:11 +00:00
< / Button >
< IconButton
color = "primary"
onClick = { ( ) = >
openModal ( "remove" , {
ids : listElements
} )
}
>
< DeleteIcon / >
< / IconButton >
< / >
}
isChecked = { isSelected }
selected = { listElements . length }
toggle = { toggle }
toggleAll = { toggleAll }
/ >
< ActionDialog
open = { params . action === "publish" && maybe ( ( ) = > params . ids . length > 0 ) }
onClose = { closeModal }
confirmButtonState = { collectionBulkPublishOpts . status }
onConfirm = { ( ) = >
collectionBulkPublish ( {
variables : {
ids : params.ids ,
isPublished : true
}
} )
}
variant = "default"
title = { intl . formatMessage ( {
defaultMessage : "Publish collections" ,
description : "dialog title"
} ) }
>
< DialogContentText >
< FormattedMessage
defaultMessage = "{counter,plural,one{Are you sure you want to publish this collection?} other{Are you sure you want to publish {displayQuantity} collections?}}"
values = { {
counter : maybe ( ( ) = > params . ids . length ) ,
displayQuantity : < strong > { maybe ( ( ) = > params . ids . length ) } < / strong >
} }
/ >
< / DialogContentText >
< / ActionDialog >
< ActionDialog
open = {
params . action === "unpublish" && maybe ( ( ) = > params . ids . length > 0 )
}
onClose = { closeModal }
confirmButtonState = { collectionBulkPublishOpts . status }
onConfirm = { ( ) = >
collectionBulkPublish ( {
variables : {
ids : params.ids ,
isPublished : false
}
} )
}
variant = "default"
title = { intl . formatMessage ( {
defaultMessage : "Unpublish collections" ,
description : "dialog title"
} ) }
>
< DialogContentText >
< FormattedMessage
defaultMessage = "{counter,plural,one{Are you sure you want to unpublish this collection?} other{Are you sure you want to unpublish {displayQuantity} collections?}}"
values = { {
counter : maybe ( ( ) = > params . ids . length ) ,
displayQuantity : < strong > { maybe ( ( ) = > params . ids . length ) } < / strong >
} }
/ >
< / DialogContentText >
< / ActionDialog >
< ActionDialog
open = { params . action === "remove" && maybe ( ( ) = > params . ids . length > 0 ) }
onClose = { closeModal }
confirmButtonState = { collectionBulkDeleteOpts . status }
onConfirm = { ( ) = >
collectionBulkDelete ( {
variables : {
ids : params.ids
}
} )
}
variant = "delete"
title = { intl . formatMessage ( {
defaultMessage : "Delete collections" ,
description : "dialog title"
} ) }
>
< DialogContentText >
< FormattedMessage
defaultMessage = "{counter,plural,one{Are you sure you want to delete this collection?} other{Are you sure you want to delete {displayQuantity} collections?}}"
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-06-19 14:40:52 +00:00
) ;
} ;
export default CollectionList ;