Fix auto scroll (#1644)
This commit is contained in:
parent
e2c05e7dd6
commit
f111081331
18 changed files with 136 additions and 134 deletions
|
@ -15,7 +15,7 @@ import {
|
||||||
CategoryUrlQueryParams
|
CategoryUrlQueryParams
|
||||||
} from "./urls";
|
} from "./urls";
|
||||||
import { CategoryCreateView } from "./views/CategoryCreate";
|
import { CategoryCreateView } from "./views/CategoryCreate";
|
||||||
import CategoryDetailsView, { getActiveTab } from "./views/CategoryDetails";
|
import CategoryDetailsView from "./views/CategoryDetails";
|
||||||
import CategoryListComponent from "./views/CategoryList";
|
import CategoryListComponent from "./views/CategoryList";
|
||||||
|
|
||||||
interface CategoryDetailsRouteParams {
|
interface CategoryDetailsRouteParams {
|
||||||
|
@ -25,10 +25,7 @@ const CategoryDetails: React.FC<RouteComponentProps<
|
||||||
CategoryDetailsRouteParams
|
CategoryDetailsRouteParams
|
||||||
>> = ({ location, match }) => {
|
>> = ({ location, match }) => {
|
||||||
const qs = parseQs(location.search.substr(1));
|
const qs = parseQs(location.search.substr(1));
|
||||||
const params: CategoryUrlQueryParams = {
|
const params: CategoryUrlQueryParams = qs;
|
||||||
...qs,
|
|
||||||
activeTab: getActiveTab(qs.activeTab)
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<CategoryDetailsView
|
<CategoryDetailsView
|
||||||
|
|
|
@ -10,7 +10,6 @@ import {
|
||||||
Sort,
|
Sort,
|
||||||
TabActionDialog
|
TabActionDialog
|
||||||
} from "../types";
|
} from "../types";
|
||||||
import { CategoryPageTab } from "./components/CategoryUpdatePage";
|
|
||||||
|
|
||||||
const categorySectionUrl = "/categories/";
|
const categorySectionUrl = "/categories/";
|
||||||
|
|
||||||
|
@ -40,10 +39,7 @@ export type CategoryUrlDialog =
|
||||||
| "delete"
|
| "delete"
|
||||||
| "delete-categories"
|
| "delete-categories"
|
||||||
| "delete-products";
|
| "delete-products";
|
||||||
export type CategoryUrlQueryParams = BulkAction &
|
export type CategoryUrlQueryParams = BulkAction & Dialog<CategoryUrlDialog>;
|
||||||
Dialog<CategoryUrlDialog> &
|
|
||||||
Pagination &
|
|
||||||
ActiveTab<CategoryPageTab>;
|
|
||||||
export const categoryUrl = (id: string, params?: CategoryUrlQueryParams) =>
|
export const categoryUrl = (id: string, params?: CategoryUrlQueryParams) =>
|
||||||
categoryPath(encodeURIComponent(id)) + "?" + stringifyQs(params);
|
categoryPath(encodeURIComponent(id)) + "?" + stringifyQs(params);
|
||||||
|
|
||||||
|
|
|
@ -4,11 +4,11 @@ import ActionDialog from "@saleor/components/ActionDialog";
|
||||||
import NotFoundPage from "@saleor/components/NotFoundPage";
|
import NotFoundPage from "@saleor/components/NotFoundPage";
|
||||||
import { WindowTitle } from "@saleor/components/WindowTitle";
|
import { WindowTitle } from "@saleor/components/WindowTitle";
|
||||||
import useBulkActions from "@saleor/hooks/useBulkActions";
|
import useBulkActions from "@saleor/hooks/useBulkActions";
|
||||||
|
import useLocalPaginator, {
|
||||||
|
useSectionLocalPaginationState
|
||||||
|
} 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 usePaginator, {
|
|
||||||
createPaginationState
|
|
||||||
} from "@saleor/hooks/usePaginator";
|
|
||||||
import { commonMessages, errorMessages } from "@saleor/intl";
|
import { commonMessages, errorMessages } from "@saleor/intl";
|
||||||
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
|
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
|
||||||
import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler";
|
import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler";
|
||||||
|
@ -18,7 +18,7 @@ import {
|
||||||
usePrivateMetadataUpdate
|
usePrivateMetadataUpdate
|
||||||
} from "@saleor/utils/metadata/updateMetadata";
|
} from "@saleor/utils/metadata/updateMetadata";
|
||||||
import { getParsedDataForJsonStringField } from "@saleor/utils/richText/misc";
|
import { getParsedDataForJsonStringField } from "@saleor/utils/richText/misc";
|
||||||
import React from "react";
|
import React, { useState } from "react";
|
||||||
import { FormattedMessage, useIntl } from "react-intl";
|
import { FormattedMessage, useIntl } from "react-intl";
|
||||||
|
|
||||||
import { PAGINATE_BY } from "../../config";
|
import { PAGINATE_BY } from "../../config";
|
||||||
|
@ -65,7 +65,6 @@ export const CategoryDetails: React.FC<CategoryDetailsProps> = ({
|
||||||
}) => {
|
}) => {
|
||||||
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
|
||||||
);
|
);
|
||||||
|
@ -73,7 +72,19 @@ export const CategoryDetails: React.FC<CategoryDetailsProps> = ({
|
||||||
const [updateMetadata] = useMetadataUpdate({});
|
const [updateMetadata] = useMetadataUpdate({});
|
||||||
const [updatePrivateMetadata] = usePrivateMetadataUpdate({});
|
const [updatePrivateMetadata] = usePrivateMetadataUpdate({});
|
||||||
|
|
||||||
const paginationState = createPaginationState(PAGINATE_BY, params);
|
const [activeTab, setActiveTab] = useState<CategoryPageTab>(
|
||||||
|
CategoryPageTab.categories
|
||||||
|
);
|
||||||
|
const [paginationState, setPaginationState] = useSectionLocalPaginationState(
|
||||||
|
PAGINATE_BY,
|
||||||
|
activeTab
|
||||||
|
);
|
||||||
|
const paginate = useLocalPaginator(setPaginationState);
|
||||||
|
const changeTab = (tab: CategoryPageTab) => {
|
||||||
|
reset();
|
||||||
|
setActiveTab(tab);
|
||||||
|
};
|
||||||
|
|
||||||
const { data, loading, refetch } = useCategoryDetailsQuery({
|
const { data, loading, refetch } = useCategoryDetailsQuery({
|
||||||
displayLoader: true,
|
displayLoader: true,
|
||||||
variables: { ...paginationState, id }
|
variables: { ...paginationState, id }
|
||||||
|
@ -155,26 +166,16 @@ export const CategoryDetails: React.FC<CategoryDetailsProps> = ({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const changeTab = (tabName: CategoryPageTab) => {
|
|
||||||
reset();
|
|
||||||
navigate(
|
|
||||||
categoryUrl(id, {
|
|
||||||
activeTab: tabName
|
|
||||||
})
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
const [openModal, closeModal] = createDialogActionHandlers<
|
const [openModal, closeModal] = createDialogActionHandlers<
|
||||||
CategoryUrlDialog,
|
CategoryUrlDialog,
|
||||||
CategoryUrlQueryParams
|
CategoryUrlQueryParams
|
||||||
>(navigate, params => categoryUrl(id, params), params);
|
>(navigate, params => categoryUrl(id, params), params);
|
||||||
|
|
||||||
const { loadNextPage, loadPreviousPage, pageInfo } = paginate(
|
const { loadNextPage, loadPreviousPage, pageInfo } = paginate(
|
||||||
params.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),
|
||||||
paginationState,
|
paginationState
|
||||||
params
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const handleUpdate = async (formData: CategoryUpdateData) => {
|
const handleUpdate = async (formData: CategoryUpdateData) => {
|
||||||
|
@ -208,7 +209,7 @@ export const CategoryDetails: React.FC<CategoryDetailsProps> = ({
|
||||||
<WindowTitle title={maybe(() => data.category.name)} />
|
<WindowTitle title={maybe(() => data.category.name)} />
|
||||||
<CategoryUpdatePage
|
<CategoryUpdatePage
|
||||||
changeTab={changeTab}
|
changeTab={changeTab}
|
||||||
currentTab={params.activeTab}
|
currentTab={activeTab}
|
||||||
category={maybe(() => data.category)}
|
category={maybe(() => data.category)}
|
||||||
disabled={loading}
|
disabled={loading}
|
||||||
errors={updateResult.data?.categoryUpdate.errors || []}
|
errors={updateResult.data?.categoryUpdate.errors || []}
|
||||||
|
|
|
@ -44,9 +44,7 @@ export type CollectionUrlDialog =
|
||||||
| "assign"
|
| "assign"
|
||||||
| "unassign"
|
| "unassign"
|
||||||
| ChannelsAction;
|
| ChannelsAction;
|
||||||
export type CollectionUrlQueryParams = BulkAction &
|
export type CollectionUrlQueryParams = BulkAction & Dialog<CollectionUrlDialog>;
|
||||||
Pagination &
|
|
||||||
Dialog<CollectionUrlDialog>;
|
|
||||||
export type CollectionCreateUrlQueryParams = Dialog<ChannelsAction>;
|
export type CollectionCreateUrlQueryParams = Dialog<ChannelsAction>;
|
||||||
export const collectionUrl = (id: string, params?: CollectionUrlQueryParams) =>
|
export const collectionUrl = (id: string, params?: CollectionUrlQueryParams) =>
|
||||||
collectionPath(encodeURIComponent(id)) + "?" + stringifyQs(params);
|
collectionPath(encodeURIComponent(id)) + "?" + stringifyQs(params);
|
||||||
|
|
|
@ -12,12 +12,12 @@ import { WindowTitle } from "@saleor/components/WindowTitle";
|
||||||
import { DEFAULT_INITIAL_SEARCH_DATA, PAGINATE_BY } from "@saleor/config";
|
import { DEFAULT_INITIAL_SEARCH_DATA, PAGINATE_BY } from "@saleor/config";
|
||||||
import useBulkActions from "@saleor/hooks/useBulkActions";
|
import useBulkActions from "@saleor/hooks/useBulkActions";
|
||||||
import useChannels from "@saleor/hooks/useChannels";
|
import useChannels from "@saleor/hooks/useChannels";
|
||||||
|
import useLocalPaginator, {
|
||||||
|
useLocalPaginationState
|
||||||
|
} from "@saleor/hooks/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 usePaginator, {
|
|
||||||
createPaginationState
|
|
||||||
} 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";
|
||||||
|
@ -67,7 +67,6 @@ export const CollectionDetails: React.FC<CollectionDetailsProps> = ({
|
||||||
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
|
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
|
||||||
params.ids
|
params.ids
|
||||||
);
|
);
|
||||||
const paginate = usePaginator();
|
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const { search, loadMore, result } = useProductSearch({
|
const { search, loadMore, result } = useProductSearch({
|
||||||
variables: DEFAULT_INITIAL_SEARCH_DATA
|
variables: DEFAULT_INITIAL_SEARCH_DATA
|
||||||
|
@ -158,7 +157,11 @@ export const CollectionDetails: React.FC<CollectionDetailsProps> = ({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const paginationState = createPaginationState(PAGINATE_BY, params);
|
const [paginationState, setPaginationState] = useLocalPaginationState(
|
||||||
|
PAGINATE_BY
|
||||||
|
);
|
||||||
|
const paginate = useLocalPaginator(setPaginationState);
|
||||||
|
|
||||||
const handleBack = () => navigate(collectionListUrl());
|
const handleBack = () => navigate(collectionListUrl());
|
||||||
|
|
||||||
const [selectedChannel] = useLocalStorage("collectionListChannel", "");
|
const [selectedChannel] = useLocalStorage("collectionListChannel", "");
|
||||||
|
@ -255,8 +258,7 @@ export const CollectionDetails: React.FC<CollectionDetailsProps> = ({
|
||||||
|
|
||||||
const { loadNextPage, loadPreviousPage, pageInfo } = paginate(
|
const { loadNextPage, loadPreviousPage, pageInfo } = paginate(
|
||||||
data?.collection?.products?.pageInfo,
|
data?.collection?.products?.pageInfo,
|
||||||
paginationState,
|
paginationState
|
||||||
params
|
|
||||||
);
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -59,16 +59,6 @@ export enum SaleDetailsPageTab {
|
||||||
variants = "variants"
|
variants = "variants"
|
||||||
}
|
}
|
||||||
|
|
||||||
export function saleDetailsPageTab(tab: string): SaleDetailsPageTab {
|
|
||||||
return tab === SaleDetailsPageTab.products
|
|
||||||
? SaleDetailsPageTab.products
|
|
||||||
: tab === SaleDetailsPageTab.collections
|
|
||||||
? SaleDetailsPageTab.collections
|
|
||||||
: tab === SaleDetailsPageTab.categories
|
|
||||||
? SaleDetailsPageTab.categories
|
|
||||||
: SaleDetailsPageTab.variants;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface SaleDetailsPageProps
|
export interface SaleDetailsPageProps
|
||||||
extends Pick<ListProps, Exclude<keyof ListProps, "onRowClick">>,
|
extends Pick<ListProps, Exclude<keyof ListProps, "onRowClick">>,
|
||||||
TabListActions<
|
TabListActions<
|
||||||
|
|
|
@ -52,14 +52,6 @@ export enum VoucherDetailsPageTab {
|
||||||
products = "products"
|
products = "products"
|
||||||
}
|
}
|
||||||
|
|
||||||
export function voucherDetailsPageTab(tab: string): VoucherDetailsPageTab {
|
|
||||||
return tab === VoucherDetailsPageTab.products
|
|
||||||
? VoucherDetailsPageTab.products
|
|
||||||
: tab === VoucherDetailsPageTab.collections
|
|
||||||
? VoucherDetailsPageTab.collections
|
|
||||||
: VoucherDetailsPageTab.categories;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface VoucherDetailsPageFormData extends MetadataFormData {
|
export interface VoucherDetailsPageFormData extends MetadataFormData {
|
||||||
applyOncePerCustomer: boolean;
|
applyOncePerCustomer: boolean;
|
||||||
applyOncePerOrder: boolean;
|
applyOncePerOrder: boolean;
|
||||||
|
|
|
@ -6,8 +6,6 @@ import { useIntl } from "react-intl";
|
||||||
import { Route, RouteComponentProps, Switch } from "react-router-dom";
|
import { Route, RouteComponentProps, Switch } from "react-router-dom";
|
||||||
|
|
||||||
import { WindowTitle } from "../components/WindowTitle";
|
import { WindowTitle } from "../components/WindowTitle";
|
||||||
import { saleDetailsPageTab } from "./components/SaleDetailsPage";
|
|
||||||
import { voucherDetailsPageTab } from "./components/VoucherDetailsPage";
|
|
||||||
import {
|
import {
|
||||||
saleAddPath,
|
saleAddPath,
|
||||||
SaleCreateUrlQueryParams,
|
SaleCreateUrlQueryParams,
|
||||||
|
@ -41,11 +39,8 @@ const SaleDetailsView: React.FC<RouteComponentProps<{ id: string }>> = ({
|
||||||
match,
|
match,
|
||||||
location
|
location
|
||||||
}) => {
|
}) => {
|
||||||
const { activeTab, ...qs } = parseQs(location.search.substr(1));
|
const qs = parseQs(location.search.substr(1));
|
||||||
const params: SaleUrlQueryParams = {
|
const params: SaleUrlQueryParams = qs;
|
||||||
...qs,
|
|
||||||
activeTab: saleDetailsPageTab(activeTab)
|
|
||||||
};
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<SaleDetailsViewComponent
|
<SaleDetailsViewComponent
|
||||||
|
@ -76,11 +71,9 @@ const VoucherDetailsView: React.FC<RouteComponentProps<{ id: string }>> = ({
|
||||||
match,
|
match,
|
||||||
location
|
location
|
||||||
}) => {
|
}) => {
|
||||||
const { activeTab, ...qs } = parseQs(location.search.substr(1));
|
const qs = parseQs(location.search.substr(1));
|
||||||
const params: VoucherUrlQueryParams = {
|
const params: VoucherUrlQueryParams = qs;
|
||||||
...qs,
|
|
||||||
activeTab: voucherDetailsPageTab(activeTab)
|
|
||||||
};
|
|
||||||
return (
|
return (
|
||||||
<VoucherDetailsViewComponent
|
<VoucherDetailsViewComponent
|
||||||
id={decodeURIComponent(match.params.id)}
|
id={decodeURIComponent(match.params.id)}
|
||||||
|
|
|
@ -12,8 +12,6 @@ import {
|
||||||
Sort,
|
Sort,
|
||||||
TabActionDialog
|
TabActionDialog
|
||||||
} from "../types";
|
} from "../types";
|
||||||
import { SaleDetailsPageTab } from "./components/SaleDetailsPage";
|
|
||||||
import { VoucherDetailsPageTab } from "./components/VoucherDetailsPage";
|
|
||||||
|
|
||||||
export const discountSection = "/discounts/";
|
export const discountSection = "/discounts/";
|
||||||
|
|
||||||
|
@ -60,10 +58,7 @@ export type SaleUrlDialog =
|
||||||
| "unassign-variant"
|
| "unassign-variant"
|
||||||
| "remove"
|
| "remove"
|
||||||
| ChannelsAction;
|
| ChannelsAction;
|
||||||
export type SaleUrlQueryParams = Pagination &
|
export type SaleUrlQueryParams = BulkAction & Dialog<SaleUrlDialog>;
|
||||||
BulkAction &
|
|
||||||
Dialog<SaleUrlDialog> &
|
|
||||||
ActiveTab<SaleDetailsPageTab>;
|
|
||||||
export type SaleCreateUrlQueryParams = Dialog<ChannelsAction>;
|
export type SaleCreateUrlQueryParams = Dialog<ChannelsAction>;
|
||||||
export const saleUrl = (id: string, params?: SaleUrlQueryParams) =>
|
export const saleUrl = (id: string, params?: SaleUrlQueryParams) =>
|
||||||
salePath(encodeURIComponent(id)) + "?" + stringifyQs(params);
|
salePath(encodeURIComponent(id)) + "?" + stringifyQs(params);
|
||||||
|
@ -117,10 +112,7 @@ export type VoucherUrlDialog =
|
||||||
| "unassign-product"
|
| "unassign-product"
|
||||||
| "remove"
|
| "remove"
|
||||||
| ChannelsAction;
|
| ChannelsAction;
|
||||||
export type VoucherUrlQueryParams = Pagination &
|
export type VoucherUrlQueryParams = BulkAction & Dialog<VoucherUrlDialog>;
|
||||||
BulkAction &
|
|
||||||
Dialog<VoucherUrlDialog> &
|
|
||||||
ActiveTab<VoucherDetailsPageTab>;
|
|
||||||
export type VoucherCreateUrlQueryParams = Dialog<ChannelsAction>;
|
export type VoucherCreateUrlQueryParams = Dialog<ChannelsAction>;
|
||||||
export const voucherUrl = (id: string, params?: VoucherUrlQueryParams) =>
|
export const voucherUrl = (id: string, params?: VoucherUrlQueryParams) =>
|
||||||
voucherPath(encodeURIComponent(id)) + "?" + stringifyQs(params);
|
voucherPath(encodeURIComponent(id)) + "?" + stringifyQs(params);
|
||||||
|
|
|
@ -37,12 +37,12 @@ import {
|
||||||
} from "@saleor/discounts/urls";
|
} from "@saleor/discounts/urls";
|
||||||
import useBulkActions from "@saleor/hooks/useBulkActions";
|
import useBulkActions from "@saleor/hooks/useBulkActions";
|
||||||
import useChannels from "@saleor/hooks/useChannels";
|
import useChannels from "@saleor/hooks/useChannels";
|
||||||
|
import useLocalPaginator, {
|
||||||
|
useSectionLocalPaginationState
|
||||||
|
} from "@saleor/hooks/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 usePaginator, {
|
|
||||||
createPaginationState
|
|
||||||
} 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 { productUrl, productVariantEditPath } from "@saleor/products/urls";
|
import { productUrl, productVariantEditPath } from "@saleor/products/urls";
|
||||||
|
@ -56,7 +56,7 @@ import {
|
||||||
useMetadataUpdate,
|
useMetadataUpdate,
|
||||||
usePrivateMetadataUpdate
|
usePrivateMetadataUpdate
|
||||||
} from "@saleor/utils/metadata/updateMetadata";
|
} from "@saleor/utils/metadata/updateMetadata";
|
||||||
import React from "react";
|
import React, { useState } from "react";
|
||||||
import { FormattedMessage, useIntl } from "react-intl";
|
import { FormattedMessage, useIntl } from "react-intl";
|
||||||
|
|
||||||
import { createUpdateHandler } from "./handlers";
|
import { createUpdateHandler } from "./handlers";
|
||||||
|
@ -71,7 +71,6 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
|
||||||
const [updateMetadata] = useMetadataUpdate({});
|
const [updateMetadata] = useMetadataUpdate({});
|
||||||
const [updatePrivateMetadata] = usePrivateMetadataUpdate({});
|
const [updatePrivateMetadata] = usePrivateMetadataUpdate({});
|
||||||
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
|
||||||
|
@ -101,14 +100,17 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
|
||||||
|
|
||||||
const { availableChannels } = useAppChannel(false);
|
const { availableChannels } = useAppChannel(false);
|
||||||
|
|
||||||
const paginationState = createPaginationState(PAGINATE_BY, params);
|
const [activeTab, setActiveTab] = useState<SaleDetailsPageTab>(
|
||||||
|
SaleDetailsPageTab.categories
|
||||||
|
);
|
||||||
|
const [paginationState, setPaginationState] = useSectionLocalPaginationState(
|
||||||
|
PAGINATE_BY,
|
||||||
|
activeTab
|
||||||
|
);
|
||||||
|
const paginate = useLocalPaginator(setPaginationState);
|
||||||
const changeTab = (tab: SaleDetailsPageTab) => {
|
const changeTab = (tab: SaleDetailsPageTab) => {
|
||||||
reset();
|
reset();
|
||||||
navigate(
|
setActiveTab(tab);
|
||||||
saleUrl(id, {
|
|
||||||
activeTab: tab
|
|
||||||
})
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const { data, loading } = useSaleDetails({
|
const { data, loading } = useSaleDetails({
|
||||||
|
@ -210,11 +212,11 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
|
||||||
<TypedSaleDelete onCompleted={handleSaleDelete}>
|
<TypedSaleDelete onCompleted={handleSaleDelete}>
|
||||||
{(saleDelete, saleDeleteOpts) => {
|
{(saleDelete, saleDeleteOpts) => {
|
||||||
const tabPageInfo =
|
const tabPageInfo =
|
||||||
params.activeTab === SaleDetailsPageTab.categories
|
activeTab === SaleDetailsPageTab.categories
|
||||||
? maybe(() => data.sale.categories.pageInfo)
|
? maybe(() => data.sale.categories.pageInfo)
|
||||||
: params.activeTab === SaleDetailsPageTab.collections
|
: activeTab === SaleDetailsPageTab.collections
|
||||||
? maybe(() => data.sale.collections.pageInfo)
|
? maybe(() => data.sale.collections.pageInfo)
|
||||||
: params.activeTab === SaleDetailsPageTab.products
|
: activeTab === SaleDetailsPageTab.products
|
||||||
? maybe(() => data.sale.products.pageInfo)
|
? maybe(() => data.sale.products.pageInfo)
|
||||||
: maybe(() => data.sale.variants.pageInfo);
|
: maybe(() => data.sale.variants.pageInfo);
|
||||||
|
|
||||||
|
@ -266,7 +268,7 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
|
||||||
loadNextPage,
|
loadNextPage,
|
||||||
loadPreviousPage,
|
loadPreviousPage,
|
||||||
pageInfo
|
pageInfo
|
||||||
} = paginate(tabPageInfo, paginationState, params);
|
} = paginate(tabPageInfo, paginationState);
|
||||||
|
|
||||||
const handleUpdate = createUpdateHandler(
|
const handleUpdate = createUpdateHandler(
|
||||||
data?.sale,
|
data?.sale,
|
||||||
|
@ -335,7 +337,7 @@ export const SaleDetails: React.FC<SaleDetailsProps> = ({ id, params }) => {
|
||||||
navigate(
|
navigate(
|
||||||
productVariantEditPath(productId, variantId)
|
productVariantEditPath(productId, variantId)
|
||||||
)}
|
)}
|
||||||
activeTab={params.activeTab}
|
activeTab={activeTab}
|
||||||
onBack={() => navigate(saleListUrl())}
|
onBack={() => navigate(saleListUrl())}
|
||||||
onTabClick={changeTab}
|
onTabClick={changeTab}
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
|
|
|
@ -36,11 +36,11 @@ import {
|
||||||
} from "@saleor/discounts/urls";
|
} from "@saleor/discounts/urls";
|
||||||
import useBulkActions from "@saleor/hooks/useBulkActions";
|
import useBulkActions from "@saleor/hooks/useBulkActions";
|
||||||
import useChannels from "@saleor/hooks/useChannels";
|
import useChannels from "@saleor/hooks/useChannels";
|
||||||
|
import useLocalPaginator, {
|
||||||
|
useSectionLocalPaginationState
|
||||||
|
} 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 usePaginator, {
|
|
||||||
createPaginationState
|
|
||||||
} 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";
|
||||||
|
@ -54,7 +54,7 @@ import {
|
||||||
useMetadataUpdate,
|
useMetadataUpdate,
|
||||||
usePrivateMetadataUpdate
|
usePrivateMetadataUpdate
|
||||||
} from "@saleor/utils/metadata/updateMetadata";
|
} from "@saleor/utils/metadata/updateMetadata";
|
||||||
import React, { useMemo } from "react";
|
import React, { useMemo, useState } from "react";
|
||||||
import { FormattedMessage, useIntl } from "react-intl";
|
import { FormattedMessage, useIntl } from "react-intl";
|
||||||
|
|
||||||
import { categoryUrl } from "../../../categories/urls";
|
import { categoryUrl } from "../../../categories/urls";
|
||||||
|
@ -73,7 +73,6 @@ export const VoucherDetails: React.FC<VoucherDetailsProps> = ({
|
||||||
params
|
params
|
||||||
}) => {
|
}) => {
|
||||||
const navigate = useNavigator();
|
const navigate = useNavigator();
|
||||||
const paginate = usePaginator();
|
|
||||||
const notify = useNotifier();
|
const notify = useNotifier();
|
||||||
const shop = useShop();
|
const shop = useShop();
|
||||||
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
|
const { isSelected, listElements, reset, toggle, toggleAll } = useBulkActions(
|
||||||
|
@ -104,14 +103,17 @@ export const VoucherDetails: React.FC<VoucherDetailsProps> = ({
|
||||||
const [updateMetadata] = useMetadataUpdate({});
|
const [updateMetadata] = useMetadataUpdate({});
|
||||||
const [updatePrivateMetadata] = usePrivateMetadataUpdate({});
|
const [updatePrivateMetadata] = usePrivateMetadataUpdate({});
|
||||||
|
|
||||||
const paginationState = createPaginationState(PAGINATE_BY, params);
|
const [activeTab, setActiveTab] = useState<VoucherDetailsPageTab>(
|
||||||
|
VoucherDetailsPageTab.categories
|
||||||
|
);
|
||||||
|
const [paginationState, setPaginationState] = useSectionLocalPaginationState(
|
||||||
|
PAGINATE_BY,
|
||||||
|
activeTab
|
||||||
|
);
|
||||||
|
const paginate = useLocalPaginator(setPaginationState);
|
||||||
const changeTab = (tab: VoucherDetailsPageTab) => {
|
const changeTab = (tab: VoucherDetailsPageTab) => {
|
||||||
reset();
|
reset();
|
||||||
navigate(
|
setActiveTab(tab);
|
||||||
voucherUrl(id, {
|
|
||||||
activeTab: tab
|
|
||||||
})
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const { data, loading } = useVoucherDetails({
|
const { data, loading } = useVoucherDetails({
|
||||||
|
@ -246,10 +248,9 @@ export const VoucherDetails: React.FC<VoucherDetailsProps> = ({
|
||||||
);
|
);
|
||||||
|
|
||||||
const tabPageInfo =
|
const tabPageInfo =
|
||||||
params.activeTab === VoucherDetailsPageTab.categories
|
activeTab === VoucherDetailsPageTab.categories
|
||||||
? maybe(() => data.voucher.categories.pageInfo)
|
? maybe(() => data.voucher.categories.pageInfo)
|
||||||
: params.activeTab ===
|
: activeTab === VoucherDetailsPageTab.collections
|
||||||
VoucherDetailsPageTab.collections
|
|
||||||
? maybe(() => data.voucher.collections.pageInfo)
|
? maybe(() => data.voucher.collections.pageInfo)
|
||||||
: maybe(() => data.voucher.products.pageInfo);
|
: maybe(() => data.voucher.products.pageInfo);
|
||||||
|
|
||||||
|
@ -290,7 +291,7 @@ export const VoucherDetails: React.FC<VoucherDetailsProps> = ({
|
||||||
loadNextPage,
|
loadNextPage,
|
||||||
loadPreviousPage,
|
loadPreviousPage,
|
||||||
pageInfo
|
pageInfo
|
||||||
} = paginate(tabPageInfo, paginationState, params);
|
} = paginate(tabPageInfo, paginationState);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
|
@ -379,7 +380,7 @@ export const VoucherDetails: React.FC<VoucherDetailsProps> = ({
|
||||||
}
|
}
|
||||||
onProductClick={id => () =>
|
onProductClick={id => () =>
|
||||||
navigate(productUrl(id))}
|
navigate(productUrl(id))}
|
||||||
activeTab={params.activeTab}
|
activeTab={activeTab}
|
||||||
onBack={() => navigate(voucherListUrl())}
|
onBack={() => navigate(voucherListUrl())}
|
||||||
onTabClick={changeTab}
|
onTabClick={changeTab}
|
||||||
onSubmit={handleSubmit}
|
onSubmit={handleSubmit}
|
||||||
|
|
|
@ -14,6 +14,11 @@ export interface PaginationState {
|
||||||
last?: number;
|
last?: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Local pagination state.
|
||||||
|
* @param paginateBy Number of items per page.
|
||||||
|
* @returns Pagination state and setter.
|
||||||
|
*/
|
||||||
export function useLocalPaginationState(
|
export function useLocalPaginationState(
|
||||||
paginateBy: number
|
paginateBy: number
|
||||||
): [PaginationState, (paginationState: PaginationState) => void] {
|
): [PaginationState, (paginationState: PaginationState) => void] {
|
||||||
|
@ -46,6 +51,39 @@ export function useLocalPaginationState(
|
||||||
return [state, setPaginationState];
|
return [state, setPaginationState];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Local pagination state persisted as long as section is not changed.
|
||||||
|
* @param paginateBy Number of items per page.
|
||||||
|
* @param section Section name. When changed, pagination state is reset.
|
||||||
|
* @returns Pagination state and setter.
|
||||||
|
*/
|
||||||
|
export function useSectionLocalPaginationState(
|
||||||
|
paginateBy: number,
|
||||||
|
section: string
|
||||||
|
): [PaginationState, (paginationState: PaginationState) => void] {
|
||||||
|
const [paginationSection, setPaginationSection] = useState(section);
|
||||||
|
const [paginationState, setPaginationState] = useLocalPaginationState(
|
||||||
|
paginateBy
|
||||||
|
);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (section !== paginationSection) {
|
||||||
|
setPaginationState({});
|
||||||
|
}
|
||||||
|
}, [section]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (section !== paginationSection) {
|
||||||
|
setPaginationSection(section);
|
||||||
|
}
|
||||||
|
}, [paginationState]);
|
||||||
|
|
||||||
|
return [
|
||||||
|
section === paginationSection ? paginationState : {},
|
||||||
|
setPaginationState
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
function useLocalPaginator(
|
function useLocalPaginator(
|
||||||
setPaginationState: (paginationState: PaginationState) => void
|
setPaginationState: (paginationState: PaginationState) => void
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -16,7 +16,7 @@ function useNavigator(): UseNavigatorResult {
|
||||||
|
|
||||||
return (
|
return (
|
||||||
url: string,
|
url: string,
|
||||||
{ replace = false, preserveQs = false, resetScroll = true } = {}
|
{ replace = false, preserveQs = false, resetScroll = false } = {}
|
||||||
) => {
|
) => {
|
||||||
const targetUrl = preserveQs ? url + search : url;
|
const targetUrl = preserveQs ? url + search : url;
|
||||||
if (replace) {
|
if (replace) {
|
||||||
|
|
|
@ -52,7 +52,7 @@ function usePaginator() {
|
||||||
after: pageInfo.endCursor,
|
after: pageInfo.endCursor,
|
||||||
before: undefined
|
before: undefined
|
||||||
}),
|
}),
|
||||||
{ replace: true }
|
{ replace: true, resetScroll: true }
|
||||||
);
|
);
|
||||||
|
|
||||||
const loadPreviousPage = () =>
|
const loadPreviousPage = () =>
|
||||||
|
@ -63,7 +63,7 @@ function usePaginator() {
|
||||||
after: undefined,
|
after: undefined,
|
||||||
before: pageInfo.startCursor
|
before: pageInfo.startCursor
|
||||||
}),
|
}),
|
||||||
{ replace: true }
|
{ replace: true, resetScroll: true }
|
||||||
);
|
);
|
||||||
|
|
||||||
const newPageInfo = pageInfo
|
const newPageInfo = pageInfo
|
||||||
|
|
|
@ -34,8 +34,7 @@ export type ShippingZoneUrlQueryParams = Dialog<ShippingZoneUrlDialog> &
|
||||||
SingleAction &
|
SingleAction &
|
||||||
Partial<{
|
Partial<{
|
||||||
type: ShippingMethodTypeEnum;
|
type: ShippingMethodTypeEnum;
|
||||||
}> &
|
}>;
|
||||||
Pagination;
|
|
||||||
export const shippingZoneUrl = (
|
export const shippingZoneUrl = (
|
||||||
id: string,
|
id: string,
|
||||||
params?: ShippingZoneUrlQueryParams
|
params?: ShippingZoneUrlQueryParams
|
||||||
|
@ -50,8 +49,7 @@ export type ShippingRateUrlDialog =
|
||||||
|
|
||||||
export type ShippingRateUrlQueryParams = Dialog<ShippingRateUrlDialog> &
|
export type ShippingRateUrlQueryParams = Dialog<ShippingRateUrlDialog> &
|
||||||
SingleAction &
|
SingleAction &
|
||||||
BulkAction &
|
BulkAction;
|
||||||
Pagination;
|
|
||||||
export type ShippingRateCreateUrlDialog = ZipCodeRangeActions | ChannelsAction;
|
export type ShippingRateCreateUrlDialog = ZipCodeRangeActions | ChannelsAction;
|
||||||
export type ShippingRateCreateUrlQueryParams = Dialog<
|
export type ShippingRateCreateUrlQueryParams = Dialog<
|
||||||
ShippingRateCreateUrlDialog
|
ShippingRateCreateUrlDialog
|
||||||
|
|
|
@ -9,11 +9,11 @@ import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config";
|
||||||
import { PAGINATE_BY } from "@saleor/config";
|
import { PAGINATE_BY } from "@saleor/config";
|
||||||
import useBulkActions from "@saleor/hooks/useBulkActions";
|
import useBulkActions from "@saleor/hooks/useBulkActions";
|
||||||
import useChannels from "@saleor/hooks/useChannels";
|
import useChannels from "@saleor/hooks/useChannels";
|
||||||
|
import useLocalPaginator, {
|
||||||
|
useLocalPaginationState
|
||||||
|
} 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 usePaginator, {
|
|
||||||
createPaginationState
|
|
||||||
} from "@saleor/hooks/usePaginator";
|
|
||||||
import { sectionNames } from "@saleor/intl";
|
import { sectionNames } from "@saleor/intl";
|
||||||
import { commonMessages } from "@saleor/intl";
|
import { commonMessages } from "@saleor/intl";
|
||||||
import {
|
import {
|
||||||
|
@ -80,9 +80,11 @@ export const PriceRatesUpdate: React.FC<PriceRatesUpdateProps> = ({
|
||||||
const navigate = useNavigator();
|
const navigate = useNavigator();
|
||||||
const notify = useNotifier();
|
const notify = useNotifier();
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const paginate = usePaginator();
|
|
||||||
|
|
||||||
const paginationState = createPaginationState(PAGINATE_BY, params);
|
const [paginationState, setPaginationState] = useLocalPaginationState(
|
||||||
|
PAGINATE_BY
|
||||||
|
);
|
||||||
|
const paginate = useLocalPaginator(setPaginationState);
|
||||||
|
|
||||||
const { data, loading, refetch } = useShippingZone({
|
const { data, loading, refetch } = useShippingZone({
|
||||||
displayLoader: true,
|
displayLoader: true,
|
||||||
|
@ -110,8 +112,7 @@ export const PriceRatesUpdate: React.FC<PriceRatesUpdateProps> = ({
|
||||||
|
|
||||||
const { loadNextPage, loadPreviousPage, pageInfo } = paginate(
|
const { loadNextPage, loadPreviousPage, pageInfo } = paginate(
|
||||||
rate?.excludedProducts.pageInfo,
|
rate?.excludedProducts.pageInfo,
|
||||||
paginationState,
|
paginationState
|
||||||
params
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const [
|
const [
|
||||||
|
|
|
@ -4,9 +4,9 @@ import useAppChannel from "@saleor/components/AppLayout/AppChannelContext";
|
||||||
import NotFoundPage from "@saleor/components/NotFoundPage";
|
import NotFoundPage from "@saleor/components/NotFoundPage";
|
||||||
import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config";
|
import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config";
|
||||||
import { PAGINATE_BY } from "@saleor/config";
|
import { PAGINATE_BY } from "@saleor/config";
|
||||||
|
import { useLocalPaginationState } 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 { createPaginationState } 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";
|
||||||
import { getById } from "@saleor/orders/components/OrderReturnPage/utils";
|
import { getById } from "@saleor/orders/components/OrderReturnPage/utils";
|
||||||
|
@ -61,7 +61,7 @@ const ShippingZoneDetails: React.FC<ShippingZoneDetailsProps> = ({
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const shop = useShop();
|
const shop = useShop();
|
||||||
|
|
||||||
const paginationState = createPaginationState(PAGINATE_BY, params);
|
const [paginationState] = useLocalPaginationState(PAGINATE_BY);
|
||||||
|
|
||||||
const { result: searchWarehousesOpts, loadMore, search } = useWarehouseSearch(
|
const { result: searchWarehousesOpts, loadMore, search } = useWarehouseSearch(
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,11 +9,11 @@ import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config";
|
||||||
import { PAGINATE_BY } from "@saleor/config";
|
import { PAGINATE_BY } from "@saleor/config";
|
||||||
import useBulkActions from "@saleor/hooks/useBulkActions";
|
import useBulkActions from "@saleor/hooks/useBulkActions";
|
||||||
import useChannels from "@saleor/hooks/useChannels";
|
import useChannels from "@saleor/hooks/useChannels";
|
||||||
|
import useLocalPaginator, {
|
||||||
|
useLocalPaginationState
|
||||||
|
} 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 usePaginator, {
|
|
||||||
createPaginationState
|
|
||||||
} from "@saleor/hooks/usePaginator";
|
|
||||||
import { sectionNames } from "@saleor/intl";
|
import { sectionNames } from "@saleor/intl";
|
||||||
import { commonMessages } from "@saleor/intl";
|
import { commonMessages } from "@saleor/intl";
|
||||||
import {
|
import {
|
||||||
|
@ -80,9 +80,11 @@ export const WeightRatesUpdate: React.FC<WeightRatesUpdateProps> = ({
|
||||||
const navigate = useNavigator();
|
const navigate = useNavigator();
|
||||||
const notify = useNotifier();
|
const notify = useNotifier();
|
||||||
const intl = useIntl();
|
const intl = useIntl();
|
||||||
const paginate = usePaginator();
|
|
||||||
|
|
||||||
const paginationState = createPaginationState(PAGINATE_BY, params);
|
const [paginationState, setPaginationState] = useLocalPaginationState(
|
||||||
|
PAGINATE_BY
|
||||||
|
);
|
||||||
|
const paginate = useLocalPaginator(setPaginationState);
|
||||||
|
|
||||||
const { data, loading, refetch } = useShippingZone({
|
const { data, loading, refetch } = useShippingZone({
|
||||||
displayLoader: true,
|
displayLoader: true,
|
||||||
|
@ -159,8 +161,7 @@ export const WeightRatesUpdate: React.FC<WeightRatesUpdateProps> = ({
|
||||||
|
|
||||||
const { loadNextPage, loadPreviousPage, pageInfo } = paginate(
|
const { loadNextPage, loadPreviousPage, pageInfo } = paginate(
|
||||||
rate?.excludedProducts.pageInfo,
|
rate?.excludedProducts.pageInfo,
|
||||||
paginationState,
|
paginationState
|
||||||
params
|
|
||||||
);
|
);
|
||||||
|
|
||||||
const [
|
const [
|
||||||
|
|
Loading…
Reference in a new issue