Enhancements to pagination navigation (#2063)

* Update macaw to include Paginator changes

* Add link support to TablePagination component

* Rewrite usePaginator to use context and links instead of onClick

* Refactor ProductList to use new usePaginator hook

* Add decorator for PaginatorContext in ProductList stories

* Refactor AppList to use new usePaginator hook

* Refactor AttributeList to use new usePaginator hook

* Add missing pagination props for local pagination to AttributeValues

* Refactor CategoryList to use new usePaginator hook

* Refactor CategoryDetails to use useLocalPaginator and context

* Refactor CollectionList to use new usePaginator hook

* Refactor CollectionProducts to use new usePaginator hook

* Refactor CustomerList to use new usePaginator hook

* Refactor VoucherDetailsPage to use PaginationContext

* Refactor SaleDetails to use PaginatorContext

* Refactor SaleList to use new usePaginator hook

* Refactor VoucherList to use new usePaginator hook

* Fix type error in paginatorContextValues fixture

* Refactor GitfCardList to use new usePaginator hook

* Remove unused imports

* Refactor MenuList to use new usePaginator hook

* Refactor OrderDraftList to use new usePaginator hook

* Refactor OrderListPage to use new usePaginator hook

* Refactor PageList to use new usePaginator hook

* Refactor PageTypeList to use new usePaginator hook

* Refactor PermissionGroupList to use new usePaginator hook

* Refactor PluginsList to use new usePaginator hook

* Refactor ProductTypeList to use new usePaginator hook

* Refactor ShippingMethodProducts to use PaginationContext

* Refactor ShippingZonesList to use new usePaginator hook

* Refactor StaffList to use new usePaginator hook

* Fix TS errors

* Update TranslationEntities and TranslationFields to use new usePaginator

* Refactor WarehouseList to use new usePaginator hook

* Fix errors in stories that didn't use PaginationContextDecorator

* Mention changes in changelog

* Update to latest macaw version, update snapshots
This commit is contained in:
Jonatan Witoszek 2022-05-31 14:53:16 +02:00 committed by GitHub
parent 47ec01dd7c
commit 1a19289e43
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
110 changed files with 9146 additions and 5793 deletions

View file

@ -6,6 +6,8 @@ All notable, unreleased changes to this project will be documented in this file.
- Added links instead of imperative navigation with onClick - #1969 by @taniotanio7 - Added links instead of imperative navigation with onClick - #1969 by @taniotanio7
- Fixed clearing attribute values - #2047 by @witoszekdev - Fixed clearing attribute values - #2047 by @witoszekdev
- Fixed EditorJS integration in RichTextEditor input - #2052 by @witoszekdev - Fixed EditorJS integration in RichTextEditor input - #2052 by @witoszekdev
- Added links to table pagination buttons - #2063 by @witoszekdev
- Using push instead of replace to history stack for pagination navigation - #2063 by @witoszekdev
## 3.1 ## 3.1
### PREVIEW FEATURES ### PREVIEW FEATURES

52
package-lock.json generated
View file

@ -2263,6 +2263,38 @@
} }
} }
}, },
"@floating-ui/core": {
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.2.tgz",
"integrity": "sha512-FRVAkSNU/vGXLIsgbggcs70GkXKEOXgBBbNpYPNHSaKsCAMMd00NrjbtKTesxkdv9xm9N3+XiDlcFGY6WnatBg=="
},
"@floating-ui/dom": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.2.tgz",
"integrity": "sha512-z1DnEa7F3d8Fm/eXSbii8UEGpcjZGkQaYYUI0WpEVgD3vBfebDW8j/3ysusxonuMexoigA+A3b/fYH7sEqiwyg==",
"requires": {
"@floating-ui/core": "^0.7.2"
}
},
"@floating-ui/react-dom": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.1.tgz",
"integrity": "sha512-Dd7e8AupUjzcjeGf1g3EItf/QRtEWKF5GGyEs5WA5n3zlHvEgZ4XrZM6ANhUnzgE3pUQAaXkcXLnibgFp1YBRw==",
"requires": {
"@floating-ui/dom": "^0.5.1",
"use-isomorphic-layout-effect": "^1.1.1"
}
},
"@floating-ui/react-dom-interactions": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/@floating-ui/react-dom-interactions/-/react-dom-interactions-0.5.0.tgz",
"integrity": "sha512-rfON7mkHjCeogd0BSXPa8GBp1TMxEytJQqGVlCouSUonJ4POqdHsqcxRnCh0yAaGVaL/nB/J1vq28V4RdoLszg==",
"requires": {
"@floating-ui/react-dom": "^0.7.0",
"aria-hidden": "^1.1.3",
"use-isomorphic-layout-effect": "^1.1.1"
}
},
"@formatjs/cli": { "@formatjs/cli": {
"version": "4.8.3", "version": "4.8.3",
"resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-4.8.3.tgz", "resolved": "https://registry.npmjs.org/@formatjs/cli/-/cli-4.8.3.tgz",
@ -5277,10 +5309,11 @@
} }
}, },
"@saleor/macaw-ui": { "@saleor/macaw-ui": {
"version": "0.5.2", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/@saleor/macaw-ui/-/macaw-ui-0.5.2.tgz", "resolved": "https://registry.npmjs.org/@saleor/macaw-ui/-/macaw-ui-0.6.1.tgz",
"integrity": "sha512-fAbIGLnMo9BiVuR6W6MMZUprIutS+f4i1oEG8PX7+WM4rMZbvD204wxvHyx5dXSrU1DhLzDR4MK7dEGK/jykHA==", "integrity": "sha512-C7WPbuQQTtDH3MVKg//74rSxUheav7TKubw8VytZsUEBWFSVpuzV8Hw+T6riKYJWOtTfYPNUkJlGi1B257hoQQ==",
"requires": { "requires": {
"@floating-ui/react-dom-interactions": "^0.5.0",
"clsx": "^1.1.1", "clsx": "^1.1.1",
"downshift": "^6.1.7", "downshift": "^6.1.7",
"lodash": "^4.17.21", "lodash": "^4.17.21",
@ -8194,6 +8227,14 @@
"integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=",
"dev": true "dev": true
}, },
"aria-hidden": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.1.3.tgz",
"integrity": "sha512-RhVWFtKH5BiGMycI72q2RAFMLQi8JP9bLuQXgR5a8Znp7P5KOIADSJeyfI8PCVxLEp067B2HbP5JIiI/PXIZeA==",
"requires": {
"tslib": "^1.0.0"
}
},
"arr-diff": { "arr-diff": {
"version": "4.0.0", "version": "4.0.0",
"resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
@ -30914,6 +30955,11 @@
"resolved": "https://registry.npmjs.org/use-force-update/-/use-force-update-1.0.7.tgz", "resolved": "https://registry.npmjs.org/use-force-update/-/use-force-update-1.0.7.tgz",
"integrity": "sha512-k5dppYhO+I5X/cd7ildbrzeMZJkWwdAh5adaIk0qKN2euh7J0h2GBGBcB4QZ385eyHHnp7LIygvebdRx3XKdwA==" "integrity": "sha512-k5dppYhO+I5X/cd7ildbrzeMZJkWwdAh5adaIk0qKN2euh7J0h2GBGBcB4QZ385eyHHnp7LIygvebdRx3XKdwA=="
}, },
"use-isomorphic-layout-effect": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz",
"integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA=="
},
"use-react-router": { "use-react-router": {
"version": "1.0.7", "version": "1.0.7",
"resolved": "https://registry.npmjs.org/use-react-router/-/use-react-router-1.0.7.tgz", "resolved": "https://registry.npmjs.org/use-react-router/-/use-react-router-1.0.7.tgz",

View file

@ -29,7 +29,7 @@
"@material-ui/lab": "^4.0.0-alpha.58", "@material-ui/lab": "^4.0.0-alpha.58",
"@material-ui/styles": "^4.11.4", "@material-ui/styles": "^4.11.4",
"@reach/auto-id": "^0.16.0", "@reach/auto-id": "^0.16.0",
"@saleor/macaw-ui": "^0.5.2", "@saleor/macaw-ui": "^0.6.1",
"@saleor/sdk": "^0.4.4", "@saleor/sdk": "^0.4.4",
"@sentry/react": "^6.0.0", "@sentry/react": "^6.0.0",
"@types/faker": "^5.1.6", "@types/faker": "^5.1.6",

View file

@ -6,6 +6,7 @@ import {
tabPageProps tabPageProps
} from "@saleor/fixtures"; } from "@saleor/fixtures";
import Decorator from "@saleor/storybook/Decorator"; import Decorator from "@saleor/storybook/Decorator";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -30,13 +31,12 @@ const props: AppsListPageProps = {
onAppInProgressRemove: () => undefined, onAppInProgressRemove: () => undefined,
onAppInstallRetry: () => undefined, onAppInstallRetry: () => undefined,
onCustomAppRemove: () => undefined, onCustomAppRemove: () => undefined,
onInstalledAppRemove: () => undefined, onInstalledAppRemove: () => undefined
onNextPage: () => undefined,
onPreviousPage: () => undefined
}; };
storiesOf("Views / Apps / Apps list", module) storiesOf("Views / Apps / Apps list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <AppsListPage {...props} />) .add("default", () => <AppsListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<AppsListPage <AppsListPage

View file

@ -11,7 +11,7 @@ import { Button } from "@saleor/components/Button";
import CardTitle from "@saleor/components/CardTitle"; import CardTitle from "@saleor/components/CardTitle";
import { IconButton } from "@saleor/components/IconButton"; import { IconButton } from "@saleor/components/IconButton";
import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper"; import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { AppsListQuery } from "@saleor/graphql"; import { AppsListQuery } from "@saleor/graphql";
import { DeleteIcon, ResponsiveTable } from "@saleor/macaw-ui"; import { DeleteIcon, ResponsiveTable } from "@saleor/macaw-ui";
@ -36,10 +36,7 @@ const InstalledApps: React.FC<InstalledAppsProps> = ({
onRemove, onRemove,
settings, settings,
disabled, disabled,
onNextPage,
onPreviousPage,
onUpdateListSettings, onUpdateListSettings,
pageInfo,
...props ...props
}) => { }) => {
const intl = useIntl(); const intl = useIntl();
@ -57,16 +54,10 @@ const InstalledApps: React.FC<InstalledAppsProps> = ({
<ResponsiveTable> <ResponsiveTable>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
settings={settings} settings={settings}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -19,7 +19,8 @@ import useLocalStorage from "@saleor/hooks/useLocalStorage";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { ListViews } from "@saleor/types"; import { ListViews } from "@saleor/types";
import getAppErrorMessage from "@saleor/utils/errors/app"; import getAppErrorMessage from "@saleor/utils/errors/app";
@ -62,7 +63,6 @@ export const AppsList: React.FC<AppsListProps> = ({ params }) => {
const intl = useIntl(); const intl = useIntl();
const navigate = useNavigator(); const navigate = useNavigator();
const { updateListSettings, settings } = useListSettings(ListViews.APPS_LIST); const { updateListSettings, settings } = useListSettings(ListViews.APPS_LIST);
const paginate = usePaginator();
const paginationState = createPaginationState(settings?.rowNumber, params); const paginationState = createPaginationState(settings?.rowNumber, params);
const queryVariables = { const queryVariables = {
sort: { sort: {
@ -95,11 +95,11 @@ export const AppsList: React.FC<AppsListProps> = ({ params }) => {
} }
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
data?.apps?.pageInfo, pageInfo: data?.apps?.pageInfo,
paginationState, paginationState,
params queryString: params
); });
const { const {
data: customAppsData, data: customAppsData,
@ -278,7 +278,7 @@ export const AppsList: React.FC<AppsListProps> = ({ params }) => {
const customApps = customAppsData?.apps?.edges; const customApps = customAppsData?.apps?.edges;
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<AppDeleteDialog <AppDeleteDialog
confirmButtonState={deleteAppOpts.status} confirmButtonState={deleteAppOpts.status}
name={getCurrentAppName( name={getCurrentAppName(
@ -307,9 +307,6 @@ export const AppsList: React.FC<AppsListProps> = ({ params }) => {
loadingAppsInProgress={loadingAppsInProgress} loadingAppsInProgress={loadingAppsInProgress}
disabled={loading || customAppsLoading} disabled={loading || customAppsLoading}
settings={settings} settings={settings}
pageInfo={pageInfo}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
onAppInstallRetry={onAppInstallRetry} onAppInstallRetry={onAppInstallRetry}
getCustomAppHref={id => customAppUrl(id)} getCustomAppHref={id => customAppUrl(id)}
@ -329,7 +326,7 @@ export const AppsList: React.FC<AppsListProps> = ({ params }) => {
}) })
} }
/> />
</> </PaginatorContext.Provider>
); );
}; };

View file

@ -8,7 +8,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { AttributeFragment } from "@saleor/graphql"; import { AttributeFragment } from "@saleor/graphql";
import { translateBoolean } from "@saleor/intl"; import { translateBoolean } from "@saleor/intl";
@ -71,9 +71,6 @@ const AttributeList: React.FC<AttributeListProps> = ({
attributes, attributes,
disabled, disabled,
isChecked, isChecked,
onNextPage,
onPreviousPage,
pageInfo,
selected, selected,
sort, sort,
toggle, toggle,
@ -172,15 +169,7 @@ const AttributeList: React.FC<AttributeListProps> = ({
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext colSpan={numberOfColumns} />
colSpan={numberOfColumns}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/>
</TableRow> </TableRow>
</TableFooter> </TableFooter>
<TableBody> <TableBody>

View file

@ -20,12 +20,18 @@ import {
} from "@saleor/graphql"; } from "@saleor/graphql";
import { DeleteIcon, IconButton, makeStyles } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton, makeStyles } from "@saleor/macaw-ui";
import { renderCollection, stopPropagation } from "@saleor/misc"; import { renderCollection, stopPropagation } from "@saleor/misc";
import { ListProps, RelayToFlat, ReorderAction } from "@saleor/types"; import {
ListProps,
PaginateListProps,
RelayToFlat,
ReorderAction
} from "@saleor/types";
import React from "react"; import React from "react";
import { FormattedMessage, useIntl } from "react-intl"; import { FormattedMessage, useIntl } from "react-intl";
export interface AttributeValuesProps export interface AttributeValuesProps
extends Pick<ListProps, Exclude<keyof ListProps, "getRowHref">> { extends Pick<ListProps, Exclude<keyof ListProps, "getRowHref">>,
PaginateListProps {
disabled: boolean; disabled: boolean;
values: RelayToFlat<AttributeValueListFragment>; values: RelayToFlat<AttributeValueListFragment>;
onValueAdd: () => void; onValueAdd: () => void;

View file

@ -18,7 +18,8 @@ import {
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
@ -48,7 +49,6 @@ interface AttributeListProps {
const AttributeList: React.FC<AttributeListProps> = ({ params }) => { const AttributeList: React.FC<AttributeListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const paginate = usePaginator();
const notify = useNotifier(); const notify = useNotifier();
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
params.ids params.ids
@ -131,16 +131,16 @@ const AttributeList: React.FC<AttributeListProps> = ({ params }) => {
handleTabChange(tabs.length + 1); handleTabChange(tabs.length + 1);
}; };
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
maybe(() => data.attributes.pageInfo), pageInfo: maybe(() => data.attributes.pageInfo),
paginationState, paginationState,
params queryString: params
); });
const handleSort = createSortHandler(navigate, attributeListUrl, params); const handleSort = createSortHandler(navigate, attributeListUrl, params);
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<AttributeListPage <AttributeListPage
attributes={mapEdgesToItems(data?.attributes)} attributes={mapEdgesToItems(data?.attributes)}
currentTab={currentTab} currentTab={currentTab}
@ -150,14 +150,11 @@ const AttributeList: React.FC<AttributeListProps> = ({ params }) => {
isChecked={isSelected} isChecked={isSelected}
onAll={resetFilters} onAll={resetFilters}
onFilterChange={changeFilters} onFilterChange={changeFilters}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onSearchChange={handleSearchChange} onSearchChange={handleSearchChange}
onSort={handleSort} onSort={handleSort}
onTabChange={handleTabChange} onTabChange={handleTabChange}
onTabDelete={() => openModal("delete-search")} onTabDelete={() => openModal("delete-search")}
onTabSave={() => openModal("save-search")} onTabSave={() => openModal("save-search")}
pageInfo={pageInfo}
selected={listElements.length} selected={listElements.length}
sort={getSortParams(params)} sort={getSortParams(params)}
tabs={tabs.map(tab => tab.name)} tabs={tabs.map(tab => tab.name)}
@ -199,7 +196,7 @@ const AttributeList: React.FC<AttributeListProps> = ({ params }) => {
onSubmit={handleTabDelete} onSubmit={handleTabDelete}
tabName={maybe(() => tabs[currentTab - 1].name, "...")} tabName={maybe(() => tabs[currentTab - 1].name, "...")}
/> />
</> </PaginatorContext.Provider>
); );
}; };
AttributeList.displayName = "AttributeList"; AttributeList.displayName = "AttributeList";

View file

@ -5,7 +5,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { CategoryFragment } from "@saleor/graphql"; import { CategoryFragment } from "@saleor/graphql";
import { makeStyles } from "@saleor/macaw-ui"; import { makeStyles } from "@saleor/macaw-ui";
@ -58,15 +58,12 @@ const CategoryList: React.FC<CategoryListProps> = props => {
disabled, disabled,
settings, settings,
sort, sort,
pageInfo,
isChecked, isChecked,
isRoot, isRoot,
selected, selected,
toggle, toggle,
toggleAll, toggleAll,
toolbar, toolbar,
onNextPage,
onPreviousPage,
onUpdateListSettings, onUpdateListSettings,
onSort onSort
} = props; } = props;
@ -136,16 +133,10 @@ const CategoryList: React.FC<CategoryListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
settings={settings} settings={settings}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -36,7 +36,6 @@ export const CategoryListPage: React.FC<CategoryTableProps> = ({
disabled, disabled,
initialSearch, initialSearch,
isChecked, isChecked,
pageInfo,
selected, selected,
settings, settings,
tabs, tabs,
@ -44,8 +43,6 @@ export const CategoryListPage: React.FC<CategoryTableProps> = ({
toggleAll, toggleAll,
toolbar, toolbar,
onAll, onAll,
onNextPage,
onPreviousPage,
onSearchChange, onSearchChange,
onTabChange, onTabChange,
onTabDelete, onTabDelete,
@ -95,14 +92,11 @@ export const CategoryListPage: React.FC<CategoryTableProps> = ({
disabled={disabled} disabled={disabled}
isChecked={isChecked} isChecked={isChecked}
isRoot={true} isRoot={true}
pageInfo={pageInfo}
selected={selected} selected={selected}
settings={settings} settings={settings}
toggle={toggle} toggle={toggle}
toggleAll={toggleAll} toggleAll={toggleAll}
toolbar={toolbar} toolbar={toolbar}
onNextPage={onNextPage}
onPreviousPage={onPreviousPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
{...listProps} {...listProps}
/> />

View file

@ -5,7 +5,7 @@ import Skeleton from "@saleor/components/Skeleton";
import TableCellAvatar from "@saleor/components/TableCellAvatar"; import TableCellAvatar from "@saleor/components/TableCellAvatar";
import { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar/Avatar"; import { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar/Avatar";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { CategoryDetailsQuery } from "@saleor/graphql"; import { CategoryDetailsQuery } from "@saleor/graphql";
import { makeStyles } from "@saleor/macaw-ui"; import { makeStyles } from "@saleor/macaw-ui";
@ -59,14 +59,11 @@ export const CategoryProductList: React.FC<CategoryProductListProps> = props =>
const { const {
disabled, disabled,
isChecked, isChecked,
pageInfo,
products, products,
selected, selected,
toggle, toggle,
toggleAll, toggleAll,
toolbar, toolbar
onNextPage,
onPreviousPage
} = props; } = props;
const classes = useStyles(props); const classes = useStyles(props);
@ -100,15 +97,7 @@ export const CategoryProductList: React.FC<CategoryProductListProps> = props =>
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext colSpan={numberOfColumns} />
colSpan={numberOfColumns}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/>
</TableRow> </TableRow>
</TableFooter> </TableFooter>
<TableBody> <TableBody>

View file

@ -21,9 +21,6 @@ interface CategoryProductsProps extends PageListProps, ListActions {
export const CategoryProducts: React.FC<CategoryProductsProps> = ({ export const CategoryProducts: React.FC<CategoryProductsProps> = ({
products, products,
disabled, disabled,
pageInfo,
onNextPage,
onPreviousPage,
categoryId, categoryId,
categoryName, categoryName,
isChecked, isChecked,
@ -79,9 +76,6 @@ export const CategoryProducts: React.FC<CategoryProductsProps> = ({
<CategoryProductList <CategoryProductList
products={products} products={products}
disabled={disabled} disabled={disabled}
pageInfo={pageInfo}
onNextPage={onNextPage}
onPreviousPage={onPreviousPage}
selected={selected} selected={selected}
isChecked={isChecked} isChecked={isChecked}
toggle={toggle} toggle={toggle}

View file

@ -45,17 +45,11 @@ export interface CategoryUpdatePageProps
category: CategoryDetailsQuery["category"]; category: CategoryDetailsQuery["category"];
products: RelayToFlat<CategoryDetailsQuery["category"]["products"]>; products: RelayToFlat<CategoryDetailsQuery["category"]["products"]>;
subcategories: RelayToFlat<CategoryDetailsQuery["category"]["children"]>; subcategories: RelayToFlat<CategoryDetailsQuery["category"]["children"]>;
pageInfo: {
hasNextPage: boolean;
hasPreviousPage: boolean;
};
saveButtonBarState: ConfirmButtonTransitionState; saveButtonBarState: ConfirmButtonTransitionState;
addProductHref: string; addProductHref: string;
onImageDelete: () => void; onImageDelete: () => void;
onSubmit: (data: CategoryUpdateData) => SubmitPromise; onSubmit: (data: CategoryUpdateData) => SubmitPromise;
onImageUpload(file: File); onImageUpload(file: File);
onNextPage();
onPreviousPage();
onDelete(); onDelete();
} }
@ -69,13 +63,10 @@ export const CategoryUpdatePage: React.FC<CategoryUpdatePageProps> = ({
category, category,
disabled, disabled,
errors, errors,
pageInfo,
products, products,
saveButtonBarState, saveButtonBarState,
subcategories, subcategories,
onDelete, onDelete,
onNextPage,
onPreviousPage,
onSubmit, onSubmit,
onImageDelete, onImageDelete,
onImageUpload, onImageUpload,
@ -191,14 +182,11 @@ export const CategoryUpdatePage: React.FC<CategoryUpdatePageProps> = ({
disabled={disabled} disabled={disabled}
isChecked={isChecked} isChecked={isChecked}
isRoot={false} isRoot={false}
pageInfo={pageInfo}
selected={selected} selected={selected}
sort={undefined} sort={undefined}
toggle={toggle} toggle={toggle}
toggleAll={toggleAll} toggleAll={toggleAll}
toolbar={subcategoryListToolbar} toolbar={subcategoryListToolbar}
onNextPage={onNextPage}
onPreviousPage={onPreviousPage}
onSort={() => undefined} onSort={() => undefined}
/> />
</Card> </Card>
@ -209,9 +197,6 @@ export const CategoryUpdatePage: React.FC<CategoryUpdatePageProps> = ({
categoryName={category?.name} categoryName={category?.name}
products={products} products={products}
disabled={disabled} disabled={disabled}
pageInfo={pageInfo}
onNextPage={onNextPage}
onPreviousPage={onPreviousPage}
toggle={toggle} toggle={toggle}
toggleAll={toggleAll} toggleAll={toggleAll}
selected={selected} selected={selected}

View file

@ -21,6 +21,7 @@ import useLocalPaginator, {
} from "@saleor/hooks/useLocalPaginator"; } from "@saleor/hooks/useLocalPaginator";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { PaginatorContext } from "@saleor/hooks/usePaginator";
import { commonMessages, errorMessages } from "@saleor/intl"; import { commonMessages, errorMessages } from "@saleor/intl";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
@ -174,7 +175,7 @@ export const CategoryDetails: React.FC<CategoryDetailsProps> = ({
CategoryUrlQueryParams CategoryUrlQueryParams
>(navigate, params => categoryUrl(id, params), params); >(navigate, params => categoryUrl(id, params), params);
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const { pageInfo, ...paginationFunctions } = paginate(
activeTab === CategoryPageTab.categories activeTab === CategoryPageTab.categories
? maybe(() => data.category.children.pageInfo) ? maybe(() => data.category.children.pageInfo)
: maybe(() => data.category.products.pageInfo), : maybe(() => data.category.products.pageInfo),
@ -208,7 +209,7 @@ export const CategoryDetails: React.FC<CategoryDetailsProps> = ({
); );
return ( return (
<> <PaginatorContext.Provider value={{ ...pageInfo, ...paginationFunctions }}>
<WindowTitle title={maybe(() => data.category.name)} /> <WindowTitle title={maybe(() => data.category.name)} />
<CategoryUpdatePage <CategoryUpdatePage
categoryId={id} categoryId={id}
@ -239,9 +240,6 @@ export const CategoryDetails: React.FC<CategoryDetailsProps> = ({
} }
}) })
} }
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
pageInfo={pageInfo}
onSubmit={handleSubmit} onSubmit={handleSubmit}
products={mapEdgesToItems(data?.category?.products)} products={mapEdgesToItems(data?.category?.products)}
saveButtonBarState={updateResult.status} saveButtonBarState={updateResult.status}
@ -371,7 +369,7 @@ export const CategoryDetails: React.FC<CategoryDetailsProps> = ({
/> />
</DialogContentText> </DialogContentText>
</ActionDialog> </ActionDialog>
</> </PaginatorContext.Provider>
); );
}; };
export default CategoryDetails; export default CategoryDetails;

View file

@ -14,7 +14,8 @@ import useListSettings from "@saleor/hooks/useListSettings";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
import { maybe } from "@saleor/misc"; import { maybe } from "@saleor/misc";
@ -49,7 +50,6 @@ interface CategoryListProps {
export const CategoryList: React.FC<CategoryListProps> = ({ params }) => { export const CategoryList: React.FC<CategoryListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const paginate = usePaginator();
const { isSelected, listElements, toggle, toggleAll, reset } = useBulkActions( const { isSelected, listElements, toggle, toggleAll, reset } = useBulkActions(
params.ids params.ids
@ -117,11 +117,11 @@ export const CategoryList: React.FC<CategoryListProps> = ({ params }) => {
handleTabChange(tabs.length + 1); handleTabChange(tabs.length + 1);
}; };
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
maybe(() => data.categories.pageInfo), pageInfo: maybe(() => data.categories.pageInfo),
paginationState, paginationState,
params queryString: params
); });
const handleCategoryBulkDelete = (data: CategoryBulkDeleteMutation) => { const handleCategoryBulkDelete = (data: CategoryBulkDeleteMutation) => {
if (data.categoryBulkDelete.errors.length === 0) { if (data.categoryBulkDelete.errors.length === 0) {
@ -141,7 +141,7 @@ export const CategoryList: React.FC<CategoryListProps> = ({ params }) => {
const handleSort = createSortHandler(navigate, categoryListUrl, params); const handleSort = createSortHandler(navigate, categoryListUrl, params);
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<CategoryListPage <CategoryListPage
categories={mapEdgesToItems(data?.categories)} categories={mapEdgesToItems(data?.categories)}
currentTab={currentTab} currentTab={currentTab}
@ -156,10 +156,7 @@ export const CategoryList: React.FC<CategoryListProps> = ({ params }) => {
sort={getSortParams(params)} sort={getSortParams(params)}
onSort={handleSort} onSort={handleSort}
disabled={loading} disabled={loading}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
pageInfo={pageInfo}
isChecked={isSelected} isChecked={isSelected}
selected={listElements.length} selected={listElements.length}
toggle={toggle} toggle={toggle}
@ -235,7 +232,7 @@ export const CategoryList: React.FC<CategoryListProps> = ({ params }) => {
onSubmit={handleTabDelete} onSubmit={handleTabDelete}
tabName={maybe(() => tabs[currentTab - 1].name, "...")} tabName={maybe(() => tabs[currentTab - 1].name, "...")}
/> />
</> </PaginatorContext.Provider>
); );
}; };
export default CategoryList; export default CategoryList;

View file

@ -14,7 +14,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import TooltipTableCellHeader from "@saleor/components/TooltipTableCellHeader"; import TooltipTableCellHeader from "@saleor/components/TooltipTableCellHeader";
import { commonTooltipMessages } from "@saleor/components/TooltipTableCellHeader/messages"; import { commonTooltipMessages } from "@saleor/components/TooltipTableCellHeader/messages";
@ -73,11 +73,8 @@ const CollectionList: React.FC<CollectionListProps> = props => {
disabled, disabled,
settings, settings,
sort, sort,
onNextPage,
onPreviousPage,
onUpdateListSettings, onUpdateListSettings,
onSort, onSort,
pageInfo,
isChecked, isChecked,
selected, selected,
selectedChannelId, selectedChannelId,
@ -150,16 +147,10 @@ const CollectionList: React.FC<CollectionListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
settings={settings} settings={settings}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -15,7 +15,7 @@ import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableB
import TableCellAvatar from "@saleor/components/TableCellAvatar"; import TableCellAvatar from "@saleor/components/TableCellAvatar";
import { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar/Avatar"; import { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar/Avatar";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { CollectionDetailsQuery } from "@saleor/graphql"; import { CollectionDetailsQuery } from "@saleor/graphql";
import { DeleteIcon, IconButton, makeStyles } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton, makeStyles } from "@saleor/macaw-ui";
@ -67,10 +67,7 @@ const CollectionProducts: React.FC<CollectionProductsProps> = props => {
collection, collection,
disabled, disabled,
onAdd, onAdd,
onNextPage,
onPreviousPage,
onProductUnassign, onProductUnassign,
pageInfo,
isChecked, isChecked,
selected, selected,
toggle, toggle,
@ -154,13 +151,7 @@ const CollectionProducts: React.FC<CollectionProductsProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext colSpan={numberOfColumns} />
colSpan={numberOfColumns}
hasNextPage={pageInfo?.hasNextPage}
onNextPage={onNextPage}
hasPreviousPage={pageInfo?.hasPreviousPage}
onPreviousPage={onPreviousPage}
/>
</TableRow> </TableRow>
</TableFooter> </TableFooter>
<TableBody> <TableBody>

View file

@ -31,6 +31,7 @@ import useLocalPaginator, {
import useLocalStorage from "@saleor/hooks/useLocalStorage"; import useLocalStorage from "@saleor/hooks/useLocalStorage";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { PaginatorContext } from "@saleor/hooks/usePaginator";
import { commonMessages, errorMessages } from "@saleor/intl"; import { commonMessages, errorMessages } from "@saleor/intl";
import useProductSearch from "@saleor/searches/useProductSearch"; import useProductSearch from "@saleor/searches/useProductSearch";
import { arrayDiff } from "@saleor/utils/arrays"; import { arrayDiff } from "@saleor/utils/arrays";
@ -255,13 +256,13 @@ export const CollectionDetails: React.FC<CollectionDetailsProps> = ({
updateCollectionOpts.data?.collectionUpdate.errors updateCollectionOpts.data?.collectionUpdate.errors
); );
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const { pageInfo, ...paginationValues } = paginate(
data?.collection?.products?.pageInfo, data?.collection?.products?.pageInfo,
paginationState paginationState
); );
return ( return (
<> <PaginatorContext.Provider value={{ ...pageInfo, ...paginationValues }}>
<WindowTitle title={data?.collection?.name} /> <WindowTitle title={data?.collection?.name} />
{!!allChannels?.length && ( {!!allChannels?.length && (
<ChannelsAvailabilityDialog <ChannelsAvailabilityDialog
@ -302,9 +303,6 @@ export const CollectionDetails: React.FC<CollectionDetailsProps> = ({
}) })
} }
onSubmit={handleSubmit} onSubmit={handleSubmit}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
pageInfo={pageInfo}
onProductUnassign={(productId, event) => { onProductUnassign={(productId, event) => {
event.stopPropagation(); event.stopPropagation();
unassignProduct({ unassignProduct({
@ -448,7 +446,7 @@ export const CollectionDetails: React.FC<CollectionDetailsProps> = ({
/> />
</DialogContentText> </DialogContentText>
</ActionDialog> </ActionDialog>
</> </PaginatorContext.Provider>
); );
}; };
export default CollectionDetails; export default CollectionDetails;

View file

@ -15,7 +15,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { commonMessages } from "@saleor/intl"; import { commonMessages } from "@saleor/intl";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
@ -55,7 +56,6 @@ export const CollectionList: React.FC<CollectionListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const intl = useIntl(); const intl = useIntl();
const notify = useNotifier(); const notify = useNotifier();
const paginate = usePaginator();
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
params.ids params.ids
); );
@ -159,16 +159,16 @@ export const CollectionList: React.FC<CollectionListProps> = ({ params }) => {
handleTabChange(tabs.length + 1); handleTabChange(tabs.length + 1);
}; };
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
maybe(() => data.collections.pageInfo), pageInfo: maybe(() => data.collections.pageInfo),
paginationState, paginationState,
params queryString: params
); });
const handleSort = createSortHandler(navigate, collectionListUrl, params); const handleSort = createSortHandler(navigate, collectionListUrl, params);
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<CollectionListPage <CollectionListPage
currentTab={currentTab} currentTab={currentTab}
initialSearch={params.query || ""} initialSearch={params.query || ""}
@ -181,11 +181,8 @@ export const CollectionList: React.FC<CollectionListProps> = ({ params }) => {
disabled={loading} disabled={loading}
collections={mapEdgesToItems(data?.collections)} collections={mapEdgesToItems(data?.collections)}
settings={settings} settings={settings}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onSort={handleSort} onSort={handleSort}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
pageInfo={pageInfo}
sort={getSortParams(params)} sort={getSortParams(params)}
toolbar={ toolbar={
<IconButton <IconButton
@ -251,7 +248,7 @@ export const CollectionList: React.FC<CollectionListProps> = ({ params }) => {
onSubmit={handleTabDelete} onSubmit={handleTabDelete}
tabName={maybe(() => tabs[currentTab - 1].name, "...")} tabName={maybe(() => tabs[currentTab - 1].name, "...")}
/> />
</> </PaginatorContext.Provider>
); );
}; };
export default CollectionList; export default CollectionList;

View file

@ -1,5 +1,6 @@
import Attributes, { AttributesProps } from "@saleor/components/Attributes"; import Attributes, { AttributesProps } from "@saleor/components/Attributes";
import { fetchMoreProps } from "@saleor/fixtures"; import { fetchMoreProps } from "@saleor/fixtures";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -31,6 +32,7 @@ const props: AttributesProps = {
storiesOf("Attributes / Attributes", module) storiesOf("Attributes / Attributes", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <Attributes {...props} />) .add("default", () => <Attributes {...props} />)
.add("selected", () => ( .add("selected", () => (
<Attributes {...props} attributes={ATTRIBUTES_SELECTED} /> <Attributes {...props} attributes={ATTRIBUTES_SELECTED} />

View file

@ -5,6 +5,7 @@ import {
} from "@saleor/macaw-ui"; } from "@saleor/macaw-ui";
import React from "react"; import React from "react";
import { defineMessages, useIntl } from "react-intl"; import { defineMessages, useIntl } from "react-intl";
import { Link, LinkProps } from "react-router-dom";
import { ListSettings } from "../../types"; import { ListSettings } from "../../types";
@ -22,17 +23,28 @@ const messages = defineMessages({
}); });
export interface PaginationProps export interface PaginationProps
extends Omit<MacawPaginationProps, "labels" | "rowNumber"> { extends Omit<
MacawPaginationProps,
"labels" | "rowNumber" | "nextIconButtonProps" | "prevIconButtonProps"
> {
component?: React.ElementType; component?: React.ElementType;
colSpan?: number; colSpan?: number;
settings?: ListSettings; settings?: ListSettings;
onUpdateListSettings?: ListSettingsUpdate; onUpdateListSettings?: ListSettingsUpdate;
prevHref?: string;
nextHref?: string;
disabled?: boolean;
} }
export const TablePagination: React.FC<PaginationProps> = ({ export const TablePagination: React.FC<PaginationProps> = ({
component, component,
colSpan, colSpan,
settings, settings,
onUpdateListSettings, onUpdateListSettings,
nextHref,
prevHref,
hasNextPage,
hasPreviousPage,
disabled,
...rest ...rest
}) => { }) => {
const intl = useIntl(); const intl = useIntl();
@ -40,8 +52,10 @@ export const TablePagination: React.FC<PaginationProps> = ({
return ( return (
<Wrapper colSpan={colSpan || 1000}> <Wrapper colSpan={colSpan || 1000}>
<Pagination <Pagination<LinkProps>
{...rest} {...rest}
hasNextPage={hasNextPage && !disabled}
hasPreviousPage={hasPreviousPage && !disabled}
labels={{ labels={{
noOfRows: intl.formatMessage(messages.noOfRows) noOfRows: intl.formatMessage(messages.noOfRows)
}} }}
@ -51,6 +65,12 @@ export const TablePagination: React.FC<PaginationProps> = ({
? value => onUpdateListSettings("rowNumber", value) ? value => onUpdateListSettings("rowNumber", value)
: undefined : undefined
} }
nextIconButtonProps={
nextHref ? { component: Link, to: nextHref } : undefined
}
prevIconButtonProps={
prevHref ? { component: Link, to: prevHref } : undefined
}
/> />
</Wrapper> </Wrapper>
); );

View file

@ -0,0 +1,50 @@
import { usePaginatorContext } from "@saleor/hooks/usePaginator";
import React from "react";
import TablePagination, { PaginationProps } from "./TablePagination";
export type TablePaginationWithContextProps = Omit<
PaginationProps,
| "nextHref"
| "prevHref"
| "hasNextPage"
| "hasPreviousPage"
| "onNextPage"
| "onPreviousPage"
>;
export const TablePaginationWithContext = (
props: TablePaginationWithContextProps
) => {
const {
hasNextPage,
hasPreviousPage,
paginatorType,
...paginationProps
} = usePaginatorContext();
if (paginatorType === "click") {
const { loadNextPage, loadPreviousPage } = paginationProps;
return (
<TablePagination
{...props}
hasNextPage={hasNextPage}
hasPreviousPage={hasPreviousPage}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
/>
);
}
const { prevPageHref, nextPageHref } = paginationProps;
return (
<TablePagination
{...props}
hasNextPage={hasNextPage}
hasPreviousPage={hasPreviousPage}
prevHref={prevPageHref}
nextHref={nextPageHref}
/>
);
};

View file

@ -1,3 +1,4 @@
export { default } from "./TablePagination"; export { default } from "./TablePagination";
export * from "./TablePagination"; export * from "./TablePagination";
export * from "./TablePaginationActions"; export * from "./TablePaginationActions";
export * from "./TablePaginationWithContext";

View file

@ -8,7 +8,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { CustomerListUrlSortField, customerUrl } from "@saleor/customers/urls"; import { CustomerListUrlSortField, customerUrl } from "@saleor/customers/urls";
import { ListCustomersQuery, PermissionEnum } from "@saleor/graphql"; import { ListCustomersQuery, PermissionEnum } from "@saleor/graphql";
@ -54,9 +54,6 @@ const CustomerList: React.FC<CustomerListProps> = props => {
settings, settings,
disabled, disabled,
customers, customers,
pageInfo,
onNextPage,
onPreviousPage,
onUpdateListSettings, onUpdateListSettings,
onSort, onSort,
toolbar, toolbar,
@ -129,16 +126,10 @@ const CustomerList: React.FC<CustomerListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
settings={settings} settings={settings}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -15,7 +15,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { commonMessages, sectionNames } from "@saleor/intl"; import { commonMessages, sectionNames } from "@saleor/intl";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
@ -54,7 +55,6 @@ interface CustomerListProps {
export const CustomerList: React.FC<CustomerListProps> = ({ params }) => { export const CustomerList: React.FC<CustomerListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const paginate = usePaginator();
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
params.ids params.ids
); );
@ -122,11 +122,11 @@ export const CustomerList: React.FC<CustomerListProps> = ({ params }) => {
handleTabChange(tabs.length + 1); handleTabChange(tabs.length + 1);
}; };
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
maybe(() => data.customers.pageInfo), pageInfo: maybe(() => data.customers.pageInfo),
paginationState, paginationState,
params queryString: params
); });
const [ const [
bulkRemoveCustomers, bulkRemoveCustomers,
@ -148,7 +148,7 @@ export const CustomerList: React.FC<CustomerListProps> = ({ params }) => {
const handleSort = createSortHandler(navigate, customerListUrl, params); const handleSort = createSortHandler(navigate, customerListUrl, params);
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<WindowTitle title={intl.formatMessage(sectionNames.customers)} /> <WindowTitle title={intl.formatMessage(sectionNames.customers)} />
<CustomerListPage <CustomerListPage
currentTab={currentTab} currentTab={currentTab}
@ -164,9 +164,6 @@ export const CustomerList: React.FC<CustomerListProps> = ({ params }) => {
customers={mapEdgesToItems(data?.customers)} customers={mapEdgesToItems(data?.customers)}
settings={settings} settings={settings}
disabled={loading} disabled={loading}
pageInfo={pageInfo}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
onSort={handleSort} onSort={handleSort}
toolbar={ toolbar={
@ -230,7 +227,7 @@ export const CustomerList: React.FC<CustomerListProps> = ({ params }) => {
onSubmit={handleTabDelete} onSubmit={handleTabDelete}
tabName={maybe(() => tabs[currentTab - 1].name, "...")} tabName={maybe(() => tabs[currentTab - 1].name, "...")}
/> />
</> </PaginatorContext.Provider>
); );
}; };
export default CustomerList; export default CustomerList;

View file

@ -13,7 +13,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper"; import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { SaleDetailsFragment, VoucherDetailsFragment } from "@saleor/graphql"; import { SaleDetailsFragment, VoucherDetailsFragment } from "@saleor/graphql";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
@ -38,11 +38,8 @@ const DiscountCategories: React.FC<DiscountCategoriesProps> = props => {
const { const {
discount, discount,
disabled, disabled,
pageInfo,
onCategoryAssign, onCategoryAssign,
onCategoryUnassign, onCategoryUnassign,
onPreviousPage,
onNextPage,
toolbar, toolbar,
toggle, toggle,
toggleAll, toggleAll,
@ -94,15 +91,7 @@ const DiscountCategories: React.FC<DiscountCategoriesProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext colSpan={numberOfColumns} />
colSpan={numberOfColumns}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/>
</TableRow> </TableRow>
</TableFooter> </TableFooter>
<TableBody> <TableBody>

View file

@ -13,7 +13,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper"; import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { SaleDetailsFragment, VoucherDetailsFragment } from "@saleor/graphql"; import { SaleDetailsFragment, VoucherDetailsFragment } from "@saleor/graphql";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
@ -38,11 +38,8 @@ const DiscountCollections: React.FC<DiscountCollectionsProps> = props => {
const { const {
discount: sale, discount: sale,
disabled, disabled,
pageInfo,
onCollectionAssign, onCollectionAssign,
onCollectionUnassign, onCollectionUnassign,
onPreviousPage,
onNextPage,
isChecked, isChecked,
selected, selected,
toggle, toggle,
@ -92,15 +89,7 @@ const DiscountCollections: React.FC<DiscountCollectionsProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext colSpan={numberOfColumns} />
colSpan={numberOfColumns}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/>
</TableRow> </TableRow>
</TableFooter> </TableFooter>
<TableBody> <TableBody>

View file

@ -14,7 +14,7 @@ import Skeleton from "@saleor/components/Skeleton";
import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper"; import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper";
import TableCellAvatar from "@saleor/components/TableCellAvatar"; import TableCellAvatar from "@saleor/components/TableCellAvatar";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { SaleDetailsFragment, VoucherDetailsFragment } from "@saleor/graphql"; import { SaleDetailsFragment, VoucherDetailsFragment } from "@saleor/graphql";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
@ -41,11 +41,8 @@ const DiscountProducts: React.FC<SaleProductsProps> = props => {
const { const {
products, products,
disabled, disabled,
pageInfo,
onPreviousPage,
onProductAssign, onProductAssign,
onProductUnassign, onProductUnassign,
onNextPage,
isChecked, isChecked,
selected, selected,
toggle, toggle,
@ -101,15 +98,7 @@ const DiscountProducts: React.FC<SaleProductsProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext colSpan={numberOfColumns} />
colSpan={numberOfColumns}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/>
</TableRow> </TableRow>
</TableFooter> </TableFooter>
<TableBody> <TableBody>

View file

@ -13,7 +13,7 @@ import Skeleton from "@saleor/components/Skeleton";
import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper"; import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper";
import TableCellAvatar from "@saleor/components/TableCellAvatar"; import TableCellAvatar from "@saleor/components/TableCellAvatar";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { SaleDetailsFragment } from "@saleor/graphql"; import { SaleDetailsFragment } from "@saleor/graphql";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
@ -38,11 +38,8 @@ const DiscountVariants: React.FC<SaleVariantsProps> = props => {
const { const {
variants, variants,
disabled, disabled,
pageInfo,
onPreviousPage,
onVariantAssign, onVariantAssign,
onVariantUnassign, onVariantUnassign,
onNextPage,
isChecked, isChecked,
selected, selected,
toggle, toggle,
@ -100,15 +97,7 @@ const DiscountVariants: React.FC<SaleVariantsProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext colSpan={numberOfColumns} />
colSpan={numberOfColumns}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/>
</TableRow> </TableRow>
</TableFooter> </TableFooter>
<TableBody> <TableBody>

View file

@ -106,7 +106,6 @@ const SaleDetailsPage: React.FC<SaleDetailsPageProps> = ({
onSubmit, onSubmit,
onTabClick, onTabClick,
openChannelsModal, openChannelsModal,
pageInfo,
sale, sale,
saveButtonBarState, saveButtonBarState,
onCategoryAssign, onCategoryAssign,
@ -114,8 +113,6 @@ const SaleDetailsPage: React.FC<SaleDetailsPageProps> = ({
onChannelsChange, onChannelsChange,
onCollectionAssign, onCollectionAssign,
onCollectionUnassign, onCollectionUnassign,
onNextPage,
onPreviousPage,
onProductAssign, onProductAssign,
onProductUnassign, onProductUnassign,
onVariantAssign, onVariantAssign,
@ -277,9 +274,6 @@ const SaleDetailsPage: React.FC<SaleDetailsPageProps> = ({
disabled={disabled} disabled={disabled}
onCategoryAssign={onCategoryAssign} onCategoryAssign={onCategoryAssign}
onCategoryUnassign={onCategoryUnassign} onCategoryUnassign={onCategoryUnassign}
onNextPage={onNextPage}
onPreviousPage={onPreviousPage}
pageInfo={pageInfo}
discount={sale} discount={sale}
isChecked={isChecked} isChecked={isChecked}
selected={selected} selected={selected}
@ -292,9 +286,6 @@ const SaleDetailsPage: React.FC<SaleDetailsPageProps> = ({
disabled={disabled} disabled={disabled}
onCollectionAssign={onCollectionAssign} onCollectionAssign={onCollectionAssign}
onCollectionUnassign={onCollectionUnassign} onCollectionUnassign={onCollectionUnassign}
onNextPage={onNextPage}
onPreviousPage={onPreviousPage}
pageInfo={pageInfo}
discount={sale} discount={sale}
isChecked={isChecked} isChecked={isChecked}
selected={selected} selected={selected}
@ -305,11 +296,8 @@ const SaleDetailsPage: React.FC<SaleDetailsPageProps> = ({
) : activeTab === SaleDetailsPageTab.products ? ( ) : activeTab === SaleDetailsPageTab.products ? (
<DiscountProducts <DiscountProducts
disabled={disabled} disabled={disabled}
onNextPage={onNextPage}
onPreviousPage={onPreviousPage}
onProductAssign={onProductAssign} onProductAssign={onProductAssign}
onProductUnassign={onProductUnassign} onProductUnassign={onProductUnassign}
pageInfo={pageInfo}
products={mapEdgesToItems(sale?.products)} products={mapEdgesToItems(sale?.products)}
isChecked={isChecked} isChecked={isChecked}
selected={selected} selected={selected}
@ -320,11 +308,8 @@ const SaleDetailsPage: React.FC<SaleDetailsPageProps> = ({
) : ( ) : (
<DiscountVariants <DiscountVariants
disabled={disabled} disabled={disabled}
onNextPage={onNextPage}
onPreviousPage={onPreviousPage}
onVariantAssign={onVariantAssign} onVariantAssign={onVariantAssign}
onVariantUnassign={onVariantUnassign} onVariantUnassign={onVariantUnassign}
pageInfo={pageInfo}
variants={mapEdgesToItems(sale?.variants)} variants={mapEdgesToItems(sale?.variants)}
isChecked={isChecked} isChecked={isChecked}
selected={selected} selected={selected}

View file

@ -7,7 +7,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import TooltipTableCellHeader from "@saleor/components/TooltipTableCellHeader"; import TooltipTableCellHeader from "@saleor/components/TooltipTableCellHeader";
import { commonTooltipMessages } from "@saleor/components/TooltipTableCellHeader/messages"; import { commonTooltipMessages } from "@saleor/components/TooltipTableCellHeader/messages";
@ -71,11 +71,8 @@ const SaleList: React.FC<SaleListProps> = props => {
const { const {
settings, settings,
disabled, disabled,
onNextPage,
onPreviousPage,
onUpdateListSettings, onUpdateListSettings,
onSort, onSort,
pageInfo,
sales, sales,
selectedChannelId, selectedChannelId,
isChecked, isChecked,
@ -174,16 +171,10 @@ const SaleList: React.FC<SaleListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
settings={settings} settings={settings}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -109,7 +109,6 @@ const VoucherDetailsPage: React.FC<VoucherDetailsPageProps> = ({
channelListings = [], channelListings = [],
disabled, disabled,
errors, errors,
pageInfo,
saveButtonBarState, saveButtonBarState,
voucher, voucher,
onCategoryAssign, onCategoryAssign,
@ -119,8 +118,6 @@ const VoucherDetailsPage: React.FC<VoucherDetailsPageProps> = ({
onCountryUnassign, onCountryUnassign,
onCollectionAssign, onCollectionAssign,
onCollectionUnassign, onCollectionUnassign,
onNextPage,
onPreviousPage,
onProductAssign, onProductAssign,
onProductUnassign, onProductUnassign,
onTabClick, onTabClick,
@ -309,9 +306,6 @@ const VoucherDetailsPage: React.FC<VoucherDetailsPageProps> = ({
disabled={disabled} disabled={disabled}
onCategoryAssign={onCategoryAssign} onCategoryAssign={onCategoryAssign}
onCategoryUnassign={onCategoryUnassign} onCategoryUnassign={onCategoryUnassign}
onNextPage={onNextPage}
onPreviousPage={onPreviousPage}
pageInfo={pageInfo}
discount={voucher} discount={voucher}
isChecked={isChecked} isChecked={isChecked}
selected={selected} selected={selected}
@ -324,9 +318,6 @@ const VoucherDetailsPage: React.FC<VoucherDetailsPageProps> = ({
disabled={disabled} disabled={disabled}
onCollectionAssign={onCollectionAssign} onCollectionAssign={onCollectionAssign}
onCollectionUnassign={onCollectionUnassign} onCollectionUnassign={onCollectionUnassign}
onNextPage={onNextPage}
onPreviousPage={onPreviousPage}
pageInfo={pageInfo}
discount={voucher} discount={voucher}
isChecked={isChecked} isChecked={isChecked}
selected={selected} selected={selected}
@ -337,11 +328,8 @@ const VoucherDetailsPage: React.FC<VoucherDetailsPageProps> = ({
) : ( ) : (
<DiscountProducts <DiscountProducts
disabled={disabled} disabled={disabled}
onNextPage={onNextPage}
onPreviousPage={onPreviousPage}
onProductAssign={onProductAssign} onProductAssign={onProductAssign}
onProductUnassign={onProductUnassign} onProductUnassign={onProductUnassign}
pageInfo={pageInfo}
products={mapEdgesToItems(voucher?.products)} products={mapEdgesToItems(voucher?.products)}
isChecked={isChecked} isChecked={isChecked}
selected={selected} selected={selected}

View file

@ -7,7 +7,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import TooltipTableCellHeader from "@saleor/components/TooltipTableCellHeader"; import TooltipTableCellHeader from "@saleor/components/TooltipTableCellHeader";
import { commonTooltipMessages } from "@saleor/components/TooltipTableCellHeader/messages"; import { commonTooltipMessages } from "@saleor/components/TooltipTableCellHeader/messages";
@ -88,11 +88,8 @@ const VoucherList: React.FC<VoucherListProps> = props => {
const { const {
settings, settings,
disabled, disabled,
onNextPage,
onPreviousPage,
onUpdateListSettings, onUpdateListSettings,
onSort, onSort,
pageInfo,
vouchers, vouchers,
isChecked, isChecked,
selected, selected,
@ -228,16 +225,10 @@ const VoucherList: React.FC<VoucherListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
settings={settings} settings={settings}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -40,6 +40,7 @@ import useLocalPaginator, {
import useLocalStorage from "@saleor/hooks/useLocalStorage"; import useLocalStorage from "@saleor/hooks/useLocalStorage";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { PaginatorContext } from "@saleor/hooks/usePaginator";
import { commonMessages, sectionNames } from "@saleor/intl"; import { commonMessages, sectionNames } from "@saleor/intl";
import { maybe } from "@saleor/misc"; import { maybe } from "@saleor/misc";
import useCategorySearch from "@saleor/searches/useCategorySearch"; import useCategorySearch from "@saleor/searches/useCategorySearch";
@ -251,7 +252,7 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
} }
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const { pageInfo, ...paginationValues } = paginate(
tabPageInfo, tabPageInfo,
paginationState paginationState
); );
@ -269,7 +270,7 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
); );
return ( return (
<> <PaginatorContext.Provider value={{ ...pageInfo, ...paginationValues }}>
<WindowTitle title={intl.formatMessage(sectionNames.sales)} /> <WindowTitle title={intl.formatMessage(sectionNames.sales)} />
{!!allChannels?.length && ( {!!allChannels?.length && (
<ChannelsAvailabilityDialog <ChannelsAvailabilityDialog
@ -295,11 +296,8 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
disabled={loading || saleCataloguesRemoveOpts.loading} disabled={loading || saleCataloguesRemoveOpts.loading}
errors={saleUpdateOpts.data?.saleUpdate.errors || []} errors={saleUpdateOpts.data?.saleUpdate.errors || []}
selectedChannelId={selectedChannel} selectedChannelId={selectedChannel}
pageInfo={pageInfo}
openChannelsModal={handleChannelsModalOpen} openChannelsModal={handleChannelsModalOpen}
onChannelsChange={setCurrentChannels} onChannelsChange={setCurrentChannels}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onCategoryAssign={() => openModal("assign-category")} onCategoryAssign={() => openModal("assign-category")}
onCollectionAssign={() => openModal("assign-collection")} onCollectionAssign={() => openModal("assign-collection")}
onCollectionUnassign={collectionId => onCollectionUnassign={collectionId =>
@ -589,7 +587,7 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
/> />
</DialogContentText> </DialogContentText>
</ActionDialog> </ActionDialog>
</> </PaginatorContext.Provider>
); );
}; };
export default SaleDetails; export default SaleDetails;

View file

@ -13,7 +13,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { commonMessages, sectionNames } from "@saleor/intl"; import { commonMessages, sectionNames } from "@saleor/intl";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
@ -52,7 +53,6 @@ interface SaleListProps {
export const SaleList: React.FC<SaleListProps> = ({ params }) => { export const SaleList: React.FC<SaleListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const paginate = usePaginator();
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
params.ids params.ids
); );
@ -141,11 +141,11 @@ export const SaleList: React.FC<SaleListProps> = ({ params }) => {
const canOpenBulkActionDialog = maybe(() => params.ids.length > 0); const canOpenBulkActionDialog = maybe(() => params.ids.length > 0);
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
maybe(() => data.sales.pageInfo), pageInfo: maybe(() => data.sales.pageInfo),
paginationState, paginationState,
params queryString: params
); });
const [saleBulkDelete, saleBulkDeleteOpts] = useSaleBulkDeleteMutation({ const [saleBulkDelete, saleBulkDeleteOpts] = useSaleBulkDeleteMutation({
onCompleted: data => { onCompleted: data => {
@ -171,7 +171,7 @@ export const SaleList: React.FC<SaleListProps> = ({ params }) => {
}); });
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<WindowTitle title={intl.formatMessage(sectionNames.sales)} /> <WindowTitle title={intl.formatMessage(sectionNames.sales)} />
<SaleListPage <SaleListPage
currentTab={currentTab} currentTab={currentTab}
@ -187,9 +187,6 @@ export const SaleList: React.FC<SaleListProps> = ({ params }) => {
sales={mapEdgesToItems(data?.sales)} sales={mapEdgesToItems(data?.sales)}
settings={settings} settings={settings}
disabled={loading} disabled={loading}
pageInfo={pageInfo}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onSort={handleSort} onSort={handleSort}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
isChecked={isSelected} isChecked={isSelected}
@ -251,7 +248,7 @@ export const SaleList: React.FC<SaleListProps> = ({ params }) => {
onSubmit={handleTabDelete} onSubmit={handleTabDelete}
tabName={maybe(() => tabs[currentTab - 1].name, "...")} tabName={maybe(() => tabs[currentTab - 1].name, "...")}
/> />
</> </PaginatorContext.Provider>
); );
}; };
export default SaleList; export default SaleList;

View file

@ -40,6 +40,7 @@ import useLocalPaginator, {
} from "@saleor/hooks/useLocalPaginator"; } from "@saleor/hooks/useLocalPaginator";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { PaginatorContext } from "@saleor/hooks/usePaginator";
import useShop from "@saleor/hooks/useShop"; import useShop from "@saleor/hooks/useShop";
import { commonMessages, sectionNames } from "@saleor/intl"; import { commonMessages, sectionNames } from "@saleor/intl";
import useCategorySearch from "@saleor/searches/useCategorySearch"; import useCategorySearch from "@saleor/searches/useCategorySearch";
@ -263,13 +264,13 @@ export const VoucherDetails: React.FC<VoucherDetailsProps> = ({
} }
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const { pageInfo, ...paginationValues } = paginate(
tabPageInfo, tabPageInfo,
paginationState paginationState
); );
return ( return (
<> <PaginatorContext.Provider value={{ ...pageInfo, ...paginationValues }}>
<WindowTitle title={intl.formatMessage(sectionNames.vouchers)} /> <WindowTitle title={intl.formatMessage(sectionNames.vouchers)} />
{!!allChannels?.length && ( {!!allChannels?.length && (
<ChannelsAvailabilityDialog <ChannelsAvailabilityDialog
@ -303,9 +304,6 @@ export const VoucherDetails: React.FC<VoucherDetailsProps> = ({
...(updateChannelsOpts.data?.voucherChannelListingUpdate.errors || []) ...(updateChannelsOpts.data?.voucherChannelListingUpdate.errors || [])
]} ]}
selectedChannelId={channel?.id} selectedChannelId={channel?.id}
pageInfo={pageInfo}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onCategoryAssign={() => openModal("assign-category")} onCategoryAssign={() => openModal("assign-category")}
onCollectionAssign={() => openModal("assign-collection")} onCollectionAssign={() => openModal("assign-collection")}
onCollectionUnassign={collectionId => onCollectionUnassign={collectionId =>
@ -605,7 +603,7 @@ export const VoucherDetails: React.FC<VoucherDetailsProps> = ({
/> />
</DialogContentText> </DialogContentText>
</ActionDialog> </ActionDialog>
</> </PaginatorContext.Provider>
); );
}; };
export default VoucherDetails; export default VoucherDetails;

View file

@ -16,7 +16,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { commonMessages, sectionNames } from "@saleor/intl"; import { commonMessages, sectionNames } from "@saleor/intl";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
@ -55,7 +56,6 @@ interface VoucherListProps {
export const VoucherList: React.FC<VoucherListProps> = ({ params }) => { export const VoucherList: React.FC<VoucherListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const paginate = usePaginator();
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
params.ids params.ids
); );
@ -145,11 +145,11 @@ export const VoucherList: React.FC<VoucherListProps> = ({ params }) => {
const canOpenBulkActionDialog = maybe(() => params.ids.length > 0); const canOpenBulkActionDialog = maybe(() => params.ids.length > 0);
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
data?.vouchers?.pageInfo, pageInfo: data?.vouchers?.pageInfo,
paginationState, paginationState,
params queryString: params
); });
const [ const [
voucherBulkDelete, voucherBulkDelete,
@ -178,7 +178,7 @@ export const VoucherList: React.FC<VoucherListProps> = ({ params }) => {
const handleSort = createSortHandler(navigate, voucherListUrl, params); const handleSort = createSortHandler(navigate, voucherListUrl, params);
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<WindowTitle title={intl.formatMessage(sectionNames.vouchers)} /> <WindowTitle title={intl.formatMessage(sectionNames.vouchers)} />
<VoucherListPage <VoucherListPage
currentTab={currentTab} currentTab={currentTab}
@ -194,9 +194,6 @@ export const VoucherList: React.FC<VoucherListProps> = ({ params }) => {
settings={settings} settings={settings}
vouchers={mapEdgesToItems(data?.vouchers)} vouchers={mapEdgesToItems(data?.vouchers)}
disabled={loading} disabled={loading}
pageInfo={pageInfo}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
onSort={handleSort} onSort={handleSort}
isChecked={isSelected} isChecked={isSelected}
@ -258,7 +255,7 @@ export const VoucherList: React.FC<VoucherListProps> = ({ params }) => {
onSubmit={handleTabDelete} onSubmit={handleTabDelete}
tabName={maybe(() => tabs[currentTab - 1].name, "...")} tabName={maybe(() => tabs[currentTab - 1].name, "...")}
/> />
</> </PaginatorContext.Provider>
); );
}; };
export default VoucherList; export default VoucherList;

View file

@ -5,6 +5,7 @@ import {
UserDetailsQuery UserDetailsQuery
} from "@saleor/graphql"; } from "@saleor/graphql";
import { PaginatorContextValues } from "./hooks/usePaginator";
import { import {
FetchMoreProps, FetchMoreProps,
FilterPageProps, FilterPageProps,
@ -303,6 +304,16 @@ export const tabPageProps: TabPageProps = {
tabs: ["Tab X"] tabs: ["Tab X"]
}; };
export const paginatorContextValues: PaginatorContextValues = {
endCursor: "",
startCursor: "",
hasNextPage: false,
hasPreviousPage: false,
nextPageHref: "",
prevPageHref: "",
paginatorType: "link"
};
export const searchPageProps: SearchPageProps = { export const searchPageProps: SearchPageProps = {
initialSearch: "", initialSearch: "",
onSearchChange: () => undefined onSearchChange: () => undefined

View file

@ -6,8 +6,6 @@ import React from "react";
import { useGiftCardList } from "../providers/GiftCardListProvider"; import { useGiftCardList } from "../providers/GiftCardListProvider";
const GiftCardsListTableFooter: React.FC = () => { const GiftCardsListTableFooter: React.FC = () => {
const paginate = usePaginator();
const { const {
settings, settings,
updateListSettings, updateListSettings,
@ -17,23 +15,20 @@ const GiftCardsListTableFooter: React.FC = () => {
numberOfColumns numberOfColumns
} = useGiftCardList(); } = useGiftCardList();
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
apiPageInfo, pageInfo: apiPageInfo,
paginationState, paginationState,
params queryString: params
); });
return ( return (
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePagination
{...paginationValues}
settings={settings} settings={settings}
colSpan={numberOfColumns} colSpan={numberOfColumns}
hasNextPage={pageInfo ? pageInfo.hasNextPage : false}
onNextPage={loadNextPage}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
onPreviousPage={loadPreviousPage}
hasPreviousPage={pageInfo ? pageInfo.hasPreviousPage : false}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -117,6 +117,7 @@ function useLocalPaginator(
return { return {
loadNextPage, loadNextPage,
loadPreviousPage, loadPreviousPage,
paginatorType: "click" as const,
pageInfo: newPageInfo pageInfo: newPageInfo
}; };
} }

View file

@ -1,7 +1,7 @@
import { stringifyQs } from "@saleor/utils/urls"; import { stringifyQs } from "@saleor/utils/urls";
import { createContext, useContext, useMemo } from "react";
import { Pagination } from "../types"; import { Pagination } from "../types";
import useNavigator from "./useNavigator";
export interface PageInfo { export interface PageInfo {
endCursor: string; endCursor: string;
@ -36,50 +36,105 @@ export function createPaginationState(
}; };
} }
function usePaginator() { interface UsePaginatorArgs {
const navigate = useNavigator(); pageInfo: PageInfo;
paginationState: PaginationState;
queryString: Pagination;
}
function paginate( function usePaginator({
pageInfo: PageInfo, queryString,
paginationState: PaginationState, paginationState,
queryString: Pagination pageInfo
) { }: UsePaginatorArgs) {
const loadNextPage = () => const newPageInfo = useMemo<PageInfo>(
navigate( () =>
"?" + pageInfo
stringifyQs({
...queryString,
after: pageInfo.endCursor,
before: undefined
}),
{ replace: true, resetScroll: true }
);
const loadPreviousPage = () =>
navigate(
"?" +
stringifyQs({
...queryString,
after: undefined,
before: pageInfo.startCursor
}),
{ replace: true, resetScroll: true }
);
const newPageInfo = pageInfo
? { ? {
...pageInfo, ...pageInfo,
hasNextPage: !!paginationState.before || pageInfo.hasNextPage, hasNextPage: !!paginationState.before || pageInfo.hasNextPage,
hasPreviousPage: !!paginationState.after || pageInfo.hasPreviousPage hasPreviousPage: !!paginationState.after || pageInfo.hasPreviousPage
} }
: undefined; : undefined,
[paginationState, pageInfo]
);
const nextPageHref = useMemo(() => {
if (!newPageInfo?.hasNextPage || !pageInfo?.endCursor) {
return undefined;
}
return (
"?" +
stringifyQs({
...queryString,
after: pageInfo.endCursor,
before: undefined
})
);
}, [pageInfo?.endCursor, newPageInfo?.hasNextPage, queryString]);
const prevPageHref = useMemo(() => {
if (!newPageInfo?.hasPreviousPage || !pageInfo?.startCursor) {
return undefined;
}
return (
"?" +
stringifyQs({
...queryString,
after: undefined,
before: pageInfo.startCursor
})
);
}, [pageInfo?.startCursor, newPageInfo?.hasPreviousPage, queryString]);
return { return {
loadNextPage, nextPageHref,
loadPreviousPage, prevPageHref,
pageInfo: newPageInfo paginatorType: "link" as const,
...newPageInfo
}; };
} }
return paginate;
}
export default usePaginator; export default usePaginator;
export interface PaginatorContextValuesCommon {
hasNextPage?: boolean;
hasPreviousPage?: boolean;
endCursor?: string;
startCursor?: string;
}
export type PaginatorContextValues = PaginatorContextValuesCommon &
(
| {
paginatorType: "link";
nextPageHref?: string;
prevPageHref?: string;
loadNextPage?: never;
loadPreviousPage?: never;
}
| {
paginatorType: "click";
nextPageHref?: never;
prevPageHref?: never;
loadNextPage: () => void;
loadPreviousPage: () => void;
}
);
export const PaginatorContext = createContext<PaginatorContextValues | null>(
null
);
export const usePaginatorContext = () => {
const context = useContext(PaginatorContext);
if (context === null) {
throw new Error(
"usePaginatorContext must be used within a PaginatorContext.Provider"
);
}
return context;
};

View file

@ -12,7 +12,7 @@ import Skeleton from "@saleor/components/Skeleton";
import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper"; import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { MenuFragment } from "@saleor/graphql"; import { MenuFragment } from "@saleor/graphql";
import { DeleteIcon, makeStyles } from "@saleor/macaw-ui"; import { DeleteIcon, makeStyles } from "@saleor/macaw-ui";
@ -64,11 +64,8 @@ const MenuList: React.FC<MenuListProps> = props => {
isChecked, isChecked,
menus, menus,
onDelete, onDelete,
onNextPage,
onPreviousPage,
onUpdateListSettings, onUpdateListSettings,
onSort, onSort,
pageInfo,
selected, selected,
sort, sort,
toggle, toggle,
@ -121,16 +118,10 @@ const MenuList: React.FC<MenuListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
settings={settings} settings={settings}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -13,7 +13,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { buttonMessages, commonMessages } from "@saleor/intl"; import { buttonMessages, commonMessages } from "@saleor/intl";
import { getStringOrPlaceholder, maybe } from "@saleor/misc"; import { getStringOrPlaceholder, maybe } from "@saleor/misc";
@ -36,7 +37,6 @@ interface MenuListProps {
const MenuList: React.FC<MenuListProps> = ({ params }) => { const MenuList: React.FC<MenuListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const paginate = usePaginator();
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
params.ids params.ids
); );
@ -72,11 +72,11 @@ const MenuList: React.FC<MenuListProps> = ({ params }) => {
variables: queryVariables variables: queryVariables
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
maybe(() => data.menus.pageInfo), pageInfo: maybe(() => data.menus.pageInfo),
paginationState, paginationState,
params queryString: params
); });
const [menuCreate, menuCreateOpts] = useMenuCreateMutation({ const [menuCreate, menuCreateOpts] = useMenuCreateMutation({
onCompleted: data => { onCompleted: data => {
@ -126,7 +126,7 @@ const MenuList: React.FC<MenuListProps> = ({ params }) => {
const handleSort = createSortHandler(navigate, menuListUrl, params); const handleSort = createSortHandler(navigate, menuListUrl, params);
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<MenuListPage <MenuListPage
disabled={loading} disabled={loading}
menus={mapEdgesToItems(data?.menus)} menus={mapEdgesToItems(data?.menus)}
@ -139,11 +139,8 @@ const MenuList: React.FC<MenuListProps> = ({ params }) => {
}) })
) )
} }
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
onSort={handleSort} onSort={handleSort}
pageInfo={pageInfo}
isChecked={isSelected} isChecked={isSelected}
selected={listElements.length} selected={listElements.length}
sort={getSortParams(params)} sort={getSortParams(params)}
@ -242,7 +239,7 @@ const MenuList: React.FC<MenuListProps> = ({ params }) => {
/> />
</DialogContentText> </DialogContentText>
</ActionDialog> </ActionDialog>
</> </PaginatorContext.Provider>
); );
}; };
export default MenuList; export default MenuList;

View file

@ -6,7 +6,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { OrderDraftListQuery } from "@saleor/graphql"; import { OrderDraftListQuery } from "@saleor/graphql";
import { makeStyles } from "@saleor/macaw-ui"; import { makeStyles } from "@saleor/macaw-ui";
@ -63,9 +63,6 @@ export const OrderDraftList: React.FC<OrderDraftListProps> = props => {
disabled, disabled,
settings, settings,
orders, orders,
pageInfo,
onPreviousPage,
onNextPage,
onUpdateListSettings, onUpdateListSettings,
onSort, onSort,
isChecked, isChecked,
@ -148,16 +145,10 @@ export const OrderDraftList: React.FC<OrderDraftListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
settings={settings} settings={settings}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -11,7 +11,7 @@ import Money from "@saleor/components/Money";
import ResponsiveTable from "@saleor/components/ResponsiveTable"; import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { OrderListQuery } from "@saleor/graphql"; import { OrderListQuery } from "@saleor/graphql";
import { makeStyles, Pill } from "@saleor/macaw-ui"; import { makeStyles, Pill } from "@saleor/macaw-ui";
@ -82,9 +82,6 @@ export const OrderList: React.FC<OrderListProps> = props => {
disabled, disabled,
settings, settings,
orders, orders,
pageInfo,
onPreviousPage,
onNextPage,
onUpdateListSettings, onUpdateListSettings,
onSort, onSort,
sort sort
@ -183,16 +180,11 @@ export const OrderList: React.FC<OrderListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
settings={settings} settings={settings}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false} disabled={disabled}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -18,7 +18,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
import { maybe } from "@saleor/misc"; import { maybe } from "@saleor/misc";
@ -57,7 +58,6 @@ interface OrderDraftListProps {
export const OrderDraftList: React.FC<OrderDraftListProps> = ({ params }) => { export const OrderDraftList: React.FC<OrderDraftListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const paginate = usePaginator();
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
params.ids params.ids
); );
@ -165,11 +165,11 @@ export const OrderDraftList: React.FC<OrderDraftListProps> = ({ params }) => {
variables: queryVariables variables: queryVariables
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
maybe(() => data.draftOrders.pageInfo), pageInfo: maybe(() => data.draftOrders.pageInfo),
paginationState, paginationState,
params queryString: params
); });
const handleSort = createSortHandler(navigate, orderDraftListUrl, params); const handleSort = createSortHandler(navigate, orderDraftListUrl, params);
@ -181,7 +181,7 @@ export const OrderDraftList: React.FC<OrderDraftListProps> = ({ params }) => {
}); });
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<OrderDraftListPage <OrderDraftListPage
currentTab={currentTab} currentTab={currentTab}
filterOpts={getFilterOpts(params)} filterOpts={getFilterOpts(params)}
@ -197,10 +197,7 @@ export const OrderDraftList: React.FC<OrderDraftListProps> = ({ params }) => {
disabled={loading} disabled={loading}
settings={settings} settings={settings}
orders={mapEdgesToItems(data?.draftOrders)} orders={mapEdgesToItems(data?.draftOrders)}
pageInfo={pageInfo}
onAdd={() => openModal("create-order")} onAdd={() => openModal("create-order")}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onSort={handleSort} onSort={handleSort}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
isChecked={isSelected} isChecked={isSelected}
@ -273,7 +270,7 @@ export const OrderDraftList: React.FC<OrderDraftListProps> = ({ params }) => {
}) })
} }
/> />
</> </PaginatorContext.Provider>
); );
}; };

View file

@ -14,7 +14,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { getStringOrPlaceholder } from "@saleor/misc"; import { getStringOrPlaceholder } from "@saleor/misc";
import { ListViews } from "@saleor/types"; import { ListViews } from "@saleor/types";
@ -53,7 +54,6 @@ interface OrderListProps {
export const OrderList: React.FC<OrderListProps> = ({ params }) => { export const OrderList: React.FC<OrderListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const paginate = usePaginator();
const { updateListSettings, settings } = useListSettings( const { updateListSettings, settings } = useListSettings(
ListViews.ORDER_LIST ListViews.ORDER_LIST
); );
@ -140,16 +140,16 @@ export const OrderList: React.FC<OrderListProps> = ({ params }) => {
variables: queryVariables variables: queryVariables
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
data?.orders?.pageInfo, pageInfo: data?.orders?.pageInfo,
paginationState, paginationState,
params queryString: params
); });
const handleSort = createSortHandler(navigate, orderListUrl, params); const handleSort = createSortHandler(navigate, orderListUrl, params);
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<OrderListPage <OrderListPage
settings={settings} settings={settings}
currentTab={currentTab} currentTab={currentTab}
@ -157,11 +157,8 @@ export const OrderList: React.FC<OrderListProps> = ({ params }) => {
filterOpts={getFilterOpts(params, channelOpts)} filterOpts={getFilterOpts(params, channelOpts)}
limits={limitOpts.data?.shop.limits} limits={limitOpts.data?.shop.limits}
orders={mapEdgesToItems(data?.orders)} orders={mapEdgesToItems(data?.orders)}
pageInfo={pageInfo}
sort={getSortParams(params)} sort={getSortParams(params)}
onAdd={() => openModal("create-order")} onAdd={() => openModal("create-order")}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
onSort={handleSort} onSort={handleSort}
onSearchChange={handleSearchChange} onSearchChange={handleSearchChange}
@ -203,7 +200,7 @@ export const OrderList: React.FC<OrderListProps> = ({ params }) => {
} }
/> />
)} )}
</> </PaginatorContext.Provider>
); );
}; };

View file

@ -4,7 +4,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { PageTypeFragment } from "@saleor/graphql"; import { PageTypeFragment } from "@saleor/graphql";
import { makeStyles } from "@saleor/macaw-ui"; import { makeStyles } from "@saleor/macaw-ui";
@ -39,9 +39,6 @@ const PageTypeList: React.FC<PageTypeListProps> = props => {
const { const {
disabled, disabled,
pageTypes, pageTypes,
pageInfo,
onNextPage,
onPreviousPage,
onSort, onSort,
isChecked, isChecked,
selected, selected,
@ -82,14 +79,9 @@ const PageTypeList: React.FC<PageTypeListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false} disabled={disabled}
onNextPage={onNextPage}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -1,4 +1,5 @@
import { PageTypeListUrlSortField } from "@saleor/pageTypes/urls"; import { PageTypeListUrlSortField } from "@saleor/pageTypes/urls";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -28,6 +29,7 @@ const props: PageTypeListPageProps = {
storiesOf("Views / Page types / Page types list", module) storiesOf("Views / Page types / Page types list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <PageTypeListPage {...props} />) .add("default", () => <PageTypeListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<PageTypeListPage {...props} disabled={true} pageTypes={undefined} /> <PageTypeListPage {...props} disabled={true} pageTypes={undefined} />

View file

@ -13,7 +13,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { commonMessages } from "@saleor/intl"; import { commonMessages } from "@saleor/intl";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
@ -50,7 +51,6 @@ interface PageTypeListProps {
export const PageTypeList: React.FC<PageTypeListProps> = ({ params }) => { export const PageTypeList: React.FC<PageTypeListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const paginate = usePaginator();
const notify = useNotifier(); const notify = useNotifier();
const { const {
isSelected, isSelected,
@ -119,11 +119,11 @@ export const PageTypeList: React.FC<PageTypeListProps> = ({ params }) => {
handleTabChange(tabs.length + 1); handleTabChange(tabs.length + 1);
}; };
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
data?.pageTypes?.pageInfo, pageInfo: data?.pageTypes?.pageInfo,
paginationState, paginationState,
params queryString: params
); });
const handleSort = createSortHandler(navigate, pageTypeListUrl, params); const handleSort = createSortHandler(navigate, pageTypeListUrl, params);
@ -165,7 +165,7 @@ export const PageTypeList: React.FC<PageTypeListProps> = ({ params }) => {
const pageTypesData = mapEdgesToItems(data?.pageTypes); const pageTypesData = mapEdgesToItems(data?.pageTypes);
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<PageTypeListPage <PageTypeListPage
currentTab={currentTab} currentTab={currentTab}
initialSearch={params.query || ""} initialSearch={params.query || ""}
@ -177,9 +177,6 @@ export const PageTypeList: React.FC<PageTypeListProps> = ({ params }) => {
tabs={tabs.map(tab => tab.name)} tabs={tabs.map(tab => tab.name)}
disabled={loading} disabled={loading}
pageTypes={pageTypesData} pageTypes={pageTypesData}
pageInfo={pageInfo}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onSort={handleSort} onSort={handleSort}
isChecked={isSelected} isChecked={isSelected}
selected={selectedPageTypes.length} selected={selectedPageTypes.length}
@ -224,7 +221,7 @@ export const PageTypeList: React.FC<PageTypeListProps> = ({ params }) => {
onSubmit={handleTabDelete} onSubmit={handleTabDelete}
tabName={getStringOrPlaceholder(tabs[currentTab - 1]?.name)} tabName={getStringOrPlaceholder(tabs[currentTab - 1]?.name)}
/> />
</> </PaginatorContext.Provider>
); );
}; };
PageTypeList.displayName = "PageTypeList"; PageTypeList.displayName = "PageTypeList";

View file

@ -10,7 +10,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { PageFragment } from "@saleor/graphql"; import { PageFragment } from "@saleor/graphql";
import { makeStyles, Pill } from "@saleor/macaw-ui"; import { makeStyles, Pill } from "@saleor/macaw-ui";
@ -58,11 +58,8 @@ const PageList: React.FC<PageListProps> = props => {
settings, settings,
pages, pages,
disabled, disabled,
onNextPage,
pageInfo,
onSort, onSort,
onUpdateListSettings, onUpdateListSettings,
onPreviousPage,
isChecked, isChecked,
selected, selected,
sort, sort,
@ -136,16 +133,11 @@ const PageList: React.FC<PageListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
settings={settings} settings={settings}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false} disabled={disabled}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -12,7 +12,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
import { maybe } from "@saleor/misc"; import { maybe } from "@saleor/misc";
@ -39,7 +40,6 @@ interface PageListProps {
export const PageList: React.FC<PageListProps> = ({ params }) => { export const PageList: React.FC<PageListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const paginate = usePaginator();
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
params.ids params.ids
); );
@ -65,11 +65,11 @@ export const PageList: React.FC<PageListProps> = ({ params }) => {
variables: queryVariables variables: queryVariables
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
maybe(() => data.pages.pageInfo), pageInfo: maybe(() => data.pages.pageInfo),
paginationState, paginationState,
params queryString: params
); });
const [openModal, closeModal] = createDialogActionHandlers< const [openModal, closeModal] = createDialogActionHandlers<
PageListUrlDialog, PageListUrlDialog,
@ -115,14 +115,11 @@ export const PageList: React.FC<PageListProps> = ({ params }) => {
const handleSort = createSortHandler(navigate, pageListUrl, params); const handleSort = createSortHandler(navigate, pageListUrl, params);
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<PageListPage <PageListPage
disabled={loading} disabled={loading}
settings={settings} settings={settings}
pages={mapEdgesToItems(data?.pages)} pages={mapEdgesToItems(data?.pages)}
pageInfo={pageInfo}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
onSort={handleSort} onSort={handleSort}
actionDialogOpts={{ actionDialogOpts={{
@ -263,7 +260,7 @@ export const PageList: React.FC<PageListProps> = ({ params }) => {
}} }}
/> />
</ActionDialog> </ActionDialog>
</> </PaginatorContext.Provider>
); );
}; };

View file

@ -9,7 +9,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper"; import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { PermissionGroupFragment } from "@saleor/graphql"; import { PermissionGroupFragment } from "@saleor/graphql";
import { DeleteIcon, IconButton, makeStyles } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton, makeStyles } from "@saleor/macaw-ui";
@ -65,16 +65,7 @@ interface PermissionGroupListProps
} }
const PermissionGroupList: React.FC<PermissionGroupListProps> = props => { const PermissionGroupList: React.FC<PermissionGroupListProps> = props => {
const { const { disabled, permissionGroups, onDelete, onSort, sort } = props;
disabled,
permissionGroups,
pageInfo,
onDelete,
onNextPage,
onPreviousPage,
onSort,
sort
} = props;
const classes = useStyles(props); const classes = useStyles(props);
return ( return (
@ -107,14 +98,9 @@ const PermissionGroupList: React.FC<PermissionGroupListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false} disabled={disabled}
onNextPage={onNextPage}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -9,6 +9,7 @@ import PermissionGroupListPage, {
import { permissionGroups } from "@saleor/permissionGroups/fixtures"; import { permissionGroups } from "@saleor/permissionGroups/fixtures";
import { PermissionGroupListUrlSortField } from "@saleor/permissionGroups/urls"; import { PermissionGroupListUrlSortField } from "@saleor/permissionGroups/urls";
import Decorator from "@saleor/storybook/Decorator"; import Decorator from "@saleor/storybook/Decorator";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -27,6 +28,7 @@ const props: PermissionGroupListPageProps = {
storiesOf("Views / Permission Groups / Permission Group List", module) storiesOf("Views / Permission Groups / Permission Group List", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <PermissionGroupListPage {...props} />) .add("default", () => <PermissionGroupListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<PermissionGroupListPage <PermissionGroupListPage

View file

@ -8,7 +8,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { getStringOrPlaceholder } from "@saleor/misc"; import { getStringOrPlaceholder } from "@saleor/misc";
import PermissionGroupDeleteDialog from "@saleor/permissionGroups/components/PermissionGroupDeleteDialog"; import PermissionGroupDeleteDialog from "@saleor/permissionGroups/components/PermissionGroupDeleteDialog";
@ -36,7 +37,6 @@ export const PermissionGroupList: React.FC<PermissionGroupListProps> = ({
params params
}) => { }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const paginate = usePaginator();
const notify = useNotifier(); const notify = useNotifier();
const intl = useIntl(); const intl = useIntl();
const { updateListSettings, settings } = useListSettings( const { updateListSettings, settings } = useListSettings(
@ -58,11 +58,11 @@ export const PermissionGroupList: React.FC<PermissionGroupListProps> = ({
variables: queryVariables variables: queryVariables
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
data?.permissionGroups.pageInfo, pageInfo: data?.permissionGroups.pageInfo,
paginationState, paginationState,
params queryString: params
); });
const handleSort = createSortHandler( const handleSort = createSortHandler(
navigate, navigate,
@ -100,16 +100,13 @@ export const PermissionGroupList: React.FC<PermissionGroupListProps> = ({
}); });
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<PermissionGroupListPage <PermissionGroupListPage
disabled={loading} disabled={loading}
settings={settings} settings={settings}
pageInfo={pageInfo}
sort={getSortParams(params)} sort={getSortParams(params)}
permissionGroups={permissionGroups} permissionGroups={permissionGroups}
onDelete={id => openModal("remove", { id })} onDelete={id => openModal("remove", { id })}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
onSort={handleSort} onSort={handleSort}
/> />
@ -129,7 +126,7 @@ export const PermissionGroupList: React.FC<PermissionGroupListProps> = ({
open={params.action === "remove"} open={params.action === "remove"}
onClose={closeModal} onClose={closeModal}
/> />
</> </PaginatorContext.Provider>
); );
}; };

View file

@ -1,7 +1,7 @@
import { TableBody, TableCell, TableFooter, TableRow } from "@material-ui/core"; import { TableBody, TableCell, TableFooter, TableRow } from "@material-ui/core";
import ResponsiveTable from "@saleor/components/ResponsiveTable"; import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import { PluginBaseFragment } from "@saleor/graphql"; import { PluginBaseFragment } from "@saleor/graphql";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import { EditIcon, makeStyles } from "@saleor/macaw-ui"; import { EditIcon, makeStyles } from "@saleor/macaw-ui";
@ -37,12 +37,9 @@ const PluginList: React.FC<PluginListProps> = props => {
settings, settings,
plugins, plugins,
disabled, disabled,
onNextPage,
pageInfo,
sort, sort,
onSort, onSort,
onUpdateListSettings, onUpdateListSettings
onPreviousPage
} = props; } = props;
const classes = useStyles(props); const classes = useStyles(props);
const navigate = useNavigator(); const navigate = useNavigator();
@ -53,16 +50,11 @@ const PluginList: React.FC<PluginListProps> = props => {
<PluginListTableHead sort={sort} onSort={onSort} /> <PluginListTableHead sort={sort} onSort={onSort} />
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={totalColSpan} colSpan={totalColSpan}
settings={settings}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={ settings={settings}
pageInfo && !disabled ? pageInfo.hasPreviousPage : false disabled={disabled}
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -8,7 +8,8 @@ import useListSettings from "@saleor/hooks/useListSettings";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { maybe } from "@saleor/misc"; import { maybe } from "@saleor/misc";
import { ListViews } from "@saleor/types"; import { ListViews } from "@saleor/types";
@ -43,7 +44,6 @@ interface PluginsListProps {
export const PluginsList: React.FC<PluginsListProps> = ({ params }) => { export const PluginsList: React.FC<PluginsListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const paginate = usePaginator();
const { updateListSettings, settings } = useListSettings( const { updateListSettings, settings } = useListSettings(
ListViews.PLUGINS_LIST ListViews.PLUGINS_LIST
); );
@ -103,11 +103,11 @@ export const PluginsList: React.FC<PluginsListProps> = ({ params }) => {
handleTabChange(tabs.length + 1); handleTabChange(tabs.length + 1);
}; };
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
maybe(() => data.plugins.pageInfo), pageInfo: maybe(() => data.plugins.pageInfo),
paginationState, paginationState,
params queryString: params
); });
const handleSort = createSortHandler(navigate, pluginListUrl, params); const handleSort = createSortHandler(navigate, pluginListUrl, params);
const channelsSearchWithLoadMoreProps = useChannelsSearchWithLoadMore(); const channelsSearchWithLoadMoreProps = useChannelsSearchWithLoadMore();
@ -115,7 +115,7 @@ export const PluginsList: React.FC<PluginsListProps> = ({ params }) => {
const filterOpts = getFilterOpts(params, channelsSearchWithLoadMoreProps); const filterOpts = getFilterOpts(params, channelsSearchWithLoadMoreProps);
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<PluginsListPage <PluginsListPage
currentTab={currentTab} currentTab={currentTab}
disabled={loading} disabled={loading}
@ -123,14 +123,11 @@ export const PluginsList: React.FC<PluginsListProps> = ({ params }) => {
initialSearch={params.query || ""} initialSearch={params.query || ""}
settings={settings} settings={settings}
plugins={mapEdgesToItems(data?.plugins)} plugins={mapEdgesToItems(data?.plugins)}
pageInfo={pageInfo}
sort={getSortParams(params)} sort={getSortParams(params)}
tabs={getFilterTabs().map(tab => tab.name)} tabs={getFilterTabs().map(tab => tab.name)}
onAll={resetFilters} onAll={resetFilters}
onFilterChange={changeFilters} onFilterChange={changeFilters}
onSearchChange={handleSearchChange} onSearchChange={handleSearchChange}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onSort={handleSort} onSort={handleSort}
onTabSave={() => openModal("save-search")} onTabSave={() => openModal("save-search")}
onTabDelete={() => openModal("delete-search")} onTabDelete={() => openModal("delete-search")}
@ -150,7 +147,7 @@ export const PluginsList: React.FC<PluginsListProps> = ({ params }) => {
onSubmit={handleFilterTabDelete} onSubmit={handleFilterTabDelete}
tabName={maybe(() => tabs[currentTab - 1].name, "...")} tabName={maybe(() => tabs[currentTab - 1].name, "...")}
/> />
</> </PaginatorContext.Provider>
); );
}; };

View file

@ -10,7 +10,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { ProductTypeFragment } from "@saleor/graphql"; import { ProductTypeFragment } from "@saleor/graphql";
import { makeStyles } from "@saleor/macaw-ui"; import { makeStyles } from "@saleor/macaw-ui";
@ -61,9 +61,6 @@ const ProductTypeList: React.FC<ProductTypeListProps> = props => {
const { const {
disabled, disabled,
productTypes, productTypes,
pageInfo,
onNextPage,
onPreviousPage,
onSort, onSort,
isChecked, isChecked,
selected, selected,
@ -127,15 +124,7 @@ const ProductTypeList: React.FC<ProductTypeListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext colSpan={numberOfColumns} />
colSpan={numberOfColumns}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/>
</TableRow> </TableRow>
</TableFooter> </TableFooter>
<TableBody> <TableBody>

View file

@ -12,7 +12,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { commonMessages } from "@saleor/intl"; import { commonMessages } from "@saleor/intl";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
@ -53,7 +54,6 @@ interface ProductTypeListProps {
export const ProductTypeList: React.FC<ProductTypeListProps> = ({ params }) => { export const ProductTypeList: React.FC<ProductTypeListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const paginate = usePaginator();
const { const {
isSelected, isSelected,
listElements: selectedProductTypes, listElements: selectedProductTypes,
@ -123,11 +123,11 @@ export const ProductTypeList: React.FC<ProductTypeListProps> = ({ params }) => {
handleTabChange(tabs.length + 1); handleTabChange(tabs.length + 1);
}; };
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
maybe(() => data.productTypes.pageInfo), pageInfo: maybe(() => data.productTypes.pageInfo),
paginationState, paginationState,
params queryString: params
); });
const handleSort = createSortHandler(navigate, productTypeListUrl, params); const handleSort = createSortHandler(navigate, productTypeListUrl, params);
@ -169,7 +169,7 @@ export const ProductTypeList: React.FC<ProductTypeListProps> = ({ params }) => {
}); });
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<ProductTypeListPage <ProductTypeListPage
currentTab={currentTab} currentTab={currentTab}
filterOpts={getFilterOpts(params)} filterOpts={getFilterOpts(params)}
@ -183,9 +183,6 @@ export const ProductTypeList: React.FC<ProductTypeListProps> = ({ params }) => {
tabs={tabs.map(tab => tab.name)} tabs={tabs.map(tab => tab.name)}
disabled={loading} disabled={loading}
productTypes={productTypesData} productTypes={productTypesData}
pageInfo={pageInfo}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onSort={handleSort} onSort={handleSort}
isChecked={isSelected} isChecked={isSelected}
selected={selectedProductTypes.length} selected={selectedProductTypes.length}
@ -229,7 +226,7 @@ export const ProductTypeList: React.FC<ProductTypeListProps> = ({ params }) => {
onSubmit={handleTabDelete} onSubmit={handleTabDelete}
tabName={maybe(() => tabs[currentTab - 1].name, "...")} tabName={maybe(() => tabs[currentTab - 1].name, "...")}
/> />
</> </PaginatorContext.Provider>
); );
}; };
ProductTypeList.displayName = "ProductTypeList"; ProductTypeList.displayName = "ProductTypeList";

View file

@ -19,7 +19,7 @@ import TableCellAvatar from "@saleor/components/TableCellAvatar";
import { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar/Avatar"; import { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar/Avatar";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import TooltipTableCellHeader from "@saleor/components/TooltipTableCellHeader"; import TooltipTableCellHeader from "@saleor/components/TooltipTableCellHeader";
import { commonTooltipMessages } from "@saleor/components/TooltipTableCellHeader/messages"; import { commonTooltipMessages } from "@saleor/components/TooltipTableCellHeader/messages";
@ -137,15 +137,12 @@ export const ProductList: React.FC<ProductListProps> = props => {
disabled, disabled,
isChecked, isChecked,
gridAttributes, gridAttributes,
pageInfo,
products, products,
selected, selected,
sort, sort,
toggle, toggle,
toggleAll, toggleAll,
toolbar, toolbar,
onNextPage,
onPreviousPage,
onUpdateListSettings, onUpdateListSettings,
onSort, onSort,
selectedChannelId, selectedChannelId,
@ -323,16 +320,10 @@ export const ProductList: React.FC<ProductListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
settings={settings} settings={settings}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -1,5 +1,6 @@
import { ProductListAttributeFragment } from "@saleor/graphql"; import { ProductListAttributeFragment } from "@saleor/graphql";
import Decorator from "@saleor/storybook/Decorator"; import Decorator from "@saleor/storybook/Decorator";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -85,6 +86,7 @@ const attributes: ProductListAttributeFragment[] = [
storiesOf("Views / Products / Product list / Attribute display", module) storiesOf("Views / Products / Product list / Attribute display", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => ( .add("default", () => (
<ProductListAttribute <ProductListAttribute
attribute="attribute:3" attribute="attribute:3"

View file

@ -34,7 +34,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { commonMessages } from "@saleor/intl"; import { commonMessages } from "@saleor/intl";
import { DeleteIcon, IconButton } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton } from "@saleor/macaw-ui";
@ -86,7 +87,6 @@ interface ProductListProps {
export const ProductList: React.FC<ProductListProps> = ({ params }) => { export const ProductList: React.FC<ProductListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const paginate = usePaginator();
const { queue } = useBackgroundTask(); const { queue } = useBackgroundTask();
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
params.ids params.ids
@ -341,14 +341,14 @@ export const ProductList: React.FC<ProductListProps> = ({ params }) => {
channelOpts channelOpts
); );
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
data?.products?.pageInfo, pageInfo: data?.products?.pageInfo,
paginationState, paginationState,
params queryString: params
); });
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<ProductListPage <ProductListPage
activeAttributeSortId={params.attributeId} activeAttributeSortId={params.attributeId}
sort={{ sort={{
@ -387,10 +387,7 @@ export const ProductList: React.FC<ProductListProps> = ({ params }) => {
products={mapEdgesToItems(data?.products)} products={mapEdgesToItems(data?.products)}
onColumnQueryChange={availableInGridAttributesOpts.search} onColumnQueryChange={availableInGridAttributesOpts.search}
onFetchMore={availableInGridAttributesOpts.loadMore} onFetchMore={availableInGridAttributesOpts.loadMore}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
pageInfo={pageInfo}
onAll={resetFilters} onAll={resetFilters}
toolbar={ toolbar={
<IconButton <IconButton
@ -497,7 +494,7 @@ export const ProductList: React.FC<ProductListProps> = ({ params }) => {
onSubmit={handleFilterTabDelete} onSubmit={handleFilterTabDelete}
tabName={maybe(() => tabs[currentTab - 1].name, "...")} tabName={maybe(() => tabs[currentTab - 1].name, "...")}
/> />
</> </PaginatorContext.Provider>
); );
}; };
export default ProductList; export default ProductList;

View file

@ -1,5 +1,6 @@
import { shippingZone } from "@saleor/shipping/fixtures"; import { shippingZone } from "@saleor/shipping/fixtures";
import Decorator from "@saleor/storybook//Decorator"; import Decorator from "@saleor/storybook//Decorator";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { mapEdgesToItems } from "@saleor/utils/maps"; import { mapEdgesToItems } from "@saleor/utils/maps";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -15,14 +16,8 @@ const products = mapEdgesToItems(
const props: ShippingMethodProductsProps = { const props: ShippingMethodProductsProps = {
disabled: false, disabled: false,
isChecked: () => undefined, isChecked: () => undefined,
onNextPage: () => undefined,
onPreviousPage: () => undefined,
onProductAssign: () => undefined, onProductAssign: () => undefined,
onProductUnassign: () => undefined, onProductUnassign: () => undefined,
pageInfo: {
hasNextPage: false,
hasPreviousPage: false
},
products, products,
selected: products.length, selected: products.length,
toggle: () => undefined, toggle: () => undefined,
@ -32,4 +27,5 @@ const props: ShippingMethodProductsProps = {
storiesOf("Shipping / ShippingMethodProducts", module) storiesOf("Shipping / ShippingMethodProducts", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <ShippingMethodProducts {...props} />); .add("default", () => <ShippingMethodProducts {...props} />);

View file

@ -13,7 +13,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TableCellAvatar from "@saleor/components/TableCellAvatar"; import TableCellAvatar from "@saleor/components/TableCellAvatar";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import { ShippingZoneQuery } from "@saleor/graphql"; import { ShippingZoneQuery } from "@saleor/graphql";
import { DeleteIcon, IconButton, makeStyles } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton, makeStyles } from "@saleor/macaw-ui";
import { renderCollection } from "@saleor/misc"; import { renderCollection } from "@saleor/misc";
@ -58,10 +58,7 @@ const numberOfColumns = 3;
const ShippingMethodProducts: React.FC<ShippingMethodProductsProps> = props => { const ShippingMethodProducts: React.FC<ShippingMethodProductsProps> = props => {
const { const {
disabled, disabled,
pageInfo,
products, products,
onNextPage,
onPreviousPage,
onProductAssign, onProductAssign,
onProductUnassign, onProductUnassign,
isChecked, isChecked,
@ -112,16 +109,9 @@ const ShippingMethodProducts: React.FC<ShippingMethodProductsProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
hasNextPage={ disabled={disabled}
pageInfo && !disabled ? pageInfo.hasNextPage : false
}
onNextPage={onNextPage}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -1,6 +1,7 @@
import { ShippingMethodTypeEnum } from "@saleor/graphql"; import { ShippingMethodTypeEnum } from "@saleor/graphql";
import { shippingZone } from "@saleor/shipping/fixtures"; import { shippingZone } from "@saleor/shipping/fixtures";
import Decorator from "@saleor/storybook//Decorator"; import Decorator from "@saleor/storybook//Decorator";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -47,11 +48,9 @@ const props: ShippingZoneRatesPageProps = {
isChecked: () => undefined, isChecked: () => undefined,
onChannelsChange: () => undefined, onChannelsChange: () => undefined,
onDelete: () => undefined, onDelete: () => undefined,
onNextPage: () => undefined,
onPostalCodeAssign: () => undefined, onPostalCodeAssign: () => undefined,
onPostalCodeInclusionChange: () => undefined, onPostalCodeInclusionChange: () => undefined,
onPostalCodeUnassign: () => undefined, onPostalCodeUnassign: () => undefined,
onPreviousPage: () => undefined,
onProductAssign: () => undefined, onProductAssign: () => undefined,
onProductUnassign: () => undefined, onProductUnassign: () => undefined,
onSubmit: () => undefined, onSubmit: () => undefined,
@ -70,6 +69,7 @@ const props: ShippingZoneRatesPageProps = {
storiesOf("Views / Shipping / Shipping rate", module) storiesOf("Views / Shipping / Shipping rate", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("create price rate", () => <ShippingZoneRatesPage {...props} />) .add("create price rate", () => <ShippingZoneRatesPage {...props} />)
.add("create weight rate", () => ( .add("create weight rate", () => (
<ShippingZoneRatesPage {...props} variant={ShippingMethodTypeEnum.WEIGHT} /> <ShippingZoneRatesPage {...props} variant={ShippingMethodTypeEnum.WEIGHT} />

View file

@ -12,7 +12,7 @@ import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper"; import { TableButtonWrapper } from "@saleor/components/TableButtonWrapper/TableButtonWrapper";
import TableHead from "@saleor/components/TableHead"; import TableHead from "@saleor/components/TableHead";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { ShippingZoneFragment } from "@saleor/graphql"; import { ShippingZoneFragment } from "@saleor/graphql";
import { DeleteIcon, IconButton, makeStyles } from "@saleor/macaw-ui"; import { DeleteIcon, IconButton, makeStyles } from "@saleor/macaw-ui";
@ -54,11 +54,8 @@ const ShippingZonesList: React.FC<ShippingZonesListProps> = props => {
const { const {
disabled, disabled,
settings, settings,
onNextPage,
onPreviousPage,
onRemove, onRemove,
onUpdateListSettings, onUpdateListSettings,
pageInfo,
shippingZones, shippingZones,
isChecked, isChecked,
selected, selected,
@ -118,16 +115,11 @@ const ShippingZonesList: React.FC<ShippingZonesListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
settings={settings} settings={settings}
hasNextPage={pageInfo && !disabled ? pageInfo.hasNextPage : false} disabled={disabled}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : false
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -25,6 +25,7 @@ import useLocalPaginator, {
} from "@saleor/hooks/useLocalPaginator"; } from "@saleor/hooks/useLocalPaginator";
import useNavigator from "@saleor/hooks/useNavigator"; import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { PaginatorContext } from "@saleor/hooks/usePaginator";
import { commonMessages, sectionNames } from "@saleor/intl"; import { commonMessages, sectionNames } from "@saleor/intl";
import { import {
getById, getById,
@ -107,7 +108,7 @@ export const RateUpdate: React.FC<RateUpdateProps> = ({
[] []
); );
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const { pageInfo, ...paginationValues } = paginate(
rate?.excludedProducts.pageInfo, rate?.excludedProducts.pageInfo,
paginationState paginationState
); );
@ -314,7 +315,7 @@ export const RateUpdate: React.FC<RateUpdateProps> = ({
}; };
return ( return (
<> <PaginatorContext.Provider value={{ ...pageInfo, ...paginationValues }}>
<WindowTitle title={intl.formatMessage(sectionNames.shipping)} /> <WindowTitle title={intl.formatMessage(sectionNames.shipping)} />
{!!allChannels?.length && ( {!!allChannels?.length && (
<ChannelsAvailabilityDialog <ChannelsAvailabilityDialog
@ -397,9 +398,6 @@ export const RateUpdate: React.FC<RateUpdateProps> = ({
selected={listElements.length} selected={listElements.length}
toggle={toggle} toggle={toggle}
toggleAll={toggleAll} toggleAll={toggleAll}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
pageInfo={pageInfo}
toolbar={ toolbar={
<Button onClick={() => openModal("unassign-product")}> <Button onClick={() => openModal("unassign-product")}>
<FormattedMessage <FormattedMessage
@ -420,7 +418,7 @@ export const RateUpdate: React.FC<RateUpdateProps> = ({
onSubmit={code => onPostalCodeAssign(code)} onSubmit={code => onPostalCodeAssign(code)}
open={params.action === "add-range"} open={params.action === "add-range"}
/> />
</> </PaginatorContext.Provider>
); );
}; };

View file

@ -13,7 +13,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import useShop from "@saleor/hooks/useShop"; import useShop from "@saleor/hooks/useShop";
import { commonMessages } from "@saleor/intl"; import { commonMessages } from "@saleor/intl";
@ -46,7 +47,6 @@ export const ShippingZonesList: React.FC<ShippingZonesListProps> = ({
}) => { }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const paginate = usePaginator();
const shop = useShop(); const shop = useShop();
const { user } = useUser(); const { user } = useUser();
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions( const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
@ -126,14 +126,14 @@ export const ShippingZonesList: React.FC<ShippingZonesListProps> = ({
} }
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
maybe(() => data.shippingZones.pageInfo), pageInfo: maybe(() => data.shippingZones.pageInfo),
paginationState, paginationState,
params queryString: params
); });
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<ShippingZonesListPage <ShippingZonesListPage
defaultWeightUnit={shop?.defaultWeightUnit} defaultWeightUnit={shop?.defaultWeightUnit}
settings={settings} settings={settings}
@ -143,10 +143,7 @@ export const ShippingZonesList: React.FC<ShippingZonesListProps> = ({
updateDefaultWeightUnitOpts.loading updateDefaultWeightUnitOpts.loading
} }
shippingZones={mapEdgesToItems(data?.shippingZones)} shippingZones={mapEdgesToItems(data?.shippingZones)}
pageInfo={pageInfo}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onRemove={id => onRemove={id =>
openModal("remove", { openModal("remove", {
id id
@ -246,7 +243,7 @@ export const ShippingZonesList: React.FC<ShippingZonesListProps> = ({
/> />
</DialogContentText> </DialogContentText>
</ActionDialog> </ActionDialog>
</> </PaginatorContext.Provider>
); );
}; };
ShippingZonesList.displayName = "ShippingZonesList"; ShippingZonesList.displayName = "ShippingZonesList";

View file

@ -9,7 +9,7 @@ import {
import ResponsiveTable from "@saleor/components/ResponsiveTable"; import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TableCellHeader from "@saleor/components/TableCellHeader"; import TableCellHeader from "@saleor/components/TableCellHeader";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { StaffListQuery } from "@saleor/graphql"; import { StaffListQuery } from "@saleor/graphql";
import { makeStyles } from "@saleor/macaw-ui"; import { makeStyles } from "@saleor/macaw-ui";
@ -82,11 +82,8 @@ const StaffList: React.FC<StaffListProps> = props => {
const { const {
settings, settings,
disabled, disabled,
onNextPage,
onPreviousPage,
onUpdateListSettings, onUpdateListSettings,
onSort, onSort,
pageInfo,
sort, sort,
staffMembers staffMembers
} = props; } = props;
@ -132,18 +129,11 @@ const StaffList: React.FC<StaffListProps> = props => {
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
disabled={disabled}
settings={settings} settings={settings}
hasNextPage={
pageInfo && !disabled ? pageInfo.hasNextPage : undefined
}
onNextPage={onNextPage}
onUpdateListSettings={onUpdateListSettings} onUpdateListSettings={onUpdateListSettings}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : undefined
}
onPreviousPage={onPreviousPage}
/> />
</TableRow> </TableRow>
</TableFooter> </TableFooter>

View file

@ -11,6 +11,7 @@ import { StaffMemberStatus } from "@saleor/graphql";
import { staffMembers } from "@saleor/staff/fixtures"; import { staffMembers } from "@saleor/staff/fixtures";
import { StaffListUrlSortField } from "@saleor/staff/urls"; import { StaffListUrlSortField } from "@saleor/staff/urls";
import Decorator from "@saleor/storybook/Decorator"; import Decorator from "@saleor/storybook/Decorator";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -39,6 +40,7 @@ const props: StaffListPageProps = {
storiesOf("Views / Staff / Staff members", module) storiesOf("Views / Staff / Staff members", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <StaffListPage {...props} />) .add("default", () => <StaffListPage {...props} />)
.add("when loading", () => ( .add("when loading", () => (
<StaffListPage {...props} disabled={true} staffMembers={undefined} /> <StaffListPage {...props} disabled={true} staffMembers={undefined} />

View file

@ -11,7 +11,8 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import { usePaginationReset } from "@saleor/hooks/usePaginationReset"; import { usePaginationReset } from "@saleor/hooks/usePaginationReset";
import usePaginator, { import usePaginator, {
createPaginationState createPaginationState,
PaginatorContext
} from "@saleor/hooks/usePaginator"; } from "@saleor/hooks/usePaginator";
import { commonMessages } from "@saleor/intl"; import { commonMessages } from "@saleor/intl";
import { getStringOrPlaceholder } from "@saleor/misc"; import { getStringOrPlaceholder } from "@saleor/misc";
@ -55,7 +56,6 @@ interface StaffListProps {
export const StaffList: React.FC<StaffListProps> = ({ params }) => { export const StaffList: React.FC<StaffListProps> = ({ params }) => {
const navigate = useNavigator(); const navigate = useNavigator();
const notify = useNotifier(); const notify = useNotifier();
const paginate = usePaginator();
const { updateListSettings, settings } = useListSettings( const { updateListSettings, settings } = useListSettings(
ListViews.STAFF_MEMBERS_LIST ListViews.STAFF_MEMBERS_LIST
); );
@ -94,11 +94,11 @@ export const StaffList: React.FC<StaffListProps> = ({ params }) => {
} }
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
staffQueryData?.staffUsers.pageInfo, pageInfo: staffQueryData?.staffUsers.pageInfo,
paginationState, paginationState,
params queryString: params
); });
const handleSort = createSortHandler(navigate, staffListUrl, params); const handleSort = createSortHandler(navigate, staffListUrl, params);
@ -167,7 +167,7 @@ export const StaffList: React.FC<StaffListProps> = ({ params }) => {
}); });
return ( return (
<> <PaginatorContext.Provider value={paginationValues}>
<StaffListPage <StaffListPage
currentTab={currentTab} currentTab={currentTab}
filterOpts={getFilterOpts(params)} filterOpts={getFilterOpts(params)}
@ -182,12 +182,9 @@ export const StaffList: React.FC<StaffListProps> = ({ params }) => {
disabled={loading || addStaffMemberData.loading || limitOpts.loading} disabled={loading || addStaffMemberData.loading || limitOpts.loading}
limits={limitOpts.data?.shop.limits} limits={limitOpts.data?.shop.limits}
settings={settings} settings={settings}
pageInfo={pageInfo}
sort={getSortParams(params)} sort={getSortParams(params)}
staffMembers={mapEdgesToItems(staffQueryData?.staffUsers)} staffMembers={mapEdgesToItems(staffQueryData?.staffUsers)}
onAdd={() => openModal("add")} onAdd={() => openModal("add")}
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
onUpdateListSettings={updateListSettings} onUpdateListSettings={updateListSettings}
onSort={handleSort} onSort={handleSort}
/> />
@ -222,7 +219,7 @@ export const StaffList: React.FC<StaffListProps> = ({ params }) => {
onSubmit={handleTabDelete} onSubmit={handleTabDelete}
tabName={getStringOrPlaceholder(tabs[currentTab - 1]?.name)} tabName={getStringOrPlaceholder(tabs[currentTab - 1]?.name)}
/> />
</> </PaginatorContext.Provider>
); );
}; };

View file

@ -0,0 +1,9 @@
import { paginatorContextValues } from "@saleor/fixtures";
import { PaginatorContext } from "@saleor/hooks/usePaginator";
import React from "react";
export const PaginatorContextDecorator = storyFn => (
<PaginatorContext.Provider value={paginatorContextValues}>
{storyFn()}
</PaginatorContext.Provider>
);

File diff suppressed because it is too large Load diff

View file

@ -11,6 +11,7 @@ import {
sortPageProps, sortPageProps,
tabPageProps tabPageProps
} from "@saleor/fixtures"; } from "@saleor/fixtures";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -50,6 +51,7 @@ const props: AttributeListPageProps = {
storiesOf("Views / Attributes / Attribute list", module) storiesOf("Views / Attributes / Attribute list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <AttributeListPage {...props} />) .add("default", () => <AttributeListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<AttributeListPage {...props} attributes={undefined} disabled={true} /> <AttributeListPage {...props} attributes={undefined} disabled={true} />

View file

@ -10,6 +10,7 @@ import {
sortPageProps, sortPageProps,
tabPageProps tabPageProps
} from "@saleor/fixtures"; } from "@saleor/fixtures";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -31,6 +32,7 @@ const categoryTableProps: CategoryTableProps = {
storiesOf("Views / Categories / Category list", module) storiesOf("Views / Categories / Category list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <CategoryListPage {...categoryTableProps} />) .add("default", () => <CategoryListPage {...categoryTableProps} />)
.add("loading", () => ( .add("loading", () => (
<CategoryListPage {...categoryTableProps} categories={undefined} /> <CategoryListPage {...categoryTableProps} categories={undefined} />

View file

@ -1,5 +1,6 @@
import placeholderImage from "@assets/images/placeholder255x255.png"; import placeholderImage from "@assets/images/placeholder255x255.png";
import { ProductErrorCode } from "@saleor/graphql"; import { ProductErrorCode } from "@saleor/graphql";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { mapEdgesToItems } from "@saleor/utils/maps"; import { mapEdgesToItems } from "@saleor/utils/maps";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -25,13 +26,7 @@ const updateProps: Omit<CategoryUpdatePageProps, "classes"> = {
onDelete: () => undefined, onDelete: () => undefined,
onImageDelete: () => undefined, onImageDelete: () => undefined,
onImageUpload: () => undefined, onImageUpload: () => undefined,
onNextPage: undefined,
onPreviousPage: undefined,
onSubmit: () => undefined, onSubmit: () => undefined,
pageInfo: {
hasNextPage: true,
hasPreviousPage: true
},
productListToolbar: null, productListToolbar: null,
products: mapEdgesToItems(category.products), products: mapEdgesToItems(category.products),
saveButtonBarState: "default", saveButtonBarState: "default",
@ -42,6 +37,7 @@ const updateProps: Omit<CategoryUpdatePageProps, "classes"> = {
storiesOf("Views / Categories / Update category", module) storiesOf("Views / Categories / Update category", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <CategoryUpdatePage {...updateProps} />) .add("default", () => <CategoryUpdatePage {...updateProps} />)
.add("products", () => ( .add("products", () => (
<CategoryUpdatePage <CategoryUpdatePage

View file

@ -2,6 +2,7 @@ import placeholderCollectionImage from "@assets/images/block1.jpg";
import placeholderProductImage from "@assets/images/placeholder60x60.png"; import placeholderProductImage from "@assets/images/placeholder60x60.png";
import { createCollectionChannelsData } from "@saleor/channels/utils"; import { createCollectionChannelsData } from "@saleor/channels/utils";
import { CollectionErrorCode } from "@saleor/graphql"; import { CollectionErrorCode } from "@saleor/graphql";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -40,6 +41,7 @@ const props: Omit<CollectionDetailsPageProps, "classes"> = {
storiesOf("Views / Collections / Collection detailsCollection details", module) storiesOf("Views / Collections / Collection detailsCollection details", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <CollectionDetailsPage {...props} />) .add("default", () => <CollectionDetailsPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<CollectionDetailsPage {...props} collection={undefined} disabled={true} /> <CollectionDetailsPage {...props} collection={undefined} disabled={true} />

View file

@ -1,4 +1,5 @@
import { CollectionListUrlSortField } from "@saleor/collections/urls"; import { CollectionListUrlSortField } from "@saleor/collections/urls";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -35,6 +36,7 @@ const props: CollectionListPageProps = {
storiesOf("Views / Collections / Collection list", module) storiesOf("Views / Collections / Collection list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <CollectionListPage {...props} />) .add("default", () => <CollectionListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<CollectionListPage {...props} collections={undefined} disabled={true} /> <CollectionListPage {...props} collections={undefined} disabled={true} />

View file

@ -1,4 +1,5 @@
import { CustomerListUrlSortField } from "@saleor/customers/urls"; import { CustomerListUrlSortField } from "@saleor/customers/urls";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -55,6 +56,7 @@ const CustomerListPage = props => (
storiesOf("Views / Customers / Customer list", module) storiesOf("Views / Customers / Customer list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <CustomerListPage {...props} />) .add("default", () => <CustomerListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<CustomerListPage {...props} disabled={true} customers={undefined} /> <CustomerListPage {...props} disabled={true} customers={undefined} />

View file

@ -1,6 +1,7 @@
import { channelsList } from "@saleor/channels/fixtures"; import { channelsList } from "@saleor/channels/fixtures";
import { createSaleChannels } from "@saleor/channels/utils"; import { createSaleChannels } from "@saleor/channels/utils";
import { DiscountErrorCode } from "@saleor/graphql"; import { DiscountErrorCode } from "@saleor/graphql";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -27,8 +28,6 @@ const props: SaleDetailsPageProps = {
onChannelsChange: () => undefined, onChannelsChange: () => undefined,
onCollectionAssign: () => undefined, onCollectionAssign: () => undefined,
onCollectionUnassign: () => undefined, onCollectionUnassign: () => undefined,
onNextPage: () => undefined,
onPreviousPage: () => undefined,
onProductAssign: () => undefined, onProductAssign: () => undefined,
onProductUnassign: () => undefined, onProductUnassign: () => undefined,
onVariantAssign: () => undefined, onVariantAssign: () => undefined,
@ -37,10 +36,6 @@ const props: SaleDetailsPageProps = {
onSubmit: () => undefined, onSubmit: () => undefined,
onTabClick: () => undefined, onTabClick: () => undefined,
openChannelsModal: () => undefined, openChannelsModal: () => undefined,
pageInfo: {
hasNextPage: true,
hasPreviousPage: false
},
productListToolbar: null, productListToolbar: null,
variantListToolbar: null, variantListToolbar: null,
sale, sale,
@ -51,6 +46,7 @@ const props: SaleDetailsPageProps = {
storiesOf("Views / Discounts / Sale details", module) storiesOf("Views / Discounts / Sale details", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <SaleDetailsPage {...props} />) .add("default", () => <SaleDetailsPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<SaleDetailsPage {...props} sale={undefined} disabled={true} /> <SaleDetailsPage {...props} sale={undefined} disabled={true} />

View file

@ -1,5 +1,6 @@
import { SaleListUrlSortField } from "@saleor/discounts/urls"; import { SaleListUrlSortField } from "@saleor/discounts/urls";
import { DiscountStatusEnum, DiscountValueTypeEnum } from "@saleor/graphql"; import { DiscountStatusEnum, DiscountValueTypeEnum } from "@saleor/graphql";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -59,6 +60,7 @@ const props: SaleListPageProps = {
storiesOf("Views / Discounts / Sale list", module) storiesOf("Views / Discounts / Sale list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <SaleListPage {...props} />) .add("default", () => <SaleListPage {...props} />)
.add("loading", () => <SaleListPage {...props} sales={undefined} />) .add("loading", () => <SaleListPage {...props} sales={undefined} />)
.add("no data", () => <SaleListPage {...props} sales={[]} />) .add("no data", () => <SaleListPage {...props} sales={[]} />)

View file

@ -1,6 +1,7 @@
import { channelsList } from "@saleor/channels/fixtures"; import { channelsList } from "@saleor/channels/fixtures";
import { createChannelsDataWithDiscountPrice } from "@saleor/channels/utils"; import { createChannelsDataWithDiscountPrice } from "@saleor/channels/utils";
import { DiscountErrorCode } from "@saleor/graphql"; import { DiscountErrorCode } from "@saleor/graphql";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -48,6 +49,7 @@ const props: VoucherDetailsPageProps = {
storiesOf("Views / Discounts / Voucher details", module) storiesOf("Views / Discounts / Voucher details", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <VoucherDetailsPage {...props} />) .add("default", () => <VoucherDetailsPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<VoucherDetailsPage {...props} disabled={true} voucher={undefined} /> <VoucherDetailsPage {...props} disabled={true} voucher={undefined} />

View file

@ -1,5 +1,6 @@
import { VoucherListUrlSortField } from "@saleor/discounts/urls"; import { VoucherListUrlSortField } from "@saleor/discounts/urls";
import { DiscountStatusEnum, VoucherDiscountType } from "@saleor/graphql"; import { DiscountStatusEnum, VoucherDiscountType } from "@saleor/graphql";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -68,6 +69,7 @@ const props: VoucherListPageProps = {
storiesOf("Views / Discounts / Voucher list", module) storiesOf("Views / Discounts / Voucher list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <VoucherListPage {...props} />) .add("default", () => <VoucherListPage {...props} />)
.add("loading", () => <VoucherListPage {...props} vouchers={undefined} />) .add("loading", () => <VoucherListPage {...props} vouchers={undefined} />)
.add("no data", () => <VoucherListPage {...props} vouchers={[]} />) .add("no data", () => <VoucherListPage {...props} vouchers={[]} />)

View file

@ -1,4 +1,5 @@
import { MenuListUrlSortField } from "@saleor/navigation/urls"; import { MenuListUrlSortField } from "@saleor/navigation/urls";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -27,6 +28,7 @@ const props: MenuListPageProps = {
storiesOf("Views / Navigation / Menu list", module) storiesOf("Views / Navigation / Menu list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <MenuListPage {...props} />) .add("default", () => <MenuListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<MenuListPage {...props} disabled={true} menus={undefined} /> <MenuListPage {...props} disabled={true} menus={undefined} />

View file

@ -1,4 +1,5 @@
import { OrderDraftListUrlSortField } from "@saleor/orders/urls"; import { OrderDraftListUrlSortField } from "@saleor/orders/urls";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -49,6 +50,7 @@ const props: OrderDraftListPageProps = {
storiesOf("Views / Orders / Draft order list", module) storiesOf("Views / Orders / Draft order list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <OrderDraftListPage {...props} />) .add("default", () => <OrderDraftListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<OrderDraftListPage {...props} disabled orders={undefined} /> <OrderDraftListPage {...props} disabled orders={undefined} />

View file

@ -4,6 +4,7 @@ import OrderListPage, {
OrderListPageProps OrderListPageProps
} from "@saleor/orders/components/OrderListPage"; } from "@saleor/orders/components/OrderListPage";
import { OrderListUrlSortField } from "@saleor/orders/urls"; import { OrderListUrlSortField } from "@saleor/orders/urls";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -83,6 +84,7 @@ const props: OrderListPageProps = {
storiesOf("Views / Orders / Order list", module) storiesOf("Views / Orders / Order list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <OrderListPage {...props} />) .add("default", () => <OrderListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<OrderListPage <OrderListPage

View file

@ -1,4 +1,5 @@
import { PageListUrlSortField } from "@saleor/pages/urls"; import { PageListUrlSortField } from "@saleor/pages/urls";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -33,6 +34,7 @@ const props: PageListPageProps = {
storiesOf("Views / Pages / Page list", module) storiesOf("Views / Pages / Page list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <PageListPage {...props} />) .add("default", () => <PageListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<PageListPage {...props} disabled={true} pages={undefined} /> <PageListPage {...props} disabled={true} pages={undefined} />

View file

@ -1,5 +1,6 @@
import { PluginConfigurationType } from "@saleor/graphql"; import { PluginConfigurationType } from "@saleor/graphql";
import { PluginListUrlSortField } from "@saleor/plugins/urls"; import { PluginListUrlSortField } from "@saleor/plugins/urls";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -52,6 +53,7 @@ const props: PluginsListPageProps = {
storiesOf("Views / Plugins / Plugin list", module) storiesOf("Views / Plugins / Plugin list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <PluginsListPage {...props} />) .add("default", () => <PluginsListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<PluginsListPage {...props} disabled={true} plugins={undefined} /> <PluginsListPage {...props} disabled={true} plugins={undefined} />

View file

@ -1,5 +1,6 @@
import { ProductTypeConfigurable, ProductTypeEnum } from "@saleor/graphql"; import { ProductTypeConfigurable, ProductTypeEnum } from "@saleor/graphql";
import { ProductTypeListUrlSortField } from "@saleor/productTypes/urls"; import { ProductTypeListUrlSortField } from "@saleor/productTypes/urls";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -43,6 +44,7 @@ const props: ProductTypeListPageProps = {
storiesOf("Views / Product types / Product types list", module) storiesOf("Views / Product types / Product types list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <ProductTypeListPage {...props} />) .add("default", () => <ProductTypeListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<ProductTypeListPage {...props} disabled={true} productTypes={undefined} /> <ProductTypeListPage {...props} disabled={true} productTypes={undefined} />

View file

@ -4,6 +4,7 @@ import { products as productListFixture } from "@saleor/products/fixtures";
import { ProductListUrlSortField } from "@saleor/products/urls"; import { ProductListUrlSortField } from "@saleor/products/urls";
import { productListFilterOpts } from "@saleor/products/views/ProductList/fixtures"; import { productListFilterOpts } from "@saleor/products/views/ProductList/fixtures";
import { attributes } from "@saleor/productTypes/fixtures"; import { attributes } from "@saleor/productTypes/fixtures";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { ListViews } from "@saleor/types"; import { ListViews } from "@saleor/types";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -57,6 +58,7 @@ const props: ProductListPageProps = {
storiesOf("Views / Products / Product list", module) storiesOf("Views / Products / Product list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <ProductListPage {...props} />) .add("default", () => <ProductListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<ProductListPage <ProductListPage

View file

@ -1,4 +1,5 @@
import { WeightUnitsEnum } from "@saleor/graphql"; import { WeightUnitsEnum } from "@saleor/graphql";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -25,6 +26,7 @@ const props: ShippingZonesListPageProps = {
storiesOf("Views / Shipping / Shipping zones list", module) storiesOf("Views / Shipping / Shipping zones list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => <ShippingZonesListPage {...props} />) .add("default", () => <ShippingZonesListPage {...props} />)
.add("loading", () => ( .add("loading", () => (
<ShippingZonesListPage <ShippingZonesListPage

View file

@ -1,4 +1,5 @@
import { LanguageCodeEnum } from "@saleor/graphql"; import { LanguageCodeEnum } from "@saleor/graphql";
import { PaginatorContextDecorator } from "@saleor/storybook/PaginatorContextDecorator";
import { storiesOf } from "@storybook/react"; import { storiesOf } from "@storybook/react";
import React from "react"; import React from "react";
@ -33,6 +34,7 @@ const props: TranslationsEntitiesListPageProps = {
storiesOf("Views / Translations / Entity list", module) storiesOf("Views / Translations / Entity list", module)
.addDecorator(Decorator) .addDecorator(Decorator)
.addDecorator(PaginatorContextDecorator)
.add("default", () => ( .add("default", () => (
<TranslationsEntitiesListPage {...props}> <TranslationsEntitiesListPage {...props}>
<TranslationsEntitiesList <TranslationsEntitiesList
@ -50,12 +52,6 @@ storiesOf("Views / Translations / Entity list", module)
} }
]} ]}
getRowHref={() => ""} getRowHref={() => ""}
onNextPage={() => undefined}
onPreviousPage={() => undefined}
pageInfo={{
hasNextPage: true,
hasPreviousPage: false
}}
/> />
</TranslationsEntitiesListPage> </TranslationsEntitiesListPage>
)); ));

View file

@ -5,7 +5,7 @@ import CardTitle from "@saleor/components/CardTitle";
import Grid from "@saleor/components/Grid"; import Grid from "@saleor/components/Grid";
import Hr from "@saleor/components/Hr"; import Hr from "@saleor/components/Hr";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import { SubmitPromise } from "@saleor/hooks/useForm"; import { SubmitPromise } from "@saleor/hooks/useForm";
import { buttonMessages } from "@saleor/intl"; import { buttonMessages } from "@saleor/intl";
import { import {
@ -257,20 +257,8 @@ const TranslationFields: React.FC<TranslationFieldsProps> = props => {
))} ))}
</Grid> </Grid>
{pagination && ( {pagination && (
<TablePagination <TablePaginationWithContext
colSpan={numberOfColumns} colSpan={numberOfColumns}
hasNextPage={
pagination.pageInfo && !disabled
? pagination.pageInfo.hasNextPage
: false
}
onNextPage={pagination.onNextPage}
hasPreviousPage={
pagination.pageInfo && !disabled
? pagination.pageInfo.hasPreviousPage
: false
}
onPreviousPage={pagination.onPreviousPage}
settings={pagination.settings} settings={pagination.settings}
onUpdateListSettings={pagination.onUpdateListSettings} onUpdateListSettings={pagination.onUpdateListSettings}
component="div" component="div"

View file

@ -29,12 +29,6 @@ export interface TranslationsAttributesPageProps
data: AttributeTranslationDetailsFragment; data: AttributeTranslationDetailsFragment;
settings?: ListSettings; settings?: ListSettings;
onUpdateListSettings?: ListSettingsUpdate; onUpdateListSettings?: ListSettingsUpdate;
pageInfo: {
hasNextPage: boolean;
hasPreviousPage: boolean;
};
onNextPage: () => void;
onPreviousPage: () => void;
} }
export const fieldNames = { export const fieldNames = {
@ -55,10 +49,7 @@ const TranslationsAttributesPage: React.FC<TranslationsAttributesPageProps> = ({
onEdit, onEdit,
onSubmit, onSubmit,
settings, settings,
onUpdateListSettings, onUpdateListSettings
pageInfo,
onNextPage,
onPreviousPage
}) => { }) => {
const intl = useIntl(); const intl = useIntl();
@ -134,10 +125,7 @@ const TranslationsAttributesPage: React.FC<TranslationsAttributesPageProps> = ({
richTextResetKey={languageCode} richTextResetKey={languageCode}
pagination={{ pagination={{
settings, settings,
onUpdateListSettings, onUpdateListSettings
pageInfo,
onNextPage,
onPreviousPage
}} }}
onEdit={onEdit} onEdit={onEdit}
onDiscard={onDiscard} onDiscard={onDiscard}

View file

@ -7,7 +7,7 @@ import {
} from "@material-ui/core"; } from "@material-ui/core";
import ResponsiveTable from "@saleor/components/ResponsiveTable"; import ResponsiveTable from "@saleor/components/ResponsiveTable";
import Skeleton from "@saleor/components/Skeleton"; import Skeleton from "@saleor/components/Skeleton";
import TablePagination from "@saleor/components/TablePagination"; import { TablePaginationWithContext } from "@saleor/components/TablePagination";
import TableRowLink from "@saleor/components/TableRowLink"; import TableRowLink from "@saleor/components/TableRowLink";
import { makeStyles } from "@saleor/macaw-ui"; import { makeStyles } from "@saleor/macaw-ui";
import classNames from "classnames"; import classNames from "classnames";
@ -46,14 +46,7 @@ const useStyles = makeStyles(
{ name: "TranslationsEntitiesList" } { name: "TranslationsEntitiesList" }
); );
const TranslationsEntitiesList: React.FC<TranslationsEntitiesListProps> = props => { const TranslationsEntitiesList: React.FC<TranslationsEntitiesListProps> = props => {
const { const { disabled, entities, getRowHref } = props;
disabled,
entities,
onNextPage,
onPreviousPage,
getRowHref,
pageInfo
} = props;
const classes = useStyles(props); const classes = useStyles(props);
const intl = useIntl(); const intl = useIntl();
@ -79,17 +72,7 @@ const TranslationsEntitiesList: React.FC<TranslationsEntitiesListProps> = props
</TableHead> </TableHead>
<TableFooter> <TableFooter>
<TableRow> <TableRow>
<TablePagination <TablePaginationWithContext colSpan={2} disabled={disabled} />
colSpan={2}
hasNextPage={
pageInfo && !disabled ? pageInfo.hasNextPage : undefined
}
onNextPage={onNextPage}
hasPreviousPage={
pageInfo && !disabled ? pageInfo.hasPreviousPage : undefined
}
onPreviousPage={onPreviousPage}
/>
</TableRow> </TableRow>
</TableFooter> </TableFooter>
<TableBody> <TableBody>

View file

@ -1,5 +1,5 @@
import { useAttributeTranslationsQuery } from "@saleor/graphql"; import { useAttributeTranslationsQuery } from "@saleor/graphql";
import usePaginator from "@saleor/hooks/usePaginator"; import usePaginator, { PaginatorContext } from "@saleor/hooks/usePaginator";
import TranslationsEntitiesList from "@saleor/translations/components/TranslationsEntitiesList"; import TranslationsEntitiesList from "@saleor/translations/components/TranslationsEntitiesList";
import { import {
languageEntityUrl, languageEntityUrl,
@ -14,20 +14,19 @@ const TranslationsAttributeList: React.FC<TranslationsEntityListProps> = ({
params, params,
variables variables
}) => { }) => {
const paginate = usePaginator();
const { data, loading } = useAttributeTranslationsQuery({ const { data, loading } = useAttributeTranslationsQuery({
displayLoader: true, displayLoader: true,
variables variables
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
data?.translations?.pageInfo, pageInfo: data?.translations?.pageInfo,
variables, paginationState: variables,
params queryString: params
); });
return ( return (
<PaginatorContext.Provider value={paginationValues}>
<TranslationsEntitiesList <TranslationsEntitiesList
disabled={loading} disabled={loading}
entities={mapEdgesToItems(data?.translations)?.map( entities={mapEdgesToItems(data?.translations)?.map(
@ -45,10 +44,8 @@ const TranslationsAttributeList: React.FC<TranslationsEntityListProps> = ({
id id
) )
} }
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
pageInfo={pageInfo}
/> />
</PaginatorContext.Provider>
); );
}; };

View file

@ -1,5 +1,5 @@
import { useCategoryTranslationsQuery } from "@saleor/graphql"; import { useCategoryTranslationsQuery } from "@saleor/graphql";
import usePaginator from "@saleor/hooks/usePaginator"; import usePaginator, { PaginatorContext } from "@saleor/hooks/usePaginator";
import TranslationsEntitiesList from "@saleor/translations/components/TranslationsEntitiesList"; import TranslationsEntitiesList from "@saleor/translations/components/TranslationsEntitiesList";
import { import {
languageEntityUrl, languageEntityUrl,
@ -15,20 +15,19 @@ const TranslationsCategoryList: React.FC<TranslationsEntityListProps> = ({
params, params,
variables variables
}) => { }) => {
const paginate = usePaginator();
const { data, loading } = useCategoryTranslationsQuery({ const { data, loading } = useCategoryTranslationsQuery({
displayLoader: true, displayLoader: true,
variables variables
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
data?.translations?.pageInfo, pageInfo: data?.translations?.pageInfo,
variables, paginationState: variables,
params queryString: params
); });
return ( return (
<PaginatorContext.Provider value={paginationValues}>
<TranslationsEntitiesList <TranslationsEntitiesList
disabled={loading} disabled={loading}
entities={mapEdgesToItems(data?.translations)?.map( entities={mapEdgesToItems(data?.translations)?.map(
@ -54,10 +53,8 @@ const TranslationsCategoryList: React.FC<TranslationsEntityListProps> = ({
id id
) )
} }
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
pageInfo={pageInfo}
/> />
</PaginatorContext.Provider>
); );
}; };

View file

@ -1,5 +1,5 @@
import { useCollectionTranslationsQuery } from "@saleor/graphql"; import { useCollectionTranslationsQuery } from "@saleor/graphql";
import usePaginator from "@saleor/hooks/usePaginator"; import usePaginator, { PaginatorContext } from "@saleor/hooks/usePaginator";
import TranslationsEntitiesList from "@saleor/translations/components/TranslationsEntitiesList"; import TranslationsEntitiesList from "@saleor/translations/components/TranslationsEntitiesList";
import { import {
languageEntityUrl, languageEntityUrl,
@ -15,20 +15,19 @@ const TranslationsCollectionList: React.FC<TranslationsEntityListProps> = ({
params, params,
variables variables
}) => { }) => {
const paginate = usePaginator();
const { data, loading } = useCollectionTranslationsQuery({ const { data, loading } = useCollectionTranslationsQuery({
displayLoader: true, displayLoader: true,
variables variables
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
data?.translations?.pageInfo, pageInfo: data?.translations?.pageInfo,
variables, paginationState: variables,
params queryString: params
); });
return ( return (
<PaginatorContext.Provider value={paginationValues}>
<TranslationsEntitiesList <TranslationsEntitiesList
disabled={loading} disabled={loading}
entities={mapEdgesToItems(data?.translations)?.map( entities={mapEdgesToItems(data?.translations)?.map(
@ -54,10 +53,8 @@ const TranslationsCollectionList: React.FC<TranslationsEntityListProps> = ({
id id
) )
} }
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
pageInfo={pageInfo}
/> />
</PaginatorContext.Provider>
); );
}; };

View file

@ -1,5 +1,5 @@
import { usePageTranslationsQuery } from "@saleor/graphql"; import { usePageTranslationsQuery } from "@saleor/graphql";
import usePaginator from "@saleor/hooks/usePaginator"; import usePaginator, { PaginatorContext } from "@saleor/hooks/usePaginator";
import TranslationsEntitiesList from "@saleor/translations/components/TranslationsEntitiesList"; import TranslationsEntitiesList from "@saleor/translations/components/TranslationsEntitiesList";
import { import {
languageEntityUrl, languageEntityUrl,
@ -15,20 +15,19 @@ const TranslationsPageList: React.FC<TranslationsEntityListProps> = ({
params, params,
variables variables
}) => { }) => {
const paginate = usePaginator();
const { data, loading } = usePageTranslationsQuery({ const { data, loading } = usePageTranslationsQuery({
displayLoader: true, displayLoader: true,
variables variables
}); });
const { loadNextPage, loadPreviousPage, pageInfo } = paginate( const paginationValues = usePaginator({
data?.translations?.pageInfo, pageInfo: data?.translations?.pageInfo,
variables, paginationState: variables,
params queryString: params
); });
return ( return (
<PaginatorContext.Provider value={paginationValues}>
<TranslationsEntitiesList <TranslationsEntitiesList
disabled={loading} disabled={loading}
entities={mapEdgesToItems(data?.translations)?.map( entities={mapEdgesToItems(data?.translations)?.map(
@ -50,10 +49,8 @@ const TranslationsPageList: React.FC<TranslationsEntityListProps> = ({
getRowHref={id => getRowHref={id =>
languageEntityUrl(variables.language, TranslatableEntities.pages, id) languageEntityUrl(variables.language, TranslatableEntities.pages, id)
} }
onNextPage={loadNextPage}
onPreviousPage={loadPreviousPage}
pageInfo={pageInfo}
/> />
</PaginatorContext.Provider>
); );
}; };

Some files were not shown because too many files have changed in this diff Show more