Add metadata editor to variant creator

This commit is contained in:
dominik-zeglen 2020-09-01 16:27:35 +02:00
parent ca78ecc19f
commit cb4e2fd050
2 changed files with 28 additions and 3 deletions

View file

@ -4,6 +4,7 @@ import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton";
import Container from "@saleor/components/Container"; import Container from "@saleor/components/Container";
import Form from "@saleor/components/Form"; import Form from "@saleor/components/Form";
import Grid from "@saleor/components/Grid"; import Grid from "@saleor/components/Grid";
import Metadata, { MetadataFormData } from "@saleor/components/Metadata";
import PageHeader from "@saleor/components/PageHeader"; import PageHeader from "@saleor/components/PageHeader";
import SaveButtonBar from "@saleor/components/SaveButtonBar"; import SaveButtonBar from "@saleor/components/SaveButtonBar";
import { ProductErrorFragment } from "@saleor/fragments/types/ProductErrorFragment"; import { ProductErrorFragment } from "@saleor/fragments/types/ProductErrorFragment";
@ -13,6 +14,7 @@ import useFormset, {
} from "@saleor/hooks/useFormset"; } from "@saleor/hooks/useFormset";
import { getVariantAttributeInputFromProduct } from "@saleor/products/utils/data"; import { getVariantAttributeInputFromProduct } from "@saleor/products/utils/data";
import { SearchWarehouses_search_edges_node } from "@saleor/searches/types/SearchWarehouses"; import { SearchWarehouses_search_edges_node } from "@saleor/searches/types/SearchWarehouses";
import useMetadataChangeTrigger from "@saleor/utils/metadata/useMetadataChangeTrigger";
import React from "react"; import React from "react";
import { useIntl } from "react-intl"; import { useIntl } from "react-intl";
@ -26,7 +28,7 @@ import ProductVariantAttributes, {
import ProductVariantNavigation from "../ProductVariantNavigation"; import ProductVariantNavigation from "../ProductVariantNavigation";
import ProductVariantPrice from "../ProductVariantPrice"; import ProductVariantPrice from "../ProductVariantPrice";
interface ProductVariantCreatePageFormData { interface ProductVariantCreatePageFormData extends MetadataFormData {
costPrice: string; costPrice: string;
images: string[]; images: string[];
price: string; price: string;
@ -83,11 +85,16 @@ const ProductVariantCreatePage: React.FC<ProductVariantCreatePageProps> = ({
data: stocks, data: stocks,
remove: removeStock remove: removeStock
} = useFormset<null, string>([]); } = useFormset<null, string>([]);
const {
makeChangeHandler: makeMetadataChangeHandler
} = useMetadataChangeTrigger();
const initialForm: ProductVariantCreatePageFormData = { const initialForm: ProductVariantCreatePageFormData = {
costPrice: "", costPrice: "",
images: maybe(() => product.images.map(image => image.id)), images: maybe(() => product.images.map(image => image.id)),
metadata: [],
price: "", price: "",
privateMetadata: [],
quantity: "0", quantity: "0",
sku: "", sku: "",
trackInventory: true, trackInventory: true,
@ -108,6 +115,7 @@ const ProductVariantCreatePage: React.FC<ProductVariantCreatePageProps> = ({
changeAttributeData(id, value); changeAttributeData(id, value);
triggerChange(); triggerChange();
}; };
const changeMetadata = makeMetadataChangeHandler(change);
return ( return (
<Container> <Container>
@ -176,6 +184,8 @@ const ProductVariantCreatePage: React.FC<ProductVariantCreatePageProps> = ({
removeStock(id); removeStock(id);
}} }}
/> />
<CardSpacer />
<Metadata data={data} onChange={changeMetadata} />
</div> </div>
</Grid> </Grid>
<SaveButtonBar <SaveButtonBar

View file

@ -4,6 +4,11 @@ import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier"; import useNotifier from "@saleor/hooks/useNotifier";
import useShop from "@saleor/hooks/useShop"; import useShop from "@saleor/hooks/useShop";
import { commonMessages } from "@saleor/intl"; import { commonMessages } from "@saleor/intl";
import createMetadataCreateHandler from "@saleor/utils/handlers/metadataCreateHandler";
import {
useMetadataUpdate,
usePrivateMetadataUpdate
} from "@saleor/utils/metadata/updateMetadata";
import { useWarehouseList } from "@saleor/warehouses/queries"; import { useWarehouseList } from "@saleor/warehouses/queries";
import React from "react"; import React from "react";
import { useIntl } from "react-intl"; import { useIntl } from "react-intl";
@ -55,6 +60,8 @@ export const ProductVariant: React.FC<ProductVariantCreateProps> = ({
} }
} }
}); });
const [updateMetadata] = useMetadataUpdate({});
const [updatePrivateMetadata] = usePrivateMetadataUpdate({});
const product = data?.product; const product = data?.product;
@ -63,8 +70,8 @@ export const ProductVariant: React.FC<ProductVariantCreateProps> = ({
} }
const handleBack = () => navigate(productUrl(productId)); const handleBack = () => navigate(productUrl(productId));
const handleSubmit = (formData: ProductVariantCreatePageSubmitData) => const handleCreate = async (formData: ProductVariantCreatePageSubmitData) => {
variantCreate({ const result = await variantCreate({
variables: { variables: {
input: { input: {
attributes: formData.attributes attributes: formData.attributes
@ -86,6 +93,14 @@ export const ProductVariant: React.FC<ProductVariantCreateProps> = ({
} }
} }
}); });
return result.data.productVariantCreate?.productVariant?.id || null;
};
const handleSubmit = createMetadataCreateHandler(
handleCreate,
updateMetadata,
updatePrivateMetadata
);
const handleVariantClick = (id: string) => const handleVariantClick = (id: string) =>
navigate(productVariantEditUrl(productId, id)); navigate(productVariantEditUrl(productId, id));