Merge pull request #985 from mirumee/SALEOR-2270/update-nullable-editor-js-fields

Saleor 2270/update nullable editor js fields
This commit is contained in:
mmarkusik 2021-02-22 15:34:26 +01:00 committed by GitHub
commit 626fa1336f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
61 changed files with 215 additions and 202 deletions

View file

@ -671,7 +671,7 @@ type Category implements Node & ObjectWithMetadata {
seoDescription: String
id: ID!
name: String!
description: JSONString!
description: JSONString
slug: String!
parent: Category
level: Int!
@ -746,7 +746,7 @@ type CategoryTranslatableContent implements Node {
seoDescription: String
id: ID!
name: String!
description: JSONString!
description: JSONString
descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.")
translation(languageCode: LanguageCodeEnum!): CategoryTranslation
category: Category
@ -763,7 +763,7 @@ type CategoryTranslation implements Node {
seoDescription: String
id: ID!
name: String!
description: JSONString!
description: JSONString
language: LanguageDisplay!
descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.")
}
@ -1050,7 +1050,7 @@ type Collection implements Node & ObjectWithMetadata {
seoDescription: String
id: ID!
name: String!
description: JSONString!
description: JSONString
slug: String!
privateMetadata: [MetadataItem]!
metadata: [MetadataItem]!
@ -1205,7 +1205,7 @@ type CollectionTranslatableContent implements Node {
seoDescription: String
id: ID!
name: String!
description: JSONString!
description: JSONString
descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.")
translation(languageCode: LanguageCodeEnum!): CollectionTranslation
collection: Collection
@ -1222,7 +1222,7 @@ type CollectionTranslation implements Node {
seoDescription: String
id: ID!
name: String!
description: JSONString!
description: JSONString
language: LanguageDisplay!
descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.")
}
@ -3307,7 +3307,7 @@ type Page implements Node & ObjectWithMetadata {
seoDescription: String
id: ID!
title: String!
content: JSONString!
content: JSONString
publicationDate: Date
isPublished: Boolean!
slug: String!
@ -3441,7 +3441,7 @@ type PageTranslatableContent implements Node {
seoDescription: String
id: ID!
title: String!
content: JSONString!
content: JSONString
contentJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `content` field instead.")
translation(languageCode: LanguageCodeEnum!): PageTranslation
page: Page
@ -3458,7 +3458,7 @@ type PageTranslation implements Node {
seoDescription: String
id: ID!
title: String!
content: JSONString!
content: JSONString
language: LanguageDisplay!
contentJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `content` field instead.")
}
@ -3834,7 +3834,7 @@ type Product implements Node & ObjectWithMetadata {
seoTitle: String
seoDescription: String
name: String!
description: JSONString!
description: JSONString
productType: ProductType!
slug: String!
category: Category
@ -4140,7 +4140,7 @@ type ProductTranslatableContent implements Node {
seoTitle: String
seoDescription: String
name: String!
description: JSONString!
description: JSONString
descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.")
translation(languageCode: LanguageCodeEnum!): ProductTranslation
product: Product
@ -4157,7 +4157,7 @@ type ProductTranslation implements Node {
seoTitle: String
seoDescription: String
name: String!
description: JSONString!
description: JSONString
language: LanguageDisplay!
descriptionJson: JSONString @deprecated(reason: "Will be removed in Saleor 4.0. Use the `description` field instead.")
}

View file

@ -39,7 +39,7 @@ export interface CategoryCreate_categoryCreate_category {
backgroundImage: CategoryCreate_categoryCreate_category_backgroundImage | null;
name: string;
slug: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
parent: CategoryCreate_categoryCreate_category_parent | null;

View file

@ -165,7 +165,7 @@ export interface CategoryDetails_category {
backgroundImage: CategoryDetails_category_backgroundImage | null;
name: string;
slug: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
parent: CategoryDetails_category_parent | null;

View file

@ -39,7 +39,7 @@ export interface CategoryUpdate_categoryUpdate_category {
backgroundImage: CategoryUpdate_categoryUpdate_category_backgroundImage | null;
name: string;
slug: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
parent: CategoryUpdate_categoryUpdate_category_parent | null;

View file

@ -1,6 +1,7 @@
import { WindowTitle } from "@saleor/components/WindowTitle";
import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier";
import { getParsedDataForJsonStringField } from "@saleor/translations/utils";
import createMetadataCreateHandler from "@saleor/utils/handlers/metadataCreateHandler";
import {
useMetadataUpdate,
@ -48,7 +49,7 @@ export const CategoryCreateView: React.FC<CategoryCreateViewProps> = ({
const result = await createCategory({
variables: {
input: {
description: JSON.stringify(formData.description),
description: getParsedDataForJsonStringField(formData.description),
name: formData.name,
seo: {
description: formData.seoDescription,

View file

@ -13,6 +13,7 @@ import usePaginator, {
createPaginationState
} from "@saleor/hooks/usePaginator";
import { commonMessages } from "@saleor/intl";
import { getParsedDataForJsonStringField } from "@saleor/translations/utils";
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler";
import { mapNodeToChoice } from "@saleor/utils/maps";
@ -188,7 +189,7 @@ export const CategoryDetails: React.FC<CategoryDetailsProps> = ({
id,
input: {
backgroundImageAlt: formData.backgroundImageAlt,
description: JSON.stringify(formData.description),
description: getParsedDataForJsonStringField(formData.description),
name: formData.name,
seo: {
description: formData.seoDescription,

View file

@ -102,7 +102,7 @@ export interface CollectionDetails_collection {
privateMetadata: (CollectionDetails_collection_privateMetadata | null)[];
backgroundImage: CollectionDetails_collection_backgroundImage | null;
slug: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
products: CollectionDetails_collection_products | null;

View file

@ -48,7 +48,7 @@ export interface CollectionUpdate_collectionUpdate_collection {
privateMetadata: (CollectionUpdate_collectionUpdate_collection_privateMetadata | null)[];
backgroundImage: CollectionUpdate_collectionUpdate_collection_backgroundImage | null;
slug: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
}

View file

@ -48,7 +48,7 @@ export interface CreateCollection_collectionCreate_collection {
privateMetadata: (CreateCollection_collectionCreate_collection_privateMetadata | null)[];
backgroundImage: CreateCollection_collectionCreate_collection_backgroundImage | null;
slug: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
}

View file

@ -7,6 +7,7 @@ import useChannels from "@saleor/hooks/useChannels";
import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier";
import { commonMessages } from "@saleor/intl";
import { getParsedDataForJsonStringField } from "@saleor/translations/utils";
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
import createMetadataCreateHandler from "@saleor/utils/handlers/metadataCreateHandler";
import {
@ -102,7 +103,7 @@ export const CollectionCreate: React.FC<CollectionCreateProps> = ({
input: {
backgroundImage: formData.backgroundImage.value,
backgroundImageAlt: formData.backgroundImageAlt,
description: JSON.stringify(formData.description),
description: getParsedDataForJsonStringField(formData.description),
name: formData.name,
seo: {
description: formData.seoDescription,

View file

@ -21,6 +21,7 @@ import usePaginator, {
} from "@saleor/hooks/usePaginator";
import { commonMessages } from "@saleor/intl";
import useProductSearch from "@saleor/searches/useProductSearch";
import { getParsedDataForJsonStringField } from "@saleor/translations/utils";
import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers";
import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler";
import {
@ -198,7 +199,7 @@ export const CollectionDetails: React.FC<CollectionDetailsProps> = ({
const handleUpdate = async (formData: CollectionUpdateData) => {
const input: CollectionInput = {
backgroundImageAlt: formData.backgroundImageAlt,
description: JSON.stringify(formData.description),
description: getParsedDataForJsonStringField(formData.description),
name: formData.name,
seo: {
description: formData.seoDescription,

View file

@ -37,7 +37,7 @@ export interface CategoryDetailsFragment {
backgroundImage: CategoryDetailsFragment_backgroundImage | null;
name: string;
slug: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
parent: CategoryDetailsFragment_parent | null;

View file

@ -14,7 +14,7 @@ export interface CategoryTranslationFragment_translation_language {
export interface CategoryTranslationFragment_translation {
__typename: "CategoryTranslation";
id: string;
description: any;
description: any | null;
language: CategoryTranslationFragment_translation_language;
name: string;
seoDescription: string | null;
@ -25,7 +25,7 @@ export interface CategoryTranslationFragment_category {
__typename: "Category";
id: string;
name: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
}

View file

@ -46,7 +46,7 @@ export interface CollectionDetailsFragment {
privateMetadata: (CollectionDetailsFragment_privateMetadata | null)[];
backgroundImage: CollectionDetailsFragment_backgroundImage | null;
slug: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
}

View file

@ -10,7 +10,7 @@ export interface CollectionTranslationFragment_collection {
__typename: "Collection";
id: string;
name: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
}
@ -23,7 +23,7 @@ export interface CollectionTranslationFragment_translation_language {
export interface CollectionTranslationFragment_translation {
__typename: "CollectionTranslation";
id: string;
description: any;
description: any | null;
language: CollectionTranslationFragment_translation_language;
name: string;
seoDescription: string | null;

View file

@ -109,7 +109,7 @@ export interface PageDetailsFragment {
pageType: PageDetailsFragment_pageType;
metadata: (PageDetailsFragment_metadata | null)[];
privateMetadata: (PageDetailsFragment_privateMetadata | null)[];
content: any;
content: any | null;
seoTitle: string | null;
seoDescription: string | null;
publicationDate: any | null;

View file

@ -17,7 +17,7 @@ export interface PageTranslatableFragment_translation_language {
export interface PageTranslatableFragment_translation {
__typename: "PageTranslation";
id: string;
content: any;
content: any | null;
seoDescription: string | null;
seoTitle: string | null;
title: string;
@ -27,7 +27,7 @@ export interface PageTranslatableFragment_translation {
export interface PageTranslatableFragment {
__typename: "PageTranslatableContent";
id: string;
content: any;
content: any | null;
seoDescription: string | null;
seoTitle: string | null;
title: string;

View file

@ -11,7 +11,7 @@ import { LanguageCodeEnum } from "./../../types/globalTypes";
export interface PageTranslationFragment_page {
__typename: "Page";
id: string;
content: any;
content: any | null;
seoDescription: string | null;
seoTitle: string | null;
title: string;
@ -26,7 +26,7 @@ export interface PageTranslationFragment_translation_language {
export interface PageTranslationFragment_translation {
__typename: "PageTranslation";
id: string;
content: any;
content: any | null;
seoDescription: string | null;
seoTitle: string | null;
title: string;

View file

@ -253,7 +253,7 @@ export interface Product {
privateMetadata: (Product_privateMetadata | null)[];
name: string;
slug: string;
description: any;
description: any | null;
seoTitle: string | null;
seoDescription: string | null;
rating: number | null;

View file

@ -12,7 +12,7 @@ export interface ProductTranslationFragment_product {
__typename: "Product";
id: string;
name: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
}
@ -26,7 +26,7 @@ export interface ProductTranslationFragment_translation_language {
export interface ProductTranslationFragment_translation {
__typename: "ProductTranslation";
id: string;
description: any;
description: any | null;
language: ProductTranslationFragment_translation_language;
name: string;
seoDescription: string | null;

View file

@ -122,7 +122,7 @@ function usePageForm(
title: page?.title || ""
});
const [content, changeContent] = useRichText({
initial: pageExists ? page?.content : null,
initial: page?.content,
triggerChange
});

View file

@ -117,7 +117,7 @@ export interface PageCreate_pageCreate_page {
pageType: PageCreate_pageCreate_page_pageType;
metadata: (PageCreate_pageCreate_page_metadata | null)[];
privateMetadata: (PageCreate_pageCreate_page_privateMetadata | null)[];
content: any;
content: any | null;
seoTitle: string | null;
seoDescription: string | null;
publicationDate: any | null;

View file

@ -109,7 +109,7 @@ export interface PageDetails_page {
pageType: PageDetails_page_pageType;
metadata: (PageDetails_page_metadata | null)[];
privateMetadata: (PageDetails_page_privateMetadata | null)[];
content: any;
content: any | null;
seoTitle: string | null;
seoDescription: string | null;
publicationDate: any | null;

View file

@ -116,7 +116,7 @@ export interface PageUpdate_pageUpdate_page {
pageType: PageUpdate_pageUpdate_page_pageType;
metadata: (PageUpdate_pageUpdate_page_metadata | null)[];
privateMetadata: (PageUpdate_pageUpdate_page_privateMetadata | null)[];
content: any;
content: any | null;
seoTitle: string | null;
seoDescription: string | null;
publicationDate: any | null;

View file

@ -12,6 +12,7 @@ import useNotifier from "@saleor/hooks/useNotifier";
import usePageSearch from "@saleor/searches/usePageSearch";
import usePageTypeSearch from "@saleor/searches/usePageTypeSearch";
import useProductSearch from "@saleor/searches/useProductSearch";
import { getParsedDataForJsonStringField } from "@saleor/translations/utils";
import createMetadataCreateHandler from "@saleor/utils/handlers/metadataCreateHandler";
import {
useMetadataUpdate,
@ -128,7 +129,7 @@ export const PageCreate: React.FC<PageCreateProps> = ({ params }) => {
attributes: formData.attributes,
updatedFileAttributes
}),
content: JSON.stringify(formData.content),
content: getParsedDataForJsonStringField(formData.content),
isPublished: formData.isPublished,
pageType: formData.pageType,
publicationDate: formData.publicationDate,

View file

@ -23,6 +23,7 @@ import useNotifier from "@saleor/hooks/useNotifier";
import { commonMessages } from "@saleor/intl";
import usePageSearch from "@saleor/searches/usePageSearch";
import useProductSearch from "@saleor/searches/useProductSearch";
import { getParsedDataForJsonStringField } from "@saleor/translations/utils";
import createMetadataUpdateHandler from "@saleor/utils/handlers/metadataUpdateHandler";
import {
useMetadataUpdate,
@ -53,7 +54,7 @@ const createPageInput = (
attributes: data.attributes,
updatedFileAttributes
}),
content: JSON.stringify(data.content),
content: getParsedDataForJsonStringField(data.content),
isPublished: data.isPublished,
publicationDate: data.publicationDate,
seo: {

View file

@ -253,7 +253,7 @@ export interface ProductChannelListingUpdate_productChannelListingUpdate_product
privateMetadata: (ProductChannelListingUpdate_productChannelListingUpdate_product_privateMetadata | null)[];
name: string;
slug: string;
description: any;
description: any | null;
seoTitle: string | null;
seoDescription: string | null;
rating: number | null;

View file

@ -260,7 +260,7 @@ export interface ProductCreate_productCreate_product {
privateMetadata: (ProductCreate_productCreate_product_privateMetadata | null)[];
name: string;
slug: string;
description: any;
description: any | null;
seoTitle: string | null;
seoDescription: string | null;
rating: number | null;

View file

@ -253,7 +253,7 @@ export interface ProductDetails_product {
privateMetadata: (ProductDetails_product_privateMetadata | null)[];
name: string;
slug: string;
description: any;
description: any | null;
seoTitle: string | null;
seoDescription: string | null;
rating: number | null;

View file

@ -259,7 +259,7 @@ export interface ProductImageCreate_productImageCreate_product {
privateMetadata: (ProductImageCreate_productImageCreate_product_privateMetadata | null)[];
name: string;
slug: string;
description: any;
description: any | null;
seoTitle: string | null;
seoDescription: string | null;
rating: number | null;

View file

@ -259,7 +259,7 @@ export interface ProductImageUpdate_productImageUpdate_product {
privateMetadata: (ProductImageUpdate_productImageUpdate_product_privateMetadata | null)[];
name: string;
slug: string;
description: any;
description: any | null;
seoTitle: string | null;
seoDescription: string | null;
rating: number | null;

View file

@ -260,7 +260,7 @@ export interface ProductUpdate_productUpdate_product {
privateMetadata: (ProductUpdate_productUpdate_product_privateMetadata | null)[];
name: string;
slug: string;
description: any;
description: any | null;
seoTitle: string | null;
seoDescription: string | null;
rating: number | null;

View file

@ -259,7 +259,7 @@ export interface ProductVariantReorder_productVariantReorder_product {
privateMetadata: (ProductVariantReorder_productVariantReorder_product_privateMetadata | null)[];
name: string;
slug: string;
description: any;
description: any | null;
seoTitle: string | null;
seoDescription: string | null;
rating: number | null;

View file

@ -259,7 +259,7 @@ export interface ProductVariantSetDefault_productVariantSetDefault_product {
privateMetadata: (ProductVariantSetDefault_productVariantSetDefault_product_privateMetadata | null)[];
name: string;
slug: string;
description: any;
description: any | null;
seoTitle: string | null;
seoDescription: string | null;
rating: number | null;

View file

@ -260,7 +260,7 @@ export interface SimpleProductUpdate_productUpdate_product {
privateMetadata: (SimpleProductUpdate_productUpdate_product_privateMetadata | null)[];
name: string;
slug: string;
description: any;
description: any | null;
seoTitle: string | null;
seoDescription: string | null;
rating: number | null;

View file

@ -37,6 +37,7 @@ import {
} from "@saleor/products/types/VariantCreate";
import { getAvailabilityVariables } from "@saleor/products/utils/handlers";
import { SearchProductTypes_search_edges_node } from "@saleor/searches/types/SearchProductTypes";
import { getParsedDataForJsonStringField } from "@saleor/translations/utils";
import { MutationFetchResult } from "react-apollo";
const getChannelsVariables = (productId: string, channels: ChannelData[]) => ({
@ -108,7 +109,7 @@ export function createHandler(
category: formData.category,
chargeTaxes: formData.chargeTaxes,
collections: formData.collections,
description: JSON.stringify(formData.description),
description: getParsedDataForJsonStringField(formData.description),
name: formData.name,
productType: formData.productType?.id,
rating: formData.rating,

View file

@ -56,6 +56,7 @@ import {
} from "@saleor/products/types/VariantCreate";
import { mapFormsetStockToStockInput } from "@saleor/products/utils/data";
import { getAvailabilityVariables } from "@saleor/products/utils/handlers";
import { getParsedDataForJsonStringField } from "@saleor/translations/utils";
import { ReorderEvent } from "@saleor/types";
import { move } from "@saleor/utils/lists";
import { diff } from "fast-array-diff";
@ -185,7 +186,7 @@ export function createUpdateHandler(
category: data.category,
chargeTaxes: data.chargeTaxes,
collections: data.collections,
description: JSON.stringify(data.description),
description: getParsedDataForJsonStringField(data.description),
name: data.name,
rating: data.rating,
seo: {

View file

@ -5,7 +5,10 @@ import LanguageSwitch from "@saleor/components/LanguageSwitch";
import PageHeader from "@saleor/components/PageHeader";
import { CategoryTranslationFragment } from "@saleor/fragments/types/CategoryTranslationFragment";
import { commonMessages, sectionNames } from "@saleor/intl";
import { TranslationsEntitiesPageProps } from "@saleor/translations/types";
import {
TranslationInputFieldName,
TranslationsEntitiesPageProps
} from "@saleor/translations/types";
import React from "react";
import { useIntl } from "react-intl";
@ -17,13 +20,6 @@ export interface TranslationsCategoriesPageProps
data: CategoryTranslationFragment;
}
export const fieldNames = {
description: "description",
name: "name",
seoDescription: "seoDescription",
seoTitle: "seoTitle"
};
const TranslationsCategoriesPage: React.FC<TranslationsCategoriesPageProps> = ({
activeField,
disabled,
@ -72,14 +68,14 @@ const TranslationsCategoriesPage: React.FC<TranslationsCategoriesPageProps> = ({
displayName: intl.formatMessage({
defaultMessage: "Category Name"
}),
name: fieldNames.name,
name: TranslationInputFieldName.name,
translation: data?.translation?.name || null,
type: "short" as "short",
value: data?.category?.name
},
{
displayName: intl.formatMessage(commonMessages.description),
name: fieldNames.description,
name: TranslationInputFieldName.description,
translation: data?.translation?.description || null,
type: "rich" as "rich",
value: data?.category?.description
@ -103,7 +99,7 @@ const TranslationsCategoriesPage: React.FC<TranslationsCategoriesPageProps> = ({
displayName: intl.formatMessage({
defaultMessage: "Search Engine Title"
}),
name: fieldNames.seoTitle,
name: TranslationInputFieldName.seoTitle,
translation: data?.translation?.seoTitle || null,
type: "short" as "short",
value: data?.category?.seoTitle
@ -112,7 +108,7 @@ const TranslationsCategoriesPage: React.FC<TranslationsCategoriesPageProps> = ({
displayName: intl.formatMessage({
defaultMessage: "Search Engine Description"
}),
name: fieldNames.seoDescription,
name: TranslationInputFieldName.seoDescription,
translation: data?.translation?.seoDescription || null,
type: "long" as "long",
value: data?.category?.seoDescription

View file

@ -5,7 +5,10 @@ import LanguageSwitch from "@saleor/components/LanguageSwitch";
import PageHeader from "@saleor/components/PageHeader";
import { CollectionTranslationFragment } from "@saleor/fragments/types/CollectionTranslationFragment";
import { commonMessages, sectionNames } from "@saleor/intl";
import { TranslationsEntitiesPageProps } from "@saleor/translations/types";
import {
TranslationInputFieldName,
TranslationsEntitiesPageProps
} from "@saleor/translations/types";
import React from "react";
import { useIntl } from "react-intl";
@ -17,13 +20,6 @@ export interface TranslationsCollectionsPageProps
data: CollectionTranslationFragment;
}
export const fieldNames = {
description: "description",
name: "name",
seoDescription: "seoDescription",
seoTitle: "seoTitle"
};
const TranslationsCollectionsPage: React.FC<TranslationsCollectionsPageProps> = ({
activeField,
disabled,
@ -73,14 +69,14 @@ const TranslationsCollectionsPage: React.FC<TranslationsCollectionsPageProps> =
displayName: intl.formatMessage({
defaultMessage: "Collection Name"
}),
name: fieldNames.name,
name: TranslationInputFieldName.name,
translation: data?.translation?.name || null,
type: "short" as "short",
value: data?.collection?.name
},
{
displayName: intl.formatMessage(commonMessages.description),
name: fieldNames.description,
name: TranslationInputFieldName.description,
translation: data?.translation?.description || null,
type: "rich" as "rich",
value: data?.collection?.description
@ -104,7 +100,7 @@ const TranslationsCollectionsPage: React.FC<TranslationsCollectionsPageProps> =
displayName: intl.formatMessage({
defaultMessage: "Search Engine Title"
}),
name: fieldNames.seoTitle,
name: TranslationInputFieldName.seoTitle,
translation: data?.translation?.seoTitle || null,
type: "short" as "short",
value: data?.collection?.seoTitle
@ -113,7 +109,7 @@ const TranslationsCollectionsPage: React.FC<TranslationsCollectionsPageProps> =
displayName: intl.formatMessage({
defaultMessage: "Search Engine Description"
}),
name: fieldNames.seoDescription,
name: TranslationInputFieldName.seoDescription,
translation: data?.translation?.seoDescription || null,
type: "long" as "long",
value: data?.collection?.seoDescription

View file

@ -5,7 +5,10 @@ import LanguageSwitch from "@saleor/components/LanguageSwitch";
import PageHeader from "@saleor/components/PageHeader";
import { PageTranslationFragment } from "@saleor/fragments/types/PageTranslationFragment";
import { commonMessages, sectionNames } from "@saleor/intl";
import { TranslationsEntitiesPageProps } from "@saleor/translations/types";
import {
PageTranslationInputFieldName,
TranslationsEntitiesPageProps
} from "@saleor/translations/types";
import React from "react";
import { useIntl } from "react-intl";
@ -17,13 +20,6 @@ export interface TranslationsPagesPageProps
data: PageTranslationFragment;
}
export const fieldNames = {
content: "content",
seoDescription: "seoDescription",
seoTitle: "seoTitle",
title: "title"
};
const TranslationsPagesPage: React.FC<TranslationsPagesPageProps> = ({
activeField,
disabled,
@ -72,7 +68,7 @@ const TranslationsPagesPage: React.FC<TranslationsPagesPageProps> = ({
displayName: intl.formatMessage({
defaultMessage: "Page Title"
}),
name: fieldNames.title,
name: PageTranslationInputFieldName.title,
translation: data?.translation?.title || null,
type: "short" as "short",
value: data?.page?.title
@ -82,7 +78,7 @@ const TranslationsPagesPage: React.FC<TranslationsPagesPageProps> = ({
defaultMessage: "Content",
description: "page content"
}),
name: fieldNames.content,
name: PageTranslationInputFieldName.content,
translation: data?.translation?.content || null,
type: "rich" as "rich",
value: data?.page?.content
@ -106,7 +102,7 @@ const TranslationsPagesPage: React.FC<TranslationsPagesPageProps> = ({
displayName: intl.formatMessage({
defaultMessage: "Search Engine Title"
}),
name: fieldNames.seoTitle,
name: PageTranslationInputFieldName.seoTitle,
translation: data?.translation?.seoTitle || null,
type: "short" as "short",
value: data?.page?.seoTitle
@ -115,7 +111,7 @@ const TranslationsPagesPage: React.FC<TranslationsPagesPageProps> = ({
displayName: intl.formatMessage({
defaultMessage: "Search Engine Description"
}),
name: fieldNames.seoDescription,
name: PageTranslationInputFieldName.seoDescription,
translation: data?.translation?.seoDescription || null,
type: "long" as "long",
value: data?.page?.seoDescription

View file

@ -5,7 +5,10 @@ import LanguageSwitch from "@saleor/components/LanguageSwitch";
import PageHeader from "@saleor/components/PageHeader";
import { ProductTranslationFragment } from "@saleor/fragments/types/ProductTranslationFragment";
import { commonMessages, sectionNames } from "@saleor/intl";
import { TranslationsEntitiesPageProps } from "@saleor/translations/types";
import {
TranslationInputFieldName,
TranslationsEntitiesPageProps
} from "@saleor/translations/types";
import React from "react";
import { useIntl } from "react-intl";
@ -17,13 +20,6 @@ export interface TranslationsProductsPageProps
data: ProductTranslationFragment;
}
export const fieldNames = {
description: "description",
name: "name",
seoDescription: "seoDescription",
seoTitle: "seoTitle"
};
const TranslationsProductsPage: React.FC<TranslationsProductsPageProps> = ({
activeField,
disabled,
@ -73,7 +69,7 @@ const TranslationsProductsPage: React.FC<TranslationsProductsPageProps> = ({
displayName: intl.formatMessage({
defaultMessage: "Product Name"
}),
name: fieldNames.name,
name: TranslationInputFieldName.name,
translation: data?.translation?.name || null,
type: "short" as "short",
value: data?.product?.name
@ -82,7 +78,7 @@ const TranslationsProductsPage: React.FC<TranslationsProductsPageProps> = ({
displayName: intl.formatMessage({
defaultMessage: "Description"
}),
name: fieldNames.description,
name: TranslationInputFieldName.description,
translation: data?.translation?.description || null,
type: "rich" as "rich",
value: data?.product?.description
@ -106,7 +102,7 @@ const TranslationsProductsPage: React.FC<TranslationsProductsPageProps> = ({
displayName: intl.formatMessage({
defaultMessage: "Search Engine Title"
}),
name: fieldNames.seoTitle,
name: TranslationInputFieldName.seoTitle,
translation: data?.translation?.seoTitle || null,
type: "short" as "short",
value: data?.product?.seoTitle
@ -115,7 +111,7 @@ const TranslationsProductsPage: React.FC<TranslationsProductsPageProps> = ({
displayName: intl.formatMessage({
defaultMessage: "Search Engine Description"
}),
name: fieldNames.seoDescription,
name: TranslationInputFieldName.seoDescription,
translation: data?.translation?.seoDescription || null,
type: "long" as "long",
value: data?.product?.seoDescription

View file

@ -107,6 +107,7 @@ const updateCategoryTranslations = gql`
}
}
`;
export const TypedUpdateCategoryTranslations = TypedMutation<
UpdateCategoryTranslations,
UpdateCategoryTranslationsVariables
@ -143,6 +144,7 @@ const updateCollectionTranslations = gql`
}
}
`;
export const TypedUpdateCollectionTranslations = TypedMutation<
UpdateCollectionTranslations,
UpdateCollectionTranslationsVariables

View file

@ -14,3 +14,17 @@ export interface TranslationsEntitiesPageProps {
onLanguageChange: (lang: string) => void;
onSubmit: (field: string, data: string | OutputData) => void;
}
export enum TranslationInputFieldName {
description = "description",
name = "name",
seoDescription = "seoDescription",
seoTitle = "seoTitle"
}
export enum PageTranslationInputFieldName {
content = "content",
title = "title",
seoDescription = "seoDescription",
seoTitle = "seoTitle"
}

View file

@ -20,7 +20,7 @@ export interface CategoryTranslationDetails_translation_CategoryTranslatableCont
export interface CategoryTranslationDetails_translation_CategoryTranslatableContent_translation {
__typename: "CategoryTranslation";
id: string;
description: any;
description: any | null;
language: CategoryTranslationDetails_translation_CategoryTranslatableContent_translation_language;
name: string;
seoDescription: string | null;
@ -31,7 +31,7 @@ export interface CategoryTranslationDetails_translation_CategoryTranslatableCont
__typename: "Category";
id: string;
name: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
}

View file

@ -20,7 +20,7 @@ export interface CategoryTranslations_translations_edges_node_CategoryTranslatab
export interface CategoryTranslations_translations_edges_node_CategoryTranslatableContent_translation {
__typename: "CategoryTranslation";
id: string;
description: any;
description: any | null;
language: CategoryTranslations_translations_edges_node_CategoryTranslatableContent_translation_language;
name: string;
seoDescription: string | null;
@ -31,7 +31,7 @@ export interface CategoryTranslations_translations_edges_node_CategoryTranslatab
__typename: "Category";
id: string;
name: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
}

View file

@ -16,7 +16,7 @@ export interface CollectionTranslationDetails_translation_CollectionTranslatable
__typename: "Collection";
id: string;
name: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
}
@ -29,7 +29,7 @@ export interface CollectionTranslationDetails_translation_CollectionTranslatable
export interface CollectionTranslationDetails_translation_CollectionTranslatableContent_translation {
__typename: "CollectionTranslation";
id: string;
description: any;
description: any | null;
language: CollectionTranslationDetails_translation_CollectionTranslatableContent_translation_language;
name: string;
seoDescription: string | null;

View file

@ -16,7 +16,7 @@ export interface CollectionTranslations_translations_edges_node_CollectionTransl
__typename: "Collection";
id: string;
name: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
}
@ -29,7 +29,7 @@ export interface CollectionTranslations_translations_edges_node_CollectionTransl
export interface CollectionTranslations_translations_edges_node_CollectionTranslatableContent_translation {
__typename: "CollectionTranslation";
id: string;
description: any;
description: any | null;
language: CollectionTranslations_translations_edges_node_CollectionTranslatableContent_translation_language;
name: string;
seoDescription: string | null;

View file

@ -15,7 +15,7 @@ export interface PageTranslationDetails_translation_ProductTranslatableContent {
export interface PageTranslationDetails_translation_PageTranslatableContent_page {
__typename: "Page";
id: string;
content: any;
content: any | null;
seoDescription: string | null;
seoTitle: string | null;
title: string;
@ -30,7 +30,7 @@ export interface PageTranslationDetails_translation_PageTranslatableContent_tran
export interface PageTranslationDetails_translation_PageTranslatableContent_translation {
__typename: "PageTranslation";
id: string;
content: any;
content: any | null;
seoDescription: string | null;
seoTitle: string | null;
title: string;

View file

@ -15,7 +15,7 @@ export interface PageTranslations_translations_edges_node_ProductTranslatableCon
export interface PageTranslations_translations_edges_node_PageTranslatableContent_page {
__typename: "Page";
id: string;
content: any;
content: any | null;
seoDescription: string | null;
seoTitle: string | null;
title: string;
@ -30,7 +30,7 @@ export interface PageTranslations_translations_edges_node_PageTranslatableConten
export interface PageTranslations_translations_edges_node_PageTranslatableContent_translation {
__typename: "PageTranslation";
id: string;
content: any;
content: any | null;
seoDescription: string | null;
seoTitle: string | null;
title: string;

View file

@ -16,7 +16,7 @@ export interface ProductTranslationDetails_translation_ProductTranslatableConten
__typename: "Product";
id: string;
name: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
}
@ -30,7 +30,7 @@ export interface ProductTranslationDetails_translation_ProductTranslatableConten
export interface ProductTranslationDetails_translation_ProductTranslatableContent_translation {
__typename: "ProductTranslation";
id: string;
description: any;
description: any | null;
language: ProductTranslationDetails_translation_ProductTranslatableContent_translation_language;
name: string;
seoDescription: string | null;

View file

@ -16,7 +16,7 @@ export interface ProductTranslations_translations_edges_node_ProductTranslatable
__typename: "Product";
id: string;
name: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
}
@ -30,7 +30,7 @@ export interface ProductTranslations_translations_edges_node_ProductTranslatable
export interface ProductTranslations_translations_edges_node_ProductTranslatableContent_translation {
__typename: "ProductTranslation";
id: string;
description: any;
description: any | null;
language: ProductTranslations_translations_edges_node_ProductTranslatableContent_translation_language;
name: string;
seoDescription: string | null;

View file

@ -22,7 +22,7 @@ export interface UpdateCategoryTranslations_categoryTranslate_category_translati
export interface UpdateCategoryTranslations_categoryTranslate_category_translation {
__typename: "CategoryTranslation";
id: string;
description: any;
description: any | null;
language: UpdateCategoryTranslations_categoryTranslate_category_translation_language;
name: string;
seoDescription: string | null;
@ -33,7 +33,7 @@ export interface UpdateCategoryTranslations_categoryTranslate_category {
__typename: "Category";
id: string;
name: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
translation: UpdateCategoryTranslations_categoryTranslate_category_translation | null;

View file

@ -22,7 +22,7 @@ export interface UpdateCollectionTranslations_collectionTranslate_collection_tra
export interface UpdateCollectionTranslations_collectionTranslate_collection_translation {
__typename: "CollectionTranslation";
id: string;
description: any;
description: any | null;
language: UpdateCollectionTranslations_collectionTranslate_collection_translation_language;
name: string;
seoDescription: string | null;
@ -33,7 +33,7 @@ export interface UpdateCollectionTranslations_collectionTranslate_collection {
__typename: "Collection";
id: string;
name: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
translation: UpdateCollectionTranslations_collectionTranslate_collection_translation | null;

View file

@ -17,7 +17,7 @@ export interface UpdatePageTranslations_pageTranslate_errors {
export interface UpdatePageTranslations_pageTranslate_page_page {
__typename: "Page";
id: string;
content: any;
content: any | null;
seoDescription: string | null;
seoTitle: string | null;
title: string;
@ -32,7 +32,7 @@ export interface UpdatePageTranslations_pageTranslate_page_translation_language
export interface UpdatePageTranslations_pageTranslate_page_translation {
__typename: "PageTranslation";
id: string;
content: any;
content: any | null;
seoDescription: string | null;
seoTitle: string | null;
title: string;

View file

@ -23,7 +23,7 @@ export interface UpdateProductTranslations_productTranslate_product_translation_
export interface UpdateProductTranslations_productTranslate_product_translation {
__typename: "ProductTranslation";
id: string;
description: any;
description: any | null;
language: UpdateProductTranslations_productTranslate_product_translation_language;
name: string;
seoDescription: string | null;
@ -34,7 +34,7 @@ export interface UpdateProductTranslations_productTranslate_product {
__typename: "Product";
id: string;
name: string;
description: any;
description: any | null;
seoDescription: string | null;
seoTitle: string | null;
translation: UpdateProductTranslations_productTranslate_product_translation | null;

31
src/translations/utils.ts Normal file
View file

@ -0,0 +1,31 @@
import { OutputData } from "@editorjs/editorjs";
import {
PageTranslationInputFieldName,
TranslationInputFieldName
} from "./types";
export const getParsedTranslationInputData = ({
fieldName,
data
}: {
fieldName: TranslationInputFieldName | PageTranslationInputFieldName;
data: string | OutputData;
}): Record<string, string | null> => {
const fieldsToParse = [
TranslationInputFieldName.description,
PageTranslationInputFieldName.content
];
if (fieldsToParse.includes(fieldName)) {
return {
description: getParsedDataForJsonStringField(data as OutputData)
};
}
return { [fieldName]: data as string };
};
export const getParsedDataForJsonStringField = (
data: OutputData
): string | null => (!!data.blocks?.length ? JSON.stringify(data) : null);

View file

@ -1,3 +1,4 @@
import { OutputData } from "@editorjs/editorjs";
import useNavigator from "@saleor/hooks/useNavigator";
import useNotifier from "@saleor/hooks/useNotifier";
import useShop from "@saleor/hooks/useShop";
@ -6,18 +7,18 @@ import { stringify as stringifyQs } from "qs";
import React from "react";
import { useIntl } from "react-intl";
import { LanguageCodeEnum, TranslationInput } from "../../types/globalTypes";
import TranslationsCategoriesPage, {
fieldNames
} from "../components/TranslationsCategoriesPage";
import { LanguageCodeEnum } from "../../types/globalTypes";
import TranslationsCategoriesPage from "../components/TranslationsCategoriesPage";
import { TypedUpdateCategoryTranslations } from "../mutations";
import { useCategoryTranslationDetails } from "../queries";
import { TranslationInputFieldName } from "../types";
import { UpdateCategoryTranslations } from "../types/UpdateCategoryTranslations";
import {
languageEntitiesUrl,
languageEntityUrl,
TranslatableEntities
} from "../urls";
import { getParsedTranslationInputData } from "../utils";
export interface TranslationsCategoriesQueryParams {
activeField: string;
@ -67,25 +68,19 @@ const TranslationsCategories: React.FC<TranslationsCategoriesProps> = ({
return (
<TypedUpdateCategoryTranslations onCompleted={onUpdate}>
{(updateTranslations, updateTranslationsOpts) => {
const handleSubmit = (field: string, data: string) => {
const input: TranslationInput = {};
if (field === fieldNames.description) {
input.description = JSON.stringify(data);
} else if (field === fieldNames.name) {
input.name = data;
} else if (field === fieldNames.seoDescription) {
input.seoDescription = data;
} else if (field === fieldNames.seoTitle) {
input.seoTitle = data;
}
const handleSubmit = (
fieldName: TranslationInputFieldName,
data: string | OutputData
) => {
updateTranslations({
variables: {
id,
input,
input: getParsedTranslationInputData({ data, fieldName }),
language: languageCode
}
});
};
const translation = categoryTranslations?.data?.translation;
return (

View file

@ -7,18 +7,18 @@ import React from "react";
import { useIntl } from "react-intl";
import { maybe } from "../../misc";
import { LanguageCodeEnum, TranslationInput } from "../../types/globalTypes";
import TranslationsCollectionsPage, {
fieldNames
} from "../components/TranslationsCollectionsPage";
import { LanguageCodeEnum } from "../../types/globalTypes";
import TranslationsCollectionsPage from "../components/TranslationsCollectionsPage";
import { TypedUpdateCollectionTranslations } from "../mutations";
import { useCollectionTranslationDetails } from "../queries";
import { TranslationInputFieldName } from "../types";
import { UpdateCollectionTranslations } from "../types/UpdateCollectionTranslations";
import {
languageEntitiesUrl,
languageEntityUrl,
TranslatableEntities
} from "../urls";
import { getParsedTranslationInputData } from "../utils";
export interface TranslationsCollectionsQueryParams {
activeField: string;
@ -69,21 +69,14 @@ const TranslationsCollections: React.FC<TranslationsCollectionsProps> = ({
return (
<TypedUpdateCollectionTranslations onCompleted={onUpdate}>
{(updateTranslations, updateTranslationsOpts) => {
const handleSubmit = (field: string, data: string) => {
const input: TranslationInput = {};
if (field === fieldNames.description) {
input.description = JSON.stringify(data);
} else if (field === fieldNames.name) {
input.name = data;
} else if (field === fieldNames.seoDescription) {
input.seoDescription = data;
} else if (field === fieldNames.seoTitle) {
input.seoTitle = data;
}
const handleSubmit = (
fieldName: TranslationInputFieldName,
data: string
) => {
updateTranslations({
variables: {
id,
input,
input: getParsedTranslationInputData({ data, fieldName }),
language: languageCode
}
});

View file

@ -6,21 +6,18 @@ import { stringify as stringifyQs } from "qs";
import React from "react";
import { useIntl } from "react-intl";
import {
LanguageCodeEnum,
PageTranslationInput
} from "../../types/globalTypes";
import TranslationsPagesPage, {
fieldNames
} from "../components/TranslationsPagesPage";
import { LanguageCodeEnum } from "../../types/globalTypes";
import TranslationsPagesPage from "../components/TranslationsPagesPage";
import { TypedUpdatePageTranslations } from "../mutations";
import { usePageTranslationDetails } from "../queries";
import { TranslationInputFieldName } from "../types";
import { UpdatePageTranslations } from "../types/UpdatePageTranslations";
import {
languageEntitiesUrl,
languageEntityUrl,
TranslatableEntities
} from "../urls";
import { getParsedTranslationInputData } from "../utils";
export interface TranslationsPagesQueryParams {
activeField: string;
@ -70,21 +67,14 @@ const TranslationsPages: React.FC<TranslationsPagesProps> = ({
return (
<TypedUpdatePageTranslations onCompleted={onUpdate}>
{(updateTranslations, updateTranslationsOpts) => {
const handleSubmit = (field: string, data: string) => {
const input: PageTranslationInput = {};
if (field === fieldNames.content) {
input.content = JSON.stringify(data);
} else if (field === fieldNames.title) {
input.title = data;
} else if (field === fieldNames.seoDescription) {
input.seoDescription = data;
} else if (field === fieldNames.seoTitle) {
input.seoTitle = data;
}
const handleSubmit = (
fieldName: TranslationInputFieldName,
data: string
) => {
updateTranslations({
variables: {
id,
input,
input: getParsedTranslationInputData({ data, fieldName }),
language: languageCode
}
});

View file

@ -7,18 +7,18 @@ import React from "react";
import { useIntl } from "react-intl";
import { maybe } from "../../misc";
import { LanguageCodeEnum, TranslationInput } from "../../types/globalTypes";
import TranslationsProductsPage, {
fieldNames
} from "../components/TranslationsProductsPage";
import { LanguageCodeEnum } from "../../types/globalTypes";
import TranslationsProductsPage from "../components/TranslationsProductsPage";
import { TypedUpdateProductTranslations } from "../mutations";
import { useProductTranslationDetails } from "../queries";
import { TranslationInputFieldName } from "../types";
import { UpdateProductTranslations } from "../types/UpdateProductTranslations";
import {
languageEntitiesUrl,
languageEntityUrl,
TranslatableEntities
} from "../urls";
import { getParsedTranslationInputData } from "../utils";
export interface TranslationsProductsQueryParams {
activeField: string;
@ -68,21 +68,14 @@ const TranslationsProducts: React.FC<TranslationsProductsProps> = ({
return (
<TypedUpdateProductTranslations onCompleted={onUpdate}>
{(updateTranslations, updateTranslationsOpts) => {
const handleSubmit = (field: string, data: string) => {
const input: TranslationInput = {};
if (field === fieldNames.description) {
input.description = JSON.stringify(data);
} else if (field === fieldNames.name) {
input.name = data;
} else if (field === fieldNames.seoDescription) {
input.seoDescription = data;
} else if (field === fieldNames.seoTitle) {
input.seoTitle = data;
}
const handleSubmit = (
fieldName: TranslationInputFieldName,
data: string
) => {
updateTranslations({
variables: {
id,
input,
input: getParsedTranslationInputData({ data, fieldName }),
language: languageCode
}
});

View file

@ -6,18 +6,21 @@ function useRichText(opts: {
initial: string | null;
triggerChange: () => void;
}): [MutableRefObject<OutputData>, RichTextEditorChange] {
const data = useRef<OutputData>(
opts.initial === null ? { blocks: [] } : undefined
);
const data = useRef<OutputData>();
const [, setLoaded] = useState(false);
useEffect(() => {
if (opts.initial !== null) {
try {
data.current = JSON.parse(opts.initial);
setLoaded(true);
} catch {
data.current = undefined;
}
if (opts.initial === null) {
data.current = { blocks: [] };
setLoaded(true);
return;
}
try {
data.current = JSON.parse(opts.initial);
setLoaded(true);
} catch {
data.current = undefined;
}
}, [opts.initial]);