import { DialogContentText, IconButton } from "@material-ui/core"; import DeleteIcon from "@material-ui/icons/Delete"; import ActionDialog from "@saleor/components/ActionDialog"; import useAppChannel from "@saleor/components/AppLayout/AppChannelContext"; import DeleteFilterTabDialog from "@saleor/components/DeleteFilterTabDialog"; import SaveFilterTabDialog, { SaveFilterTabDialogFormData } from "@saleor/components/SaveFilterTabDialog"; import { WindowTitle } from "@saleor/components/WindowTitle"; import useBulkActions from "@saleor/hooks/useBulkActions"; import useListSettings from "@saleor/hooks/useListSettings"; import useNavigator from "@saleor/hooks/useNavigator"; import useNotifier from "@saleor/hooks/useNotifier"; import usePaginator, { createPaginationState } from "@saleor/hooks/usePaginator"; import { commonMessages, sectionNames } from "@saleor/intl"; import { maybe } from "@saleor/misc"; import { ListViews } from "@saleor/types"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import createFilterHandlers from "@saleor/utils/handlers/filterHandlers"; import createSortHandler from "@saleor/utils/handlers/sortHandler"; import { mapEdgesToItems, mapNodeToChoice } from "@saleor/utils/maps"; import { getSortParams } from "@saleor/utils/sort"; import React, { useEffect } from "react"; import { FormattedMessage, useIntl } from "react-intl"; import VoucherListPage from "../../components/VoucherListPage"; import { TypedVoucherBulkDelete } from "../../mutations"; import { useVoucherListQuery } from "../../queries"; import { VoucherBulkDelete } from "../../types/VoucherBulkDelete"; import { voucherAddUrl, voucherListUrl, VoucherListUrlDialog, VoucherListUrlQueryParams, voucherUrl } from "../../urls"; import { areFiltersApplied, deleteFilterTab, getActiveFilters, getFilterOpts, getFilterQueryParam, getFilterTabs, getFilterVariables, saveFilterTab } from "./filters"; import { canBeSorted, DEFAULT_SORT_KEY, getSortQueryVariables } from "./sort"; interface VoucherListProps { params: VoucherListUrlQueryParams; } export const VoucherList: React.FC = ({ params }) => { const navigate = useNavigator(); const notify = useNotifier(); const paginate = usePaginator(); const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( params.ids ); const { updateListSettings, settings } = useListSettings( ListViews.VOUCHER_LIST ); const intl = useIntl(); const { availableChannels } = useAppChannel(false); const selectedChannel = availableChannels.find( channel => channel.slug === params.channel ); const channelOpts = availableChannels ? mapNodeToChoice(availableChannels, channel => channel.slug) : null; const [openModal, closeModal] = createDialogActionHandlers< VoucherListUrlDialog, VoucherListUrlQueryParams >(navigate, voucherListUrl, params); const paginationState = createPaginationState(settings.rowNumber, params); const queryVariables = React.useMemo( () => ({ ...paginationState, filter: getFilterVariables(params), sort: getSortQueryVariables(params), channel: params.channel }), [params] ); const { data, loading, refetch } = useVoucherListQuery({ displayLoader: true, variables: queryVariables }); const tabs = getFilterTabs(); const currentTab = params.activeTab === undefined ? areFiltersApplied(params) ? tabs.length + 1 : 0 : parseInt(params.activeTab, 0); const [ changeFilters, resetFilters, handleSearchChange ] = createFilterHandlers({ cleanupFn: reset, createUrl: voucherListUrl, getFilterQueryParam, navigate, params }); useEffect(() => { if (!canBeSorted(params.sort, !!selectedChannel)) { navigate( voucherListUrl({ ...params, sort: DEFAULT_SORT_KEY }) ); } }, [params]); 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); }; const canOpenBulkActionDialog = maybe(() => params.ids.length > 0); const { loadNextPage, loadPreviousPage, pageInfo } = paginate( data?.vouchers?.pageInfo, paginationState, params ); const handleVoucherBulkDelete = (data: VoucherBulkDelete) => { if (data.voucherBulkDelete.errors.length === 0) { notify({ status: "success", text: intl.formatMessage(commonMessages.savedChanges) }); reset(); closeModal(); refetch(); } }; const handleSort = createSortHandler(navigate, voucherListUrl, params); return ( {(voucherBulkDelete, voucherBulkDeleteOpts) => { const onVoucherBulkDelete = () => voucherBulkDelete({ variables: { ids: params.ids } }); return ( <> changeFilters(filter)} onAll={resetFilters} onTabChange={handleTabChange} onTabDelete={() => openModal("delete-search")} onTabSave={() => openModal("save-search")} tabs={tabs.map(tab => tab.name)} settings={settings} vouchers={mapEdgesToItems(data?.vouchers)} 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={ openModal("remove", { ids: listElements }) } > } selectedChannelId={selectedChannel?.id} /> {canOpenBulkActionDialog && ( {params.ids.length} }} /> )} tabs[currentTab - 1].name, "...")} /> ); }} ); }; export default VoucherList;