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:
Jonatan Witoszek 2022-06-24 14:17:58 +02:00 committed by GitHub
parent d48dcb87ab
commit 69eeb4c280
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 77 additions and 17 deletions

View file

@ -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

View file

@ -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)}

View file

@ -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,
});
} }
}; };

View file

@ -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 }>;

View file

@ -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[],

View file

@ -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}>

View file

@ -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