Pass query params for product and order details app mounting points (#2100)
* Pass query params to iframe from dashboard * Pass search params in product details and order details extensions * Move released features in Changelog * Add entry to chagnelog * Fix ESLint issues
This commit is contained in:
parent
d48dcb87ab
commit
69eeb4c280
7 changed files with 77 additions and 17 deletions
|
@ -3,10 +3,17 @@
|
||||||
All notable, unreleased changes to this project will be documented in this file. For the released changes, please visit the [Releases](https://github.com/saleor/saleor-dashboard/releases) page.
|
All notable, unreleased changes to this project will be documented in this file. For the released changes, please visit the [Releases](https://github.com/saleor/saleor-dashboard/releases) page.
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
- Pass query params in `ORDER_DETAILS_MORE_ACTIONS` and `PRODUCT_DETAILS_MORE_ACTIONS` mounting points - #2100 by @witoszekdev
|
||||||
|
|
||||||
|
## 3.4
|
||||||
|
|
||||||
- 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
|
||||||
- Improvements to the app list page: added toggle and permision preview - #2035 by @witoszekdev
|
- Improvements to the app list page: added toggle and permision preview - #2035 by @witoszekdev
|
||||||
|
### 3.4.1
|
||||||
|
|
||||||
- Added links to table pagination buttons - #2063 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
|
- Using push instead of replace to history stack for pagination navigation - #2063 by @witoszekdev
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,11 @@ export const AppFrame: React.FC<Props> = ({
|
||||||
return (
|
return (
|
||||||
<iframe
|
<iframe
|
||||||
ref={frameRef}
|
ref={frameRef}
|
||||||
src={urlJoin(src, `?domain=${shop.domain.host}&id=${appId}`)}
|
src={urlJoin(
|
||||||
|
src,
|
||||||
|
window.location.search,
|
||||||
|
`?domain=${shop.domain.host}&id=${appId}`,
|
||||||
|
)}
|
||||||
onError={onError}
|
onError={onError}
|
||||||
onLoad={handleLoad}
|
onLoad={handleLoad}
|
||||||
className={clsx(classes.iframe, className)}
|
className={clsx(classes.iframe, className)}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { appDeepUrl } from "@saleor/apps/urls";
|
import { appDeepUrl, AppDetailsUrlMountQueryParams } from "@saleor/apps/urls";
|
||||||
import { AppExtensionTargetEnum } from "@saleor/graphql";
|
import { AppExtensionTargetEnum } from "@saleor/graphql";
|
||||||
import useNavigator from "@saleor/hooks/useNavigator";
|
import useNavigator from "@saleor/hooks/useNavigator";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
@ -12,6 +12,7 @@ export interface AppData {
|
||||||
src: string;
|
src: string;
|
||||||
label: string;
|
label: string;
|
||||||
target: AppExtensionTargetEnum;
|
target: AppExtensionTargetEnum;
|
||||||
|
params?: AppDetailsUrlMountQueryParams;
|
||||||
}
|
}
|
||||||
|
|
||||||
const ExternalAppContext = React.createContext<{
|
const ExternalAppContext = React.createContext<{
|
||||||
|
@ -55,7 +56,9 @@ export const useExternalApp = () => {
|
||||||
setOpen(true);
|
setOpen(true);
|
||||||
setAppData(appData);
|
setAppData(appData);
|
||||||
} else {
|
} else {
|
||||||
navigate(appDeepUrl(appData.id, appData.src), { resetScroll: true });
|
navigate(appDeepUrl(appData.id, appData.src, appData.params), {
|
||||||
|
resetScroll: true,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -19,8 +19,14 @@ export type AppListUrlQueryParams = ActiveTab &
|
||||||
SingleAction &
|
SingleAction &
|
||||||
Pagination;
|
Pagination;
|
||||||
|
|
||||||
|
export interface AppDetailsUrlMountQueryParams {
|
||||||
|
productId?: string;
|
||||||
|
orderId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export type AppDetailsUrlQueryParams = Dialog<AppDetailsUrlDialog> &
|
export type AppDetailsUrlQueryParams = Dialog<AppDetailsUrlDialog> &
|
||||||
SingleAction;
|
SingleAction &
|
||||||
|
AppDetailsUrlMountQueryParams;
|
||||||
|
|
||||||
export type AppInstallUrlQueryParams = Partial<{ [MANIFEST_ATTR]: string }>;
|
export type AppInstallUrlQueryParams = Partial<{ [MANIFEST_ATTR]: string }>;
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@ import { RelayToFlat } from "@saleor/types";
|
||||||
import { mapEdgesToItems } from "@saleor/utils/maps";
|
import { mapEdgesToItems } from "@saleor/utils/maps";
|
||||||
|
|
||||||
import { AppData, useExternalApp } from "./components/ExternalAppContext";
|
import { AppData, useExternalApp } from "./components/ExternalAppContext";
|
||||||
|
import { AppDetailsUrlMountQueryParams } from "./urls";
|
||||||
|
|
||||||
export interface Extension {
|
export interface Extension {
|
||||||
id: string;
|
id: string;
|
||||||
|
@ -20,6 +21,11 @@ export interface Extension {
|
||||||
url: string;
|
url: string;
|
||||||
open(): void;
|
open(): void;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export interface ExtensionWithParams extends Omit<Extension, "open"> {
|
||||||
|
open(params: AppDetailsUrlMountQueryParams): void;
|
||||||
|
}
|
||||||
|
|
||||||
export const extensionMountPoints = {
|
export const extensionMountPoints = {
|
||||||
PRODUCT_LIST: [
|
PRODUCT_LIST: [
|
||||||
AppExtensionMountEnum.PRODUCT_OVERVIEW_CREATE,
|
AppExtensionMountEnum.PRODUCT_OVERVIEW_CREATE,
|
||||||
|
@ -44,7 +50,7 @@ export const extensionMountPoints = {
|
||||||
const filterAndMapToTarget = (
|
const filterAndMapToTarget = (
|
||||||
extensions: RelayToFlat<ExtensionListQuery["appExtensions"]>,
|
extensions: RelayToFlat<ExtensionListQuery["appExtensions"]>,
|
||||||
openApp: (appData: AppData) => void,
|
openApp: (appData: AppData) => void,
|
||||||
): Extension[] =>
|
): ExtensionWithParams[] =>
|
||||||
extensions.map(
|
extensions.map(
|
||||||
({ id, accessToken, permissions, url, label, mount, target, app }) => ({
|
({ id, accessToken, permissions, url, label, mount, target, app }) => ({
|
||||||
id,
|
id,
|
||||||
|
@ -54,17 +60,45 @@ const filterAndMapToTarget = (
|
||||||
url,
|
url,
|
||||||
label,
|
label,
|
||||||
mount,
|
mount,
|
||||||
open: () =>
|
open: (params: AppDetailsUrlMountQueryParams) =>
|
||||||
openApp({ id: app.id, appToken: accessToken, src: url, label, target }),
|
openApp({
|
||||||
|
id: app.id,
|
||||||
|
appToken: accessToken,
|
||||||
|
src: url,
|
||||||
|
label,
|
||||||
|
target,
|
||||||
|
params,
|
||||||
|
}),
|
||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
|
|
||||||
export const mapToMenuItems = (extensions: Extension[]) =>
|
const mapToMenuItem = ({ label, id, open }: Extension) => ({
|
||||||
extensions.map(({ label, id, open }) => ({
|
label,
|
||||||
label,
|
testId: `extension-${id}`,
|
||||||
testId: `extension-${id}`,
|
onSelect: open,
|
||||||
onSelect: open,
|
});
|
||||||
}));
|
|
||||||
|
export const mapToMenuItems = (extensions: ExtensionWithParams[]) =>
|
||||||
|
extensions.map(mapToMenuItem);
|
||||||
|
|
||||||
|
export const mapToMenuItemsForProductDetails = (
|
||||||
|
extensions: ExtensionWithParams[],
|
||||||
|
productId: string,
|
||||||
|
) =>
|
||||||
|
extensions.map(extension =>
|
||||||
|
mapToMenuItem({ ...extension, open: () => extension.open({ productId }) }),
|
||||||
|
);
|
||||||
|
|
||||||
|
export const mapToMenuItemsForOrderDetails = (
|
||||||
|
extensions: ExtensionWithParams[],
|
||||||
|
orderId?: string,
|
||||||
|
) =>
|
||||||
|
extensions.map(extension =>
|
||||||
|
mapToMenuItem({
|
||||||
|
...extension,
|
||||||
|
open: () => extension.open({ orderId }),
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
export const useExtensions = <T extends AppExtensionMountEnum>(
|
export const useExtensions = <T extends AppExtensionMountEnum>(
|
||||||
mountList: T[],
|
mountList: T[],
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Typography } from "@material-ui/core";
|
import { Typography } from "@material-ui/core";
|
||||||
import {
|
import {
|
||||||
extensionMountPoints,
|
extensionMountPoints,
|
||||||
mapToMenuItems,
|
mapToMenuItemsForOrderDetails,
|
||||||
useExtensions,
|
useExtensions,
|
||||||
} from "@saleor/apps/useExtensions";
|
} from "@saleor/apps/useExtensions";
|
||||||
import { Backlink } from "@saleor/components/Backlink";
|
import { Backlink } from "@saleor/components/Backlink";
|
||||||
|
@ -225,7 +225,10 @@ const OrderDetailsPage: React.FC<OrderDetailsPageProps> = props => {
|
||||||
extensionMountPoints.ORDER_DETAILS,
|
extensionMountPoints.ORDER_DETAILS,
|
||||||
);
|
);
|
||||||
|
|
||||||
const extensionMenuItems = mapToMenuItems(ORDER_DETAILS_MORE_ACTIONS);
|
const extensionMenuItems = mapToMenuItemsForOrderDetails(
|
||||||
|
ORDER_DETAILS_MORE_ACTIONS,
|
||||||
|
order?.id,
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Form confirmLeave initial={initial} onSubmit={handleSubmit}>
|
<Form confirmLeave initial={initial} onSubmit={handleSubmit}>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { OutputData } from "@editorjs/editorjs";
|
import { OutputData } from "@editorjs/editorjs";
|
||||||
import {
|
import {
|
||||||
extensionMountPoints,
|
extensionMountPoints,
|
||||||
mapToMenuItems,
|
mapToMenuItemsForProductDetails,
|
||||||
useExtensions,
|
useExtensions,
|
||||||
} from "@saleor/apps/useExtensions";
|
} from "@saleor/apps/useExtensions";
|
||||||
import {
|
import {
|
||||||
|
@ -252,7 +252,10 @@ export const ProductUpdatePage: React.FC<ProductUpdatePageProps> = ({
|
||||||
extensionMountPoints.PRODUCT_DETAILS,
|
extensionMountPoints.PRODUCT_DETAILS,
|
||||||
);
|
);
|
||||||
|
|
||||||
const extensionMenuItems = mapToMenuItems(PRODUCT_DETAILS_MORE_ACTIONS);
|
const extensionMenuItems = mapToMenuItemsForProductDetails(
|
||||||
|
PRODUCT_DETAILS_MORE_ACTIONS,
|
||||||
|
productId,
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ProductUpdateForm
|
<ProductUpdateForm
|
||||||
|
|
Loading…
Reference in a new issue