Use esbuild-loader (#1983)

* Minor fixes for intl messages

* Add esbuild-loader
* switch from babel to esbuild-loader
* use formatjs enforce-id linter

* Generate ids for intl messages

* id format defined by idInterpolationPattern

* Modify intl messages extraction

* remove react-intl-translations-manager
* remove transpile-tx.js
* use formatjs cli

* Modify defaultMessages.json

* modify ids in defaultMessages.json with defined idInterpolationPattern

* Fix errors

* Fix page crash

* Use babel to transpile tests

* Fix useStateFromProps

* Improve render count

* Add test to useStateFromProps

* Fix reloading state buh

* Do not check if form with channels is dirty

* Stop blocking save if form has not changed

* Remove debug code

* Fix form disabling

* Fix variant selection checkbox onClick

* Update translations

* Update messages

* Use esbuild to build storybook

Co-authored-by: Bartłomiej Wiaduch <tukan2can@gmail.com>
Co-authored-by: Jakub Majorek <majorek.jakub@gmail.com>
This commit is contained in:
Dominik Żegleń 2022-05-05 09:54:28 +02:00 committed by GitHub
parent 22c16113bf
commit 7d9441a7ec
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
637 changed files with 12828 additions and 361147 deletions

View file

@ -13,7 +13,8 @@
"local-rules", "local-rules",
"simple-import-sort", "simple-import-sort",
"cypress", "cypress",
"chai-friendly" "chai-friendly",
"formatjs"
], ],
"rules": { "rules": {
"@typescript-eslint/adjacent-overload-signatures": "error", "@typescript-eslint/adjacent-overload-signatures": "error",
@ -82,6 +83,12 @@
"dot-notation": "error", "dot-notation": "error",
"eol-last": "off", "eol-last": "off",
"eqeqeq": ["error", "smart"], "eqeqeq": ["error", "smart"],
"formatjs/enforce-id": [
"error",
{
"idInterpolationPattern": "[sha512:contenthash:base64:6]"
}
],
"guard-for-in": "error", "guard-for-in": "error",
"id-blacklist": "off", "id-blacklist": "off",
"import/no-duplicates": "error", "import/no-duplicates": "error",

View file

@ -1,24 +1,12 @@
module.exports = api => { module.exports = api => {
const isExtract = api.env("extract"); api.cache(true);
const isTest = api.env("test");
const isStorybook = api.env("storybook");
const ignore =
isTest || isStorybook
? []
: [
"**/*.test.ts",
"**/*.test.tsx",
"src/storybook",
"node_modules/core-js"
];
const presets = [ const presets = [
[ [
"@babel/preset-env", "@babel/preset-env",
{ {
corejs: "3.2.1", corejs: "3.2.1",
modules: isTest ? "auto" : false, modules: "auto",
useBuiltIns: "usage" useBuiltIns: "usage"
} }
], ],
@ -38,23 +26,10 @@ module.exports = api => {
], ],
"@babel/plugin-proposal-object-rest-spread", "@babel/plugin-proposal-object-rest-spread",
"@babel/plugin-proposal-nullish-coalescing-operator", "@babel/plugin-proposal-nullish-coalescing-operator",
"react-intl-auto" "macros"
]; ];
if (isExtract) {
plugins.push([
"react-intl",
{
extractFromFormatMessageCall: true,
messagesDir: "build/locale/"
}
]);
}
plugins.push("macros");
return { return {
ignore,
plugins, plugins,
presets presets
}; };

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2476
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -65,7 +65,7 @@
"react-helmet": "^6.1.0", "react-helmet": "^6.1.0",
"react-infinite-scroll-component": "^6.1.0", "react-infinite-scroll-component": "^6.1.0",
"react-inlinesvg": "^2.1.1", "react-inlinesvg": "^2.1.1",
"react-intl": "^5.10.2", "react-intl": "^5.21.2",
"react-jss": "^10.0.0", "react-jss": "^10.0.0",
"react-markdown": "^4.3.1", "react-markdown": "^4.3.1",
"react-moment": "^1.0.0", "react-moment": "^1.0.0",
@ -93,6 +93,7 @@
"@babel/preset-typescript": "^7.13.0", "@babel/preset-typescript": "^7.13.0",
"@babel/runtime": "^7.7.6", "@babel/runtime": "^7.7.6",
"@editorjs/embed": "^2.4.6", "@editorjs/embed": "^2.4.6",
"@formatjs/cli": "^4.5.0",
"@graphql-codegen/add": "^3.1.1", "@graphql-codegen/add": "^3.1.1",
"@graphql-codegen/cli": "^2.1.1", "@graphql-codegen/cli": "^2.1.1",
"@graphql-codegen/fragment-matcher": "^3.1.0", "@graphql-codegen/fragment-matcher": "^3.1.0",
@ -140,8 +141,6 @@
"babel-core": "^7.0.0-bridge.0", "babel-core": "^7.0.0-bridge.0",
"babel-jest": "^23.6.0", "babel-jest": "^23.6.0",
"babel-loader": "^8.0.6", "babel-loader": "^8.0.6",
"babel-plugin-react-intl": "^5.1.11",
"babel-plugin-react-intl-auto": "^3.1.0",
"codecov": "^3.7.1", "codecov": "^3.7.1",
"core-js": "^3.7.0", "core-js": "^3.7.0",
"cross-env": "^6.0.3", "cross-env": "^6.0.3",
@ -153,10 +152,11 @@
"enzyme": "^3.11.0", "enzyme": "^3.11.0",
"enzyme-adapter-react-16": "^1.15.5", "enzyme-adapter-react-16": "^1.15.5",
"enzyme-to-json": "^3.6.1", "enzyme-to-json": "^3.6.1",
"eslint": "^6.8.0", "esbuild-loader": "^2.18.0",
"eslint-loader": "^3.0.2", "eslint": "^7.4.0",
"eslint-plugin-chai-friendly": "^0.6.0", "eslint-plugin-chai-friendly": "^0.6.0",
"eslint-plugin-cypress": "^2.11.2", "eslint-plugin-cypress": "^2.11.2",
"eslint-plugin-formatjs": "^2.18.0",
"eslint-plugin-import": "^2.19.1", "eslint-plugin-import": "^2.19.1",
"eslint-plugin-local-rules": "^0.1.1", "eslint-plugin-local-rules": "^0.1.1",
"eslint-plugin-prefer-arrow": "^1.1.6", "eslint-plugin-prefer-arrow": "^1.1.6",
@ -177,7 +177,6 @@
"mochawesome-report-generator": "^6.0.1", "mochawesome-report-generator": "^6.0.1",
"mock-apollo-client": "^0.4.0", "mock-apollo-client": "^0.4.0",
"prettier": "^1.19.1", "prettier": "^1.19.1",
"react-intl-translations-manager": "^5.0.3",
"react-test-renderer": "^16.12.0", "react-test-renderer": "^16.12.0",
"regenerator-runtime": "^0.11.1", "regenerator-runtime": "^0.11.1",
"register-service-worker": "^1.7.2", "register-service-worker": "^1.7.2",
@ -187,7 +186,7 @@
"setup-polly-jest": "^0.9.1", "setup-polly-jest": "^0.9.1",
"speed-measure-webpack-plugin": "^1.5.0", "speed-measure-webpack-plugin": "^1.5.0",
"start-server-and-test": "^1.11.0", "start-server-and-test": "^1.11.0",
"ts-jest": "^24.2.0", "ts-jest": "^27.0.7",
"tsconfig-paths-webpack-plugin": "^3.2.0", "tsconfig-paths-webpack-plugin": "^3.2.0",
"typescript": "^4.3.5", "typescript": "^4.3.5",
"webpack": "^4.35.3", "webpack": "^4.35.3",
@ -258,8 +257,8 @@
"build": "npm run build-types && webpack -p", "build": "npm run build-types && webpack -p",
"check-strict-null-errors": "tsc --noEmit --strictNullChecks | node scripts/count-strict-null-check-errors.js", "check-strict-null-errors": "tsc --noEmit --strictNullChecks | node scripts/count-strict-null-check-errors.js",
"check-types": "tsc --noEmit", "check-types": "tsc --noEmit",
"extract-json-messages": "rimraf build/locale && cross-env NODE_ENV=extract babel src 'src/**/*.{ts,tsx}' -o build/dashboard.bundle.js", "extract-json-messages": "formatjs extract 'src/**/*.{ts,tsx}' --out-file locale/defaultMessages.json --format scripts/formatter.js",
"extract-messages": "npm run extract-json-messages && npm run transpile-messages", "extract-messages": "npm run extract-json-messages",
"fetch-schema": "graphql-codegen --config ./fetch-schema.yml && node scripts/build-schema.js", "fetch-schema": "graphql-codegen --config ./fetch-schema.yml && node scripts/build-schema.js",
"heroku-postbuild": "npm run build", "heroku-postbuild": "npm run build",
"serve:lhci": "NODE_ENV=production npm run server", "serve:lhci": "NODE_ENV=production npm run server",
@ -279,7 +278,6 @@
"test:e2e:run:record": "start-server-and-test start http://localhost:9000 cy:run:record", "test:e2e:run:record": "start-server-and-test start http://localhost:9000 cy:run:record",
"test:e2e:dev": "start-server-and-test start http://localhost:9000 cy:open", "test:e2e:dev": "start-server-and-test start http://localhost:9000 cy:open",
"test": "TZ=UTC jest src/", "test": "TZ=UTC jest src/",
"transpile-messages": "node scripts/transpile-tx.js",
"lint": "npx eslint \"src/**/*.@(tsx|ts|jsx|js)\" --fix ; npx prettier --check \"src/**/*.@(tsx|ts|jsx|js)\" --write", "lint": "npx eslint \"src/**/*.@(tsx|ts|jsx|js)\" --fix ; npx prettier --check \"src/**/*.@(tsx|ts|jsx|js)\" --write",
"postbuild": "rimraf ./build/**/*.js.map", "postbuild": "rimraf ./build/**/*.js.map",
"release": "release-it" "release": "release-it"

10
scripts/formatter.js Normal file
View file

@ -0,0 +1,10 @@
exports.format = function(msgs) {
const results = {};
for (const [id, msg] of Object.entries(msgs)) {
results[id] = {
context: msg.description,
string: msg.defaultMessage
};
}
return results;
};

View file

@ -1,43 +0,0 @@
/* eslint-disable @typescript-eslint/no-var-requires */
const {
createSingleMessagesFile,
default: manageTranslations
} = require("react-intl-translations-manager");
const dotSeparator = "_dot_";
const sortKeys = true;
const translationsDirectory = "locale";
manageTranslations({
messagesDirectory: "build/locale/src",
overrideCoreMethods: {
outputSingleFile: combinedFiles => {
const msgDescriptors = combinedFiles.reduce(
(acc, messages) => [...acc, ...messages.descriptors],
[]
);
const structuredJsonFormat = msgDescriptors.reduce((msgs, msg) => {
const key = msg.id.replace(/\./g, dotSeparator);
if (msgs[key] && msgs[key].context === undefined) {
msgs[key].context = msg.description;
} else {
msgs[key] = {
context: msg.description,
string: msg.defaultMessage
};
}
return msgs;
}, {});
createSingleMessagesFile({
directory: translationsDirectory,
messages: structuredJsonFormat,
sortKeys
});
}
},
singleMessagesFile: true,
sortKeys,
translationsDirectory
});

View file

@ -25,6 +25,7 @@ const AppActivateDialog: React.FC<AppActivateDialogProps> = ({
return ( return (
<ActionDialog <ActionDialog
confirmButtonLabel={intl.formatMessage({ confirmButtonLabel={intl.formatMessage({
id: "D3E2b5",
defaultMessage: "Activate", defaultMessage: "Activate",
description: "button label" description: "button label"
})} })}
@ -33,6 +34,7 @@ const AppActivateDialog: React.FC<AppActivateDialogProps> = ({
onClose={onClose} onClose={onClose}
onConfirm={onConfirm} onConfirm={onConfirm}
title={intl.formatMessage({ title={intl.formatMessage({
id: "YHNozE",
defaultMessage: "Activate App", defaultMessage: "Activate App",
description: "dialog header" description: "dialog header"
})} })}
@ -41,11 +43,13 @@ const AppActivateDialog: React.FC<AppActivateDialogProps> = ({
<DialogContentText> <DialogContentText>
{["", null].includes(name) ? ( {["", null].includes(name) ? (
<FormattedMessage <FormattedMessage
id="Q47ovw"
defaultMessage="Are you sure you want to activate this app? Activating will start gathering events." defaultMessage="Are you sure you want to activate this app? Activating will start gathering events."
description="activate app" description="activate app"
/> />
) : ( ) : (
<FormattedMessage <FormattedMessage
id="JbUg2b"
defaultMessage="Are you sure you want to activate {name}? Activating will start gathering events." defaultMessage="Are you sure you want to activate {name}? Activating will start gathering events."
description="activate app" description="activate app"
values={{ values={{

View file

@ -29,6 +29,7 @@ const AppDeactivateDialog: React.FC<AppDeactivateDialogProps> = ({
return ( return (
<ActionDialog <ActionDialog
confirmButtonLabel={intl.formatMessage({ confirmButtonLabel={intl.formatMessage({
id: "W+AFZY",
defaultMessage: "Deactivate", defaultMessage: "Deactivate",
description: "button label" description: "button label"
})} })}
@ -37,6 +38,7 @@ const AppDeactivateDialog: React.FC<AppDeactivateDialogProps> = ({
onClose={onClose} onClose={onClose}
onConfirm={onConfirm} onConfirm={onConfirm}
title={intl.formatMessage({ title={intl.formatMessage({
id: "yMi8I8",
defaultMessage: "Dectivate App", defaultMessage: "Dectivate App",
description: "dialog header" description: "dialog header"
})} })}

View file

@ -2,21 +2,25 @@ import { defineMessages } from "react-intl";
export default defineMessages({ export default defineMessages({
deactivateApp: { deactivateApp: {
id: "73RU3R",
defaultMessage: defaultMessage:
"Are you sure you want to disable this app? Your data will be kept until you reactivate the app. You will be still billed for the app.", "Are you sure you want to disable this app? Your data will be kept until you reactivate the app. You will be still billed for the app.",
description: "deactivate app" description: "deactivate app"
}, },
deactivateNamedApp: { deactivateNamedApp: {
id: "w6Gau0",
defaultMessage: defaultMessage:
"Are you sure you want to disable {name}? Your data will be kept until you reactivate the app. You will be still billed for the app.", "Are you sure you want to disable {name}? Your data will be kept until you reactivate the app. You will be still billed for the app.",
description: "deactivate named app" description: "deactivate named app"
}, },
deactivateLocalApp: { deactivateLocalApp: {
id: "7O2EsY",
defaultMessage: defaultMessage:
"Are you sure you want to disable this app? Your data will be kept until you reactivate the app.", "Are you sure you want to disable this app? Your data will be kept until you reactivate the app.",
description: "deactivate local app" description: "deactivate local app"
}, },
deactivateLocalNamedApp: { deactivateLocalNamedApp: {
id: "Np7J92",
defaultMessage: defaultMessage:
"Are you sure you want to disable {name}? Your data will be kept until you reactivate the app.", "Are you sure you want to disable {name}? Your data will be kept until you reactivate the app.",
description: "deactivate local named app" description: "deactivate local named app"

View file

@ -31,6 +31,7 @@ const AppDeleteDialog: React.FC<AppDeleteDialogProps> = ({
onClose={onClose} onClose={onClose}
onConfirm={onConfirm} onConfirm={onConfirm}
title={intl.formatMessage({ title={intl.formatMessage({
id: "zQX6xO",
defaultMessage: "Delete App", defaultMessage: "Delete App",
description: "dialog header" description: "dialog header"
})} })}
@ -39,11 +40,13 @@ const AppDeleteDialog: React.FC<AppDeleteDialogProps> = ({
<DialogContentText> <DialogContentText>
{["", null].includes(name) ? ( {["", null].includes(name) ? (
<FormattedMessage <FormattedMessage
id="6hLZNA"
defaultMessage="Are you sure you want to delete this app?" defaultMessage="Are you sure you want to delete this app?"
description="delete app" description="delete app"
/> />
) : type === "EXTERNAL" ? ( ) : type === "EXTERNAL" ? (
<FormattedMessage <FormattedMessage
id="EWD/wU"
defaultMessage="Deleting {name}, you will remove installation of the app. If you are paying for app subscription, remember to unsubscribe from the app in Saleor Marketplace. Are you sure you want to delete the app?" defaultMessage="Deleting {name}, you will remove installation of the app. If you are paying for app subscription, remember to unsubscribe from the app in Saleor Marketplace. Are you sure you want to delete the app?"
description="delete app" description="delete app"
values={{ values={{
@ -52,6 +55,7 @@ const AppDeleteDialog: React.FC<AppDeleteDialogProps> = ({
/> />
) : ( ) : (
<FormattedMessage <FormattedMessage
id="LtqrM8"
defaultMessage="Deleting {name}, you will delete all the data and webhooks regarding this app. Are you sure you want to do that?" defaultMessage="Deleting {name}, you will delete all the data and webhooks regarding this app. Are you sure you want to do that?"
description="delete custom app" description="delete custom app"
values={{ values={{

View file

@ -54,7 +54,11 @@ export const AppDetailsPage: React.FC<AppDetailsPageProps> = ({
} }
> >
<Button onClick={navigateToApp} variant="primary" data-tc="open-app"> <Button onClick={navigateToApp} variant="primary" data-tc="open-app">
<FormattedMessage defaultMessage="Open App" description="button" /> <FormattedMessage
id="HtfL5/"
defaultMessage="Open App"
description="button"
/>
</Button> </Button>
</PageHeader> </PageHeader>
<div className={classes.appHeader}> <div className={classes.appHeader}>
@ -67,6 +71,7 @@ export const AppDetailsPage: React.FC<AppDetailsPageProps> = ({
> >
<SVG src={supportIcon} /> <SVG src={supportIcon} />
<FormattedMessage <FormattedMessage
id="Gjb6eq"
defaultMessage="Get Support" defaultMessage="Get Support"
description="link" description="link"
/> />
@ -79,6 +84,7 @@ export const AppDetailsPage: React.FC<AppDetailsPageProps> = ({
> >
<SVG src={settingsIcon} /> <SVG src={settingsIcon} />
<FormattedMessage <FormattedMessage
id="89PSdB"
defaultMessage="Edit settings" defaultMessage="Edit settings"
description="link" description="link"
/> />
@ -92,11 +98,13 @@ export const AppDetailsPage: React.FC<AppDetailsPageProps> = ({
<SVG src={activateIcon} /> <SVG src={activateIcon} />
{data?.isActive ? ( {data?.isActive ? (
<FormattedMessage <FormattedMessage
id="whTEcF"
defaultMessage="Deactivate" defaultMessage="Deactivate"
description="link" description="link"
/> />
) : ( ) : (
<FormattedMessage <FormattedMessage
id="P5twxk"
defaultMessage="Activate" defaultMessage="Activate"
description="link" description="link"
/> />
@ -112,6 +120,7 @@ export const AppDetailsPage: React.FC<AppDetailsPageProps> = ({
<Card> <Card>
<CardTitle <CardTitle
title={intl.formatMessage({ title={intl.formatMessage({
id: "jDIRQV",
defaultMessage: "About this app", defaultMessage: "About this app",
description: "section header" description: "section header"
})} })}
@ -124,6 +133,7 @@ export const AppDetailsPage: React.FC<AppDetailsPageProps> = ({
<Card> <Card>
<CardTitle <CardTitle
title={intl.formatMessage({ title={intl.formatMessage({
id: "VsGcdP",
defaultMessage: "App permissions", defaultMessage: "App permissions",
description: "section header" description: "section header"
})} })}
@ -133,6 +143,7 @@ export const AppDetailsPage: React.FC<AppDetailsPageProps> = ({
<> <>
<Typography> <Typography>
<FormattedMessage <FormattedMessage
id="7oQUMG"
defaultMessage="This app has permissions to:" defaultMessage="This app has permissions to:"
description="apps about permissions" description="apps about permissions"
/> />
@ -155,6 +166,7 @@ export const AppDetailsPage: React.FC<AppDetailsPageProps> = ({
<Card> <Card>
<CardTitle <CardTitle
title={intl.formatMessage({ title={intl.formatMessage({
id: "a55zOn",
defaultMessage: "Data privacy", defaultMessage: "Data privacy",
description: "section header" description: "section header"
})} })}
@ -169,6 +181,7 @@ export const AppDetailsPage: React.FC<AppDetailsPageProps> = ({
target="_blank" target="_blank"
> >
<FormattedMessage <FormattedMessage
id="Go50v2"
defaultMessage="View this apps privacy policy" defaultMessage="View this apps privacy policy"
description="app privacy policy link" description="app privacy policy link"
/> />

View file

@ -46,6 +46,7 @@ export const useAppActions = (
if (isExternalDomain) { if (isExternalDomain) {
success = window.confirm( success = window.confirm(
intl.formatMessage({ intl.formatMessage({
id: "MSItJD",
defaultMessage: defaultMessage:
"You are about to leave the Dashboard. Do you want to continue?" "You are about to leave the Dashboard. Do you want to continue?"
}) })

View file

@ -29,6 +29,7 @@ const AppInProgressDeleteDialog: React.FC<AppInProgressDeleteDialogProps> = ({
onClose={onClose} onClose={onClose}
onConfirm={onConfirm} onConfirm={onConfirm}
title={intl.formatMessage({ title={intl.formatMessage({
id: "zQX6xO",
defaultMessage: "Delete App", defaultMessage: "Delete App",
description: "dialog header" description: "dialog header"
})} })}
@ -37,11 +38,13 @@ const AppInProgressDeleteDialog: React.FC<AppInProgressDeleteDialogProps> = ({
<DialogContentText> <DialogContentText>
{["", null].includes(name) ? ( {["", null].includes(name) ? (
<FormattedMessage <FormattedMessage
id="6hLZNA"
defaultMessage="Are you sure you want to delete this app?" defaultMessage="Are you sure you want to delete this app?"
description="delete app" description="delete app"
/> />
) : ( ) : (
<FormattedMessage <FormattedMessage
id="EWD/wU"
defaultMessage="Deleting {name}, you will remove installation of the app. If you are paying for app subscription, remember to unsubscribe from the app in Saleor Marketplace. Are you sure you want to delete the app?" defaultMessage="Deleting {name}, you will remove installation of the app. If you are paying for app subscription, remember to unsubscribe from the app in Saleor Marketplace. Are you sure you want to delete the app?"
description="delete app" description="delete app"
values={{ values={{

View file

@ -25,18 +25,21 @@ export const AppInstallErrorPage: React.FC<AppInstallErrorPageProps> = ({
<Grid xs={12} sm={6} item> <Grid xs={12} sm={6} item>
<Typography variant="h3" component="h3"> <Typography variant="h3" component="h3">
<FormattedMessage <FormattedMessage
id="WnlZMO"
defaultMessage="Theres a problem with app." defaultMessage="Theres a problem with app."
description="title" description="title"
/> />
</Typography> </Typography>
<Typography variant="body2"> <Typography variant="body2">
<FormattedMessage <FormattedMessage
id="4yRwN+"
defaultMessage="Saleor couldnt fetch crucial information regarding installation. Without those System cant install the app in your Saleor. Please use the button below to get back to systems dashboard." defaultMessage="Saleor couldnt fetch crucial information regarding installation. Without those System cant install the app in your Saleor. Please use the button below to get back to systems dashboard."
description="content" description="content"
/> />
</Typography> </Typography>
<Button className={classes.button} variant="primary" onClick={onBack}> <Button className={classes.button} variant="primary" onClick={onBack}>
<FormattedMessage <FormattedMessage
id="906uUr"
defaultMessage="Back to homepage" defaultMessage="Back to homepage"
description="button" description="button"
/> />

View file

@ -45,6 +45,7 @@ export const AppInstallPage: React.FC<AppInstallPageProps> = ({
) : ( ) : (
intl.formatMessage( intl.formatMessage(
{ {
id: "Id7C0X",
defaultMessage: `You are about to install {name}`, defaultMessage: `You are about to install {name}`,
description: "section header" description: "section header"
}, },
@ -78,6 +79,7 @@ export const AppInstallPage: React.FC<AppInstallPageProps> = ({
<Card> <Card>
<CardTitle <CardTitle
title={intl.formatMessage({ title={intl.formatMessage({
id: "VsGcdP",
defaultMessage: "App permissions", defaultMessage: "App permissions",
description: "section header" description: "section header"
})} })}
@ -89,6 +91,7 @@ export const AppInstallPage: React.FC<AppInstallPageProps> = ({
<> <>
<Typography className={classes.installPermissionTitle}> <Typography className={classes.installPermissionTitle}>
<FormattedMessage <FormattedMessage
id="BL/Lbk"
defaultMessage="Installing this app will give it following permissions:" defaultMessage="Installing this app will give it following permissions:"
description="install app permissions" description="install app permissions"
/> />
@ -107,6 +110,7 @@ export const AppInstallPage: React.FC<AppInstallPageProps> = ({
className={classes.installPrivacyText} className={classes.installPrivacyText}
> >
<FormattedMessage <FormattedMessage
id="t1UYU6"
defaultMessage="Uninstalling the app will remove all your customers personal data stored by {name}. " defaultMessage="Uninstalling the app will remove all your customers personal data stored by {name}. "
description="install app privacy" description="install app privacy"
values={{ name }} values={{ name }}
@ -117,6 +121,7 @@ export const AppInstallPage: React.FC<AppInstallPageProps> = ({
target="_blank" target="_blank"
> >
<FormattedMessage <FormattedMessage
id="k5lHFp"
defaultMessage="Learn more about data privacy" defaultMessage="Learn more about data privacy"
description="app data privacy link" description="app data privacy link"
/> />
@ -136,6 +141,7 @@ export const AppInstallPage: React.FC<AppInstallPageProps> = ({
<Grid xs={6} item className={classes.alignRight}> <Grid xs={6} item className={classes.alignRight}>
<Button variant="primary" onClick={onSubmit}> <Button variant="primary" onClick={onSubmit}>
<FormattedMessage <FormattedMessage
id="PkCmGU"
defaultMessage="Install App" defaultMessage="Install App"
description="install button" description="install button"
/> />

View file

@ -64,7 +64,11 @@ export const AppPage: React.FC<AppPageProps> = ({
</div> </div>
<div className={classes.appSettingsHeader}> <div className={classes.appSettingsHeader}>
<Button onClick={navigateToAbout} variant="primary"> <Button onClick={navigateToAbout} variant="primary">
<FormattedMessage defaultMessage="About" description="button" /> <FormattedMessage
id="UCHtG6"
defaultMessage="About"
description="button"
/>
</Button> </Button>
<Button <Button
component="a" component="a"
@ -74,6 +78,7 @@ export const AppPage: React.FC<AppPageProps> = ({
target="_blank" target="_blank"
> >
<FormattedMessage <FormattedMessage
id="llC1q8"
defaultMessage="App home page" defaultMessage="App home page"
description="button" description="button"
/> />
@ -86,6 +91,7 @@ export const AppPage: React.FC<AppPageProps> = ({
target="_blank" target="_blank"
> >
<FormattedMessage <FormattedMessage
id="hdcGSJ"
defaultMessage="Support/FAQ" defaultMessage="Support/FAQ"
description="button" description="button"
/> />

View file

@ -44,6 +44,7 @@ const AppsInProgress: React.FC<AppsInProgressProps> = ({
<Card> <Card>
<CardTitle <CardTitle
title={intl.formatMessage({ title={intl.formatMessage({
id: "nIrjSR",
defaultMessage: "Ongoing Installations", defaultMessage: "Ongoing Installations",
description: "section header" description: "section header"
})} })}
@ -64,6 +65,7 @@ const AppsInProgress: React.FC<AppsInProgressProps> = ({
> >
<Typography variant="body2" className={classes.text}> <Typography variant="body2" className={classes.text}>
<FormattedMessage <FormattedMessage
id="1qRwgQ"
defaultMessage="Installing app..." defaultMessage="Installing app..."
description="app installation" description="app installation"
/> />
@ -82,6 +84,7 @@ const AppsInProgress: React.FC<AppsInProgressProps> = ({
> >
<Typography variant="body2" className={classes.error}> <Typography variant="body2" className={classes.error}>
<FormattedMessage <FormattedMessage
id="JufWFT"
defaultMessage="There was a problem during installation" defaultMessage="There was a problem during installation"
description="app installation error" description="app installation error"
/> />
@ -96,6 +99,7 @@ const AppsInProgress: React.FC<AppsInProgressProps> = ({
</Typography> </Typography>
<Button onClick={() => onAppInstallRetry(id)}> <Button onClick={() => onAppInstallRetry(id)}>
<FormattedMessage <FormattedMessage
id="+c/f61"
defaultMessage="Retry" defaultMessage="Retry"
description="retry installation" description="retry installation"
/> />

View file

@ -69,6 +69,7 @@ const CustomAppCreatePage: React.FC<CustomAppCreatePageProps> = props => {
</Backlink> </Backlink>
<PageHeader <PageHeader
title={intl.formatMessage({ title={intl.formatMessage({
id: "GjH9uy",
defaultMessage: "Create New App", defaultMessage: "Create New App",
description: "header" description: "header"
})} })}
@ -90,10 +91,12 @@ const CustomAppCreatePage: React.FC<CustomAppCreatePageProps> = props => {
permissionsExceeded={false} permissionsExceeded={false}
onChange={change} onChange={change}
fullAccessLabel={intl.formatMessage({ fullAccessLabel={intl.formatMessage({
id: "D4nzdD",
defaultMessage: "Grant this app full access to the store", defaultMessage: "Grant this app full access to the store",
description: "checkbox label" description: "checkbox label"
})} })}
description={intl.formatMessage({ description={intl.formatMessage({
id: "flP8Hj",
defaultMessage: defaultMessage:
"Expand or restrict app permissions to access certain part of Saleor system.", "Expand or restrict app permissions to access certain part of Saleor system.",
description: "card description" description: "card description"

View file

@ -26,10 +26,14 @@ const CustomAppDefaultToken: React.FC<CustomAppDefaultTokenProps> = props => {
<div className={classes.content}> <div className={classes.content}>
<div> <div>
<Typography> <Typography>
<FormattedMessage defaultMessage="Weve created your default token. Make sure to copy your new personal access token now. You wont be able to see it again." /> <FormattedMessage
id="ixjvkM"
defaultMessage="Weve created your default token. Make sure to copy your new personal access token now. You wont be able to see it again."
/>
</Typography> </Typography>
<Typography> <Typography>
<FormattedMessage <FormattedMessage
id="DGCzal"
defaultMessage="This token gives you access to your shop's API, which you'll find here: {url}" defaultMessage="This token gives you access to your shop's API, which you'll find here: {url}"
values={{ values={{
url: ( url: (
@ -49,14 +53,19 @@ const CustomAppDefaultToken: React.FC<CustomAppDefaultTokenProps> = props => {
</div> </div>
<Paper className={classes.paper} elevation={0}> <Paper className={classes.paper} elevation={0}>
<Typography variant="caption"> <Typography variant="caption">
<FormattedMessage defaultMessage="Generated Token" /> <FormattedMessage id="Kxiige" defaultMessage="Generated Token" />
</Typography> </Typography>
<Typography>{token}</Typography> <Typography>{token}</Typography>
<Button className={classes.copy} onClick={() => copy(token)}> <Button className={classes.copy} onClick={() => copy(token)}>
{copied ? ( {copied ? (
<FormattedMessage defaultMessage="Copied" description="button" /> <FormattedMessage
id="r86alc"
defaultMessage="Copied"
description="button"
/>
) : ( ) : (
<FormattedMessage <FormattedMessage
id="HVFq//"
defaultMessage="Copy token" defaultMessage="Copy token"
description="button" description="button"
/> />

View file

@ -122,11 +122,13 @@ const CustomAppDetailsPage: React.FC<CustomAppDetailsPageProps> = props => {
<img src={activateIcon} alt="" /> <img src={activateIcon} alt="" />
{data?.isActive ? ( {data?.isActive ? (
<FormattedMessage <FormattedMessage
id="whTEcF"
defaultMessage="Deactivate" defaultMessage="Deactivate"
description="link" description="link"
/> />
) : ( ) : (
<FormattedMessage <FormattedMessage
id="P5twxk"
defaultMessage="Activate" defaultMessage="Activate"
description="link" description="link"
/> />
@ -175,10 +177,12 @@ const CustomAppDetailsPage: React.FC<CustomAppDetailsPageProps> = props => {
permissionsExceeded={false} permissionsExceeded={false}
onChange={change} onChange={change}
fullAccessLabel={intl.formatMessage({ fullAccessLabel={intl.formatMessage({
id: "D4nzdD",
defaultMessage: "Grant this app full access to the store", defaultMessage: "Grant this app full access to the store",
description: "checkbox label" description: "checkbox label"
})} })}
description={intl.formatMessage({ description={intl.formatMessage({
id: "flP8Hj",
defaultMessage: defaultMessage:
"Expand or restrict app permissions to access certain part of Saleor system.", "Expand or restrict app permissions to access certain part of Saleor system.",
description: "card description" description: "card description"

View file

@ -30,6 +30,7 @@ const CustomAppInformation: React.FC<CustomAppInfoProps> = ({
<Card> <Card>
<CardTitle <CardTitle
title={intl.formatMessage({ title={intl.formatMessage({
id: "imYxM9",
defaultMessage: "App Information", defaultMessage: "App Information",
description: "header" description: "header"
})} })}
@ -39,6 +40,7 @@ const CustomAppInformation: React.FC<CustomAppInfoProps> = ({
disabled={disabled} disabled={disabled}
error={!!formErrors.name} error={!!formErrors.name}
label={intl.formatMessage({ label={intl.formatMessage({
id: "foNlhn",
defaultMessage: "App Name", defaultMessage: "App Name",
description: "custom app name" description: "custom app name"
})} })}

View file

@ -33,6 +33,7 @@ const CustomAppTokens: React.FC<CustomAppTokensProps> = props => {
<Card> <Card>
<CardTitle <CardTitle
title={intl.formatMessage({ title={intl.formatMessage({
id: "0Mg8o5",
defaultMessage: "Tokens", defaultMessage: "Tokens",
description: "header" description: "header"
})} })}
@ -43,6 +44,7 @@ const CustomAppTokens: React.FC<CustomAppTokensProps> = props => {
data-test-id="create-token" data-test-id="create-token"
> >
<FormattedMessage <FormattedMessage
id="RMB6fU"
defaultMessage="Create Token" defaultMessage="Create Token"
description="button" description="button"
/> />
@ -53,16 +55,18 @@ const CustomAppTokens: React.FC<CustomAppTokensProps> = props => {
<TableHead> <TableHead>
<TableRow> <TableRow>
<TableCell className={classes.colNote}> <TableCell className={classes.colNote}>
<FormattedMessage defaultMessage="Token Note" /> <FormattedMessage id="0DRBjg" defaultMessage="Token Note" />
</TableCell> </TableCell>
<TableCell className={classes.colKey}> <TableCell className={classes.colKey}>
<FormattedMessage <FormattedMessage
id="MAsLIT"
defaultMessage="Key" defaultMessage="Key"
description="custom app token key" description="custom app token key"
/> />
</TableCell> </TableCell>
<TableCell className={classes.colActions}> <TableCell className={classes.colActions}>
<FormattedMessage <FormattedMessage
id="VHuzgq"
defaultMessage="Actions" defaultMessage="Actions"
description="table actions" description="table actions"
/> />
@ -94,7 +98,10 @@ const CustomAppTokens: React.FC<CustomAppTokensProps> = props => {
() => ( () => (
<TableRow> <TableRow>
<TableCell colSpan={numberOfColumns}> <TableCell colSpan={numberOfColumns}>
<FormattedMessage defaultMessage="No tokens found" /> <FormattedMessage
id="bsP4f3"
defaultMessage="No tokens found"
/>
</TableCell> </TableCell>
</TableRow> </TableRow>
) )

View file

@ -49,6 +49,7 @@ const CustomApps: React.FC<CustomAppsProps> = ({
data-test-id="create-app" data-test-id="create-app"
> >
<FormattedMessage <FormattedMessage
id="XB2Jj9"
defaultMessage="Create App" defaultMessage="Create App"
description="create app button" description="create app button"
/> />
@ -96,6 +97,7 @@ const CustomApps: React.FC<CustomAppsProps> = ({
<TableCell className={classes.colName}> <TableCell className={classes.colName}>
<Typography className={classes.text} variant="body2"> <Typography className={classes.text} variant="body2">
<FormattedMessage <FormattedMessage
id="voRaz3"
defaultMessage="Your custom-created apps will be shown here." defaultMessage="Your custom-created apps will be shown here."
description="custom apps content" description="custom apps content"
/> />

View file

@ -9,6 +9,7 @@ export const DeactivatedText: React.FC<{}> = () => {
return ( return (
<Typography className={classes.root}> <Typography className={classes.root}>
<FormattedMessage <FormattedMessage
id="5+Xcrz"
defaultMessage="Deactivated" defaultMessage="Deactivated"
description="app deactivated" description="app deactivated"
/> />

View file

@ -52,6 +52,7 @@ const InstalledApps: React.FC<InstalledAppsProps> = ({
<Card className={classes.apps}> <Card className={classes.apps}>
<CardTitle <CardTitle
title={intl.formatMessage({ title={intl.formatMessage({
id: "ZeD2TK",
defaultMessage: "Third-party Apps", defaultMessage: "Third-party Apps",
description: "section header" description: "section header"
})} })}
@ -105,6 +106,7 @@ const InstalledApps: React.FC<InstalledAppsProps> = ({
onClick={stopPropagation(onRowAboutClick(app.node.id))} onClick={stopPropagation(onRowAboutClick(app.node.id))}
> >
<FormattedMessage <FormattedMessage
id="TBaMo2"
defaultMessage="About" defaultMessage="About"
description="about app" description="about app"
/> />
@ -126,6 +128,7 @@ const InstalledApps: React.FC<InstalledAppsProps> = ({
<TableCell className={classes.colName}> <TableCell className={classes.colName}>
<Typography className={classes.text} variant="body2"> <Typography className={classes.text} variant="body2">
<FormattedMessage <FormattedMessage
id="9tgY4G"
defaultMessage="You dont have any installed apps in your dashboard" defaultMessage="You dont have any installed apps in your dashboard"
description="apps content" description="apps content"
/> />

View file

@ -16,6 +16,7 @@ const Marketplace: React.FC<MarketplaceProps> = ({ link }) => {
<Card> <Card>
<CardTitle <CardTitle
title={intl.formatMessage({ title={intl.formatMessage({
id: "SwISVH",
defaultMessage: "Saleor Marketplace", defaultMessage: "Saleor Marketplace",
description: "section header" description: "section header"
})} })}
@ -25,12 +26,14 @@ const Marketplace: React.FC<MarketplaceProps> = ({ link }) => {
<> <>
<Typography variant="body2"> <Typography variant="body2">
<FormattedMessage <FormattedMessage
id="LATpSE"
defaultMessage="Discover great free and paid apps in our Saleor Marketplace." defaultMessage="Discover great free and paid apps in our Saleor Marketplace."
description="marketplace content" description="marketplace content"
/> />
</Typography> </Typography>
<Button onClick={link}> <Button onClick={link}>
<FormattedMessage <FormattedMessage
id="wxFwUW"
defaultMessage="Visit Marketplace" defaultMessage="Visit Marketplace"
description="marketplace button" description="marketplace button"
/> />
@ -39,6 +42,7 @@ const Marketplace: React.FC<MarketplaceProps> = ({ link }) => {
) : ( ) : (
<Typography variant="body2"> <Typography variant="body2">
<FormattedMessage <FormattedMessage
id="NskBjH"
defaultMessage="Marketplace is coming soon" defaultMessage="Marketplace is coming soon"
description="marketplace content" description="marketplace content"
/> />

View file

@ -58,6 +58,7 @@ const TokenCreateDialog: React.FC<TokenCreateDialogProps> = props => {
<> <>
<DialogTitle> <DialogTitle>
<FormattedMessage <FormattedMessage
id="T5nU7u"
defaultMessage="Create Token" defaultMessage="Create Token"
description="header" description="header"
/> />
@ -66,11 +67,15 @@ const TokenCreateDialog: React.FC<TokenCreateDialogProps> = props => {
{step === "form" ? ( {step === "form" ? (
<> <>
<Typography> <Typography>
<FormattedMessage defaultMessage="Access token is used to authenticate service accounts" /> <FormattedMessage
id="k0rGBI"
defaultMessage="Access token is used to authenticate service accounts"
/>
</Typography> </Typography>
<FormSpacer /> <FormSpacer />
<TextField <TextField
label={intl.formatMessage({ label={intl.formatMessage({
id: "0DRBjg",
defaultMessage: "Token Note" defaultMessage: "Token Note"
})} })}
value={data.name} value={data.name}
@ -82,12 +87,18 @@ const TokenCreateDialog: React.FC<TokenCreateDialogProps> = props => {
) : ( ) : (
<> <>
<Typography> <Typography>
<FormattedMessage defaultMessage="Weve created your token. Make sure to copy your new personal access token now. You wont be able to see it again." /> <FormattedMessage
id="t9a9GQ"
defaultMessage="Weve created your token. Make sure to copy your new personal access token now. You wont be able to see it again."
/>
</Typography> </Typography>
<CardSpacer /> <CardSpacer />
<Paper className={classes.paper} elevation={0}> <Paper className={classes.paper} elevation={0}>
<Typography variant="caption"> <Typography variant="caption">
<FormattedMessage defaultMessage="Generated Token" /> <FormattedMessage
id="Kxiige"
defaultMessage="Generated Token"
/>
</Typography> </Typography>
<Typography data-test-id="generated-token"> <Typography data-test-id="generated-token">
{token} {token}
@ -97,6 +108,7 @@ const TokenCreateDialog: React.FC<TokenCreateDialogProps> = props => {
onClick={() => handleCopy(token)} onClick={() => handleCopy(token)}
> >
<FormattedMessage <FormattedMessage
id="HVFq//"
defaultMessage="Copy token" defaultMessage="Copy token"
description="button" description="button"
/> />
@ -115,6 +127,7 @@ const TokenCreateDialog: React.FC<TokenCreateDialogProps> = props => {
onClick={submit} onClick={submit}
> >
<FormattedMessage <FormattedMessage
id="isM94c"
defaultMessage="Create" defaultMessage="Create"
description="create service token, button" description="create service token, button"
/> />

View file

@ -29,12 +29,14 @@ const TokenDeleteDialog: React.FC<TokenDeleteDialogProps> = ({
onConfirm={onConfirm} onConfirm={onConfirm}
variant="delete" variant="delete"
title={intl.formatMessage({ title={intl.formatMessage({
id: "quV5zH",
defaultMessage: "Delete Token", defaultMessage: "Delete Token",
description: "dialog title" description: "dialog title"
})} })}
> >
<DialogContentText> <DialogContentText>
<FormattedMessage <FormattedMessage
id="2VSP8C"
defaultMessage="Are you sure you want to delete token {token}?" defaultMessage="Are you sure you want to delete token {token}?"
description="delete token" description="delete token"
values={{ values={{

View file

@ -2,14 +2,17 @@ import { defineMessages } from "react-intl";
export const appMessages = defineMessages({ export const appMessages = defineMessages({
failedToFetchAppSettings: { failedToFetchAppSettings: {
id: "ac+Y98",
defaultMessage: "Failed to fetch app settings", defaultMessage: "Failed to fetch app settings",
description: "app settings error" description: "app settings error"
}, },
appActivated: { appActivated: {
id: "D/+84n",
defaultMessage: "App activated", defaultMessage: "App activated",
description: "snackbar text" description: "snackbar text"
}, },
appDeactivated: { appDeactivated: {
id: "USO8PB",
defaultMessage: "App deactivated", defaultMessage: "App deactivated",
description: "snackbar text" description: "snackbar text"
} }

View file

@ -2,6 +2,7 @@ import { defineMessages } from "react-intl";
export const messages = defineMessages({ export const messages = defineMessages({
installApp: { installApp: {
id: "2cjt25",
defaultMessage: "Install App", defaultMessage: "Install App",
description: "window title" description: "window title"
} }

View file

@ -2,18 +2,22 @@ import { defineMessages } from "react-intl";
export const messages = defineMessages({ export const messages = defineMessages({
appInstalled: { appInstalled: {
id: "0fM/pV",
defaultMessage: "App installed", defaultMessage: "App installed",
description: "message title" description: "message title"
}, },
appRemoved: { appRemoved: {
id: "uIPD1i",
defaultMessage: "App successfully removed", defaultMessage: "App successfully removed",
description: "app has been removed" description: "app has been removed"
}, },
appReadyToUse: { appReadyToUse: {
id: "ZprV2g",
defaultMessage: "{name} is ready to be used", defaultMessage: "{name} is ready to be used",
description: "app has been installed" description: "app has been installed"
}, },
appCouldntInstall: { appCouldntInstall: {
id: "5t/4um",
defaultMessage: "Couldnt Install {name}", defaultMessage: "Couldnt Install {name}",
description: "message title" description: "message title"
} }

View file

@ -2,6 +2,7 @@ import { defineMessages } from "react-intl";
export const messages = defineMessages({ export const messages = defineMessages({
createApp: { createApp: {
id: "agZQkB",
defaultMessage: "Create App", defaultMessage: "Create App",
description: "window title" description: "window title"
} }

View file

@ -28,6 +28,7 @@ const AttributeBulkDeleteDialog: React.FC<AttributeBulkDeleteDialogProps> = ({
onClose={onClose} onClose={onClose}
onConfirm={onConfirm} onConfirm={onConfirm}
title={intl.formatMessage({ title={intl.formatMessage({
id: "rKf4LU",
defaultMessage: "Delete attributes", defaultMessage: "Delete attributes",
description: "dialog title" description: "dialog title"
})} })}
@ -35,6 +36,7 @@ const AttributeBulkDeleteDialog: React.FC<AttributeBulkDeleteDialogProps> = ({
> >
<DialogContentText> <DialogContentText>
<FormattedMessage <FormattedMessage
id="lG/MDw"
defaultMessage="{counter,plural,one{Are you sure you want to delete this attribute?} other{Are you sure you want to delete {displayQuantity} attributes?}}" defaultMessage="{counter,plural,one{Are you sure you want to delete this attribute?} other{Are you sure you want to delete {displayQuantity} attributes?}}"
description="dialog content" description="dialog content"
values={{ values={{

View file

@ -29,12 +29,14 @@ const AttributeDeleteDialog: React.FC<AttributeDeleteDialogProps> = ({
onConfirm={onConfirm} onConfirm={onConfirm}
variant="delete" variant="delete"
title={intl.formatMessage({ title={intl.formatMessage({
id: "JI2Xwp",
defaultMessage: "Delete attribute", defaultMessage: "Delete attribute",
description: "dialog title" description: "dialog title"
})} })}
> >
<DialogContentText> <DialogContentText>
<FormattedMessage <FormattedMessage
id="h1rPPg"
defaultMessage="Are you sure you want to delete {attributeName}?" defaultMessage="Are you sure you want to delete {attributeName}?"
description="dialog content" description="dialog content"
values={{ values={{

View file

@ -24,10 +24,12 @@ import { inputTypeMessages, messages } from "./messages";
const entityTypeMessages = defineMessages({ const entityTypeMessages = defineMessages({
page: { page: {
id: "Iafyt5",
defaultMessage: "Pages", defaultMessage: "Pages",
description: "page attribute entity type" description: "page attribute entity type"
}, },
product: { product: {
id: "5TUpjG",
defaultMessage: "Products", defaultMessage: "Products",
description: "product attribute entity type" description: "product attribute entity type"
} }

View file

@ -3,43 +3,53 @@ import { defineMessages } from "react-intl";
export const messages = defineMessages({ export const messages = defineMessages({
attributeLabel: { attributeLabel: {
id: "xOEZjV",
defaultMessage: "Default Label", defaultMessage: "Default Label",
description: "attribute's label" description: "attribute's label"
}, },
attributeSlug: { attributeSlug: {
id: "P79U4b",
defaultMessage: "Attribute Code", defaultMessage: "Attribute Code",
description: "attribute's slug short code label" description: "attribute's slug short code label"
}, },
attributeSlugHelperText: { attributeSlugHelperText: {
id: "Q7uuDr",
defaultMessage: "This is used internally. Make sure you dont use spaces", defaultMessage: "This is used internally. Make sure you dont use spaces",
description: "attribute slug input field helper text" description: "attribute slug input field helper text"
}, },
entityType: { entityType: {
id: "LnRlch",
defaultMessage: "Entity", defaultMessage: "Entity",
description: "attribute's editor component entity" description: "attribute's editor component entity"
}, },
inputType: { inputType: {
id: "oIvtua",
defaultMessage: "Catalog Input type for Store Owner", defaultMessage: "Catalog Input type for Store Owner",
description: "attribute's editor component" description: "attribute's editor component"
}, },
valueRequired: { valueRequired: {
id: "njBulj",
defaultMessage: "Value Required", defaultMessage: "Value Required",
description: "check to require attribute to have value" description: "check to require attribute to have value"
}, },
selectUnit: { selectUnit: {
id: "PiSXjb",
defaultMessage: "Select unit", defaultMessage: "Select unit",
description: "check to require numeric attribute unit" description: "check to require numeric attribute unit"
}, },
unitSystem: { unitSystem: {
id: "ghje1I",
defaultMessage: "System", defaultMessage: "System",
description: "numeric attribute unit system" description: "numeric attribute unit system"
}, },
unitOf: { unitOf: {
id: "zWM89r",
defaultMessage: "Units of", defaultMessage: "Units of",
description: "numeric attribute units of" description: "numeric attribute units of"
}, },
unit: { unit: {
id: "Orgqv4",
defaultMessage: "Unit", defaultMessage: "Unit",
description: "numeric attribute unit" description: "numeric attribute unit"
} }
@ -47,42 +57,52 @@ export const messages = defineMessages({
export const inputTypeMessages = defineMessages({ export const inputTypeMessages = defineMessages({
dropdown: { dropdown: {
id: "bZksto",
defaultMessage: "Dropdown", defaultMessage: "Dropdown",
description: "product attribute type" description: "product attribute type"
}, },
file: { file: {
id: "z1y9oL",
defaultMessage: "File", defaultMessage: "File",
description: "file attribute type" description: "file attribute type"
}, },
multiselect: { multiselect: {
id: "cKjFfl",
defaultMessage: "Multiple Select", defaultMessage: "Multiple Select",
description: "product attribute type" description: "product attribute type"
}, },
references: { references: {
id: "5dLpx0",
defaultMessage: "References", defaultMessage: "References",
description: "references attribute type" description: "references attribute type"
}, },
text: { text: {
id: "fdbqIs",
defaultMessage: "Text", defaultMessage: "Text",
description: "text attribute type" description: "text attribute type"
}, },
numeric: { numeric: {
id: "SNiyXb",
defaultMessage: "Numeric", defaultMessage: "Numeric",
description: "numeric attribute type" description: "numeric attribute type"
}, },
boolean: { boolean: {
id: "l5V0QT",
defaultMessage: "Boolean", defaultMessage: "Boolean",
description: "boolean attribute type" description: "boolean attribute type"
}, },
date: { date: {
id: "fU+a9k",
defaultMessage: "Date", defaultMessage: "Date",
description: "date attribute type" description: "date attribute type"
}, },
dateTime: { dateTime: {
id: "DzPVnj",
defaultMessage: "Date Time", defaultMessage: "Date Time",
description: "date time attribute type" description: "date time attribute type"
}, },
swatch: { swatch: {
id: "gx4wCT",
defaultMessage: "Swatch", defaultMessage: "Swatch",
description: "swatch attribute type" description: "swatch attribute type"
} }
@ -90,10 +110,12 @@ export const inputTypeMessages = defineMessages({
export const unitSystemMessages = defineMessages({ export const unitSystemMessages = defineMessages({
metric: { metric: {
id: "ZayvsI",
defaultMessage: "Metric", defaultMessage: "Metric",
description: "metric unit system" description: "metric unit system"
}, },
imperial: { imperial: {
id: "YgE6ga",
defaultMessage: "Imperial", defaultMessage: "Imperial",
description: "imperial unit system" description: "imperial unit system"
} }
@ -101,28 +123,40 @@ export const unitSystemMessages = defineMessages({
export const unitTypeMessages = defineMessages({ export const unitTypeMessages = defineMessages({
volume: { volume: {
id: "cy8sV7",
defaultMessage: "Volume", defaultMessage: "Volume",
description: "volume units types" description: "volume units types"
}, },
distance: { distance: {
id: "k/mTEl",
defaultMessage: "Distance", defaultMessage: "Distance",
description: "distance units type" description: "distance units type"
}, },
weight: { weight: {
id: "Vdy5g7",
defaultMessage: "Weight", defaultMessage: "Weight",
description: "weight units type" description: "weight units type"
}, },
area: { area: {
id: "A9QSur",
defaultMessage: "Area", defaultMessage: "Area",
description: "area units type" description: "area units type"
} }
}); });
export const unitMessages = defineMessages({ export const unitMessages = defineMessages({
pint: { defaultMessage: "pint", description: "pint unit" }, pint: { id: "B0PaVS", defaultMessage: "pint", description: "pint unit" },
acreInch: { defaultMessage: "acre-inch", description: "acre-inch unit" }, acreInch: {
acreFt: { defaultMessage: "acre-ft", description: "acre-ft unit" } id: "jBu2yj",
defaultMessage: "acre-inch",
description: "acre-inch unit"
},
acreFt: {
id: "5XG1CO",
defaultMessage: "acre-ft",
description: "acre-ft unit"
}
}); });
export const units = { export const units = {

View file

@ -101,7 +101,7 @@ const AttributeList: React.FC<AttributeListProps> = ({
arrowPosition="right" arrowPosition="right"
onClick={() => onSort(AttributeListUrlSortField.slug)} onClick={() => onSort(AttributeListUrlSortField.slug)}
> >
<FormattedMessage defaultMessage="Attribute Code" /> <FormattedMessage id="oJkeS6" defaultMessage="Attribute Code" />
</TableCellHeader> </TableCellHeader>
<TableCellHeader <TableCellHeader
className={classes.colName} className={classes.colName}
@ -113,6 +113,7 @@ const AttributeList: React.FC<AttributeListProps> = ({
onClick={() => onSort(AttributeListUrlSortField.name)} onClick={() => onSort(AttributeListUrlSortField.name)}
> >
<FormattedMessage <FormattedMessage
id="HjUoHK"
defaultMessage="Default Label" defaultMessage="Default Label"
description="attribute's label'" description="attribute's label'"
/> />
@ -128,6 +129,7 @@ const AttributeList: React.FC<AttributeListProps> = ({
onClick={() => onSort(AttributeListUrlSortField.visible)} onClick={() => onSort(AttributeListUrlSortField.visible)}
> >
<FormattedMessage <FormattedMessage
id="k6WDZl"
defaultMessage="Visible" defaultMessage="Visible"
description="attribute is visible" description="attribute is visible"
/> />
@ -143,6 +145,7 @@ const AttributeList: React.FC<AttributeListProps> = ({
onClick={() => onSort(AttributeListUrlSortField.searchable)} onClick={() => onSort(AttributeListUrlSortField.searchable)}
> >
<FormattedMessage <FormattedMessage
id="yKuba7"
defaultMessage="Searchable" defaultMessage="Searchable"
description="attribute can be searched in dashboard" description="attribute can be searched in dashboard"
/> />
@ -159,6 +162,7 @@ const AttributeList: React.FC<AttributeListProps> = ({
> >
<FormattedMessage <FormattedMessage
defaultMessage="Use as filter" defaultMessage="Use as filter"
id="Y3pCRX"
description="attribute can be searched in storefront" description="attribute can be searched in storefront"
/> />
</TableCellHeader> </TableCellHeader>
@ -248,7 +252,10 @@ const AttributeList: React.FC<AttributeListProps> = ({
() => ( () => (
<TableRow> <TableRow>
<TableCell colSpan={numberOfColumns}> <TableCell colSpan={numberOfColumns}>
<FormattedMessage defaultMessage="No attributes found" /> <FormattedMessage
id="ztQgD8"
defaultMessage="No attributes found"
/>
</TableCell> </TableCell>
</TableRow> </TableRow>
) )

View file

@ -64,6 +64,7 @@ const AttributeListPage: React.FC<AttributeListPageProps> = ({
data-test-id="create-attribute-button" data-test-id="create-attribute-button"
> >
<FormattedMessage <FormattedMessage
id="IGvQ8k"
defaultMessage="Create attribute" defaultMessage="Create attribute"
description="button" description="button"
/> />
@ -72,6 +73,7 @@ const AttributeListPage: React.FC<AttributeListPageProps> = ({
<Card> <Card>
<FilterBar <FilterBar
allTabLabel={intl.formatMessage({ allTabLabel={intl.formatMessage({
id: "dKPMyh",
defaultMessage: "All Attributes", defaultMessage: "All Attributes",
description: "tab name" description: "tab name"
})} })}
@ -79,6 +81,7 @@ const AttributeListPage: React.FC<AttributeListPageProps> = ({
filterStructure={structure} filterStructure={structure}
initialSearch={initialSearch} initialSearch={initialSearch}
searchPlaceholder={intl.formatMessage({ searchPlaceholder={intl.formatMessage({
id: "1div9r",
defaultMessage: "Search Attribute" defaultMessage: "Search Attribute"
})} })}
tabs={tabs} tabs={tabs}

View file

@ -20,18 +20,22 @@ export interface AttributeListFilterOpts {
const messages = defineMessages({ const messages = defineMessages({
filterableInStorefront: { filterableInStorefront: {
id: "PsRG+v",
defaultMessage: "Filterable in Storefront", defaultMessage: "Filterable in Storefront",
description: "use attribute in filtering" description: "use attribute in filtering"
}, },
isVariantOnly: { isVariantOnly: {
id: "rvk9ls",
defaultMessage: "Variant Only", defaultMessage: "Variant Only",
description: "attribute can be used only in variants" description: "attribute can be used only in variants"
}, },
valueRequired: { valueRequired: {
id: "HQR2y0",
defaultMessage: "Value Required", defaultMessage: "Value Required",
description: "attribute value is required" description: "attribute value is required"
}, },
visibleInStorefront: { visibleInStorefront: {
id: "cvbqJu",
defaultMessage: "Visible on Product Page in Storefront", defaultMessage: "Visible on Product Page in Storefront",
description: "attribute" description: "attribute"
} }

View file

@ -17,10 +17,12 @@ export interface AttributeOrganizationProps {
const messages = defineMessages({ const messages = defineMessages({
contentAttribute: { contentAttribute: {
id: "zbJHl7",
defaultMessage: "Content Attribute", defaultMessage: "Content Attribute",
description: "attribute type" description: "attribute type"
}, },
productAttribute: { productAttribute: {
id: "qkRuT0",
defaultMessage: "Product Attribute", defaultMessage: "Product Attribute",
description: "attribute type" description: "attribute type"
} }
@ -52,6 +54,7 @@ const AttributeOrganization: React.FC<AttributeOrganizationProps> = props => {
<Card> <Card>
<CardTitle <CardTitle
title={intl.formatMessage({ title={intl.formatMessage({
id: "nwvQPg",
defaultMessage: "Organization", defaultMessage: "Organization",
description: "section header" description: "section header"
})} })}
@ -72,9 +75,15 @@ const AttributeOrganization: React.FC<AttributeOrganizationProps> = props => {
disabled={disabled} disabled={disabled}
label={ label={
<> <>
<FormattedMessage defaultMessage="Attribute Class" /> <FormattedMessage
id="v1pNHW"
defaultMessage="Attribute Class"
/>
<Typography variant="caption"> <Typography variant="caption">
<FormattedMessage defaultMessage="Define where this attribute should be used in Saleor system" /> <FormattedMessage
id="ErNH3D"
defaultMessage="Define where this attribute should be used in Saleor system"
/>
</Typography> </Typography>
</> </>
} }
@ -85,7 +94,7 @@ const AttributeOrganization: React.FC<AttributeOrganizationProps> = props => {
) : ( ) : (
<> <>
<Typography className={classes.label} variant="caption"> <Typography className={classes.label} variant="caption">
<FormattedMessage defaultMessage="Attribute Class" /> <FormattedMessage id="v1pNHW" defaultMessage="Attribute Class" />
</Typography> </Typography>
<Typography> <Typography>
{data.type === AttributeTypeEnum.PRODUCT_TYPE {data.type === AttributeTypeEnum.PRODUCT_TYPE

View file

@ -184,6 +184,7 @@ const AttributePage: React.FC<AttributePageProps> = ({
title={ title={
attribute === null attribute === null
? intl.formatMessage({ ? intl.formatMessage({
id: "8cUEPV",
defaultMessage: "Create New Attribute", defaultMessage: "Create New Attribute",
description: "page title" description: "page title"
}) })

View file

@ -15,44 +15,54 @@ import { AttributePageFormData } from "../AttributePage";
const messages = defineMessages({ const messages = defineMessages({
availableInGrid: { availableInGrid: {
id: "jswILH",
defaultMessage: "Add to Column Options", defaultMessage: "Add to Column Options",
description: "add attribute as column in product list table" description: "add attribute as column in product list table"
}, },
availableInGridCaption: { availableInGridCaption: {
id: "AzMSmb",
defaultMessage: defaultMessage:
"If enabled this attribute can be used as a column in product table.", "If enabled this attribute can be used as a column in product table.",
description: "caption" description: "caption"
}, },
dashboardPropertiesTitle: { dashboardPropertiesTitle: {
id: "lCxfDe",
defaultMessage: "Dashboard Properties", defaultMessage: "Dashboard Properties",
description: "attribute properties regarding dashboard" description: "attribute properties regarding dashboard"
}, },
filterableInDashboard: { filterableInDashboard: {
id: "RH+aOF",
defaultMessage: "Use in Filtering", defaultMessage: "Use in Filtering",
description: "use attribute in filtering" description: "use attribute in filtering"
}, },
filterableInDashboardCaption: { filterableInDashboardCaption: {
id: "Q9wTrz",
defaultMessage: defaultMessage:
"If enabled, youll be able to use this attribute to filter products in product list.", "If enabled, youll be able to use this attribute to filter products in product list.",
description: "caption" description: "caption"
}, },
filterableInStorefront: { filterableInStorefront: {
defaultMessage: "Use as filter", defaultMessage: "Use as filter",
id: "e1vU/4",
description: "attribute is filterable in storefront" description: "attribute is filterable in storefront"
}, },
storefrontPropertiesTitle: { storefrontPropertiesTitle: {
id: "AgY5Mv",
defaultMessage: "Storefront Properties", defaultMessage: "Storefront Properties",
description: "attribute properties regarding storefront" description: "attribute properties regarding storefront"
}, },
storefrontSearchPosition: { storefrontSearchPosition: {
id: "cJ5ASN",
defaultMessage: "Position in faceted navigation", defaultMessage: "Position in faceted navigation",
description: "attribute position in storefront filters" description: "attribute position in storefront filters"
}, },
visibleInStorefront: { visibleInStorefront: {
id: "x8V/xS",
defaultMessage: "Public", defaultMessage: "Public",
description: "attribute visibility in storefront" description: "attribute visibility in storefront"
}, },
visibleInStorefrontCaption: { visibleInStorefrontCaption: {
id: "h2Hta6",
defaultMessage: "If enabled, attribute will be accessible to customers.", defaultMessage: "If enabled, attribute will be accessible to customers.",
description: "caption" description: "caption"
} }

View file

@ -2,10 +2,12 @@ import { defineMessages } from "react-intl";
export const swatchFieldMessages = defineMessages({ export const swatchFieldMessages = defineMessages({
image: { image: {
id: "I2wCwj",
defaultMessage: "Image", defaultMessage: "Image",
description: "swatch attribute image label" description: "swatch attribute image label"
}, },
picker: { picker: {
id: "0DgA8v",
defaultMessage: "Picker", defaultMessage: "Picker",
description: "swatch attribute color picker label" description: "swatch attribute color picker label"
} }

View file

@ -33,6 +33,7 @@ const AttributeValueDeleteDialog: React.FC<AttributeValueDeleteDialogProps> = ({
onConfirm={onConfirm} onConfirm={onConfirm}
variant="delete" variant="delete"
title={intl.formatMessage({ title={intl.formatMessage({
id: "WWV8aZ",
defaultMessage: "Delete attribute value", defaultMessage: "Delete attribute value",
description: "dialog title" description: "dialog title"
})} })}
@ -40,6 +41,7 @@ const AttributeValueDeleteDialog: React.FC<AttributeValueDeleteDialogProps> = ({
<DialogContentText> <DialogContentText>
{useName ? ( {useName ? (
<FormattedMessage <FormattedMessage
id="no3Ygn"
defaultMessage='Are you sure you want to delete "{name}" value? If you delete it you wont be able to assign it to any of the products with "{attributeName}" attribute.' defaultMessage='Are you sure you want to delete "{name}" value? If you delete it you wont be able to assign it to any of the products with "{attributeName}" attribute.'
values={{ values={{
attributeName, attributeName,
@ -48,6 +50,7 @@ const AttributeValueDeleteDialog: React.FC<AttributeValueDeleteDialogProps> = ({
/> />
) : ( ) : (
<FormattedMessage <FormattedMessage
id="JyQoES"
defaultMessage='Are you sure you want to delete "{name}" value?' defaultMessage='Are you sure you want to delete "{name}" value?'
description="delete attribute value" description="delete attribute value"
values={{ values={{

View file

@ -65,11 +65,13 @@ const AttributeValueEditDialog: React.FC<AttributeValueEditDialogProps> = ({
<DialogTitle> <DialogTitle>
{attributeValue === null ? ( {attributeValue === null ? (
<FormattedMessage <FormattedMessage
id="PqMbma"
defaultMessage="Add Value" defaultMessage="Add Value"
description="add attribute value" description="add attribute value"
/> />
) : ( ) : (
<FormattedMessage <FormattedMessage
id="XYhE8p"
defaultMessage="Edit Value" defaultMessage="Edit Value"
description="edit attribute value" description="edit attribute value"
/> />
@ -91,6 +93,7 @@ const AttributeValueEditDialog: React.FC<AttributeValueEditDialogProps> = ({
)} )}
name={"name" as keyof AttributeValueEditDialogFormData} name={"name" as keyof AttributeValueEditDialogFormData}
label={intl.formatMessage({ label={intl.formatMessage({
id: "UhcALJ",
defaultMessage: "Name", defaultMessage: "Name",
description: "attribute name" description: "attribute name"
})} })}

View file

@ -92,6 +92,7 @@ const AttributeValues: React.FC<AttributeValuesProps> = ({
<Card> <Card>
<CardTitle <CardTitle
title={intl.formatMessage({ title={intl.formatMessage({
id: "J3uE0t",
defaultMessage: "Attribute Values", defaultMessage: "Attribute Values",
description: "section header" description: "section header"
})} })}
@ -103,6 +104,7 @@ const AttributeValues: React.FC<AttributeValuesProps> = ({
data-test-id="assign-value-button" data-test-id="assign-value-button"
> >
<FormattedMessage <FormattedMessage
id="+iVKR1"
defaultMessage="Assign value" defaultMessage="Assign value"
description="assign attribute value button" description="assign attribute value button"
/> />
@ -116,6 +118,7 @@ const AttributeValues: React.FC<AttributeValuesProps> = ({
{isSwatch && ( {isSwatch && (
<TableCell className={classes.columnSwatch}> <TableCell className={classes.columnSwatch}>
<FormattedMessage <FormattedMessage
id="NUevU9"
defaultMessage="Swatch" defaultMessage="Swatch"
description="attribute values list: slug column header" description="attribute values list: slug column header"
/> />
@ -123,12 +126,14 @@ const AttributeValues: React.FC<AttributeValuesProps> = ({
)} )}
<TableCell className={classes.columnAdmin}> <TableCell className={classes.columnAdmin}>
<FormattedMessage <FormattedMessage
id="3psvRS"
defaultMessage="Admin" defaultMessage="Admin"
description="attribute values list: slug column header" description="attribute values list: slug column header"
/> />
</TableCell> </TableCell>
<TableCell className={classes.columnStore}> <TableCell className={classes.columnStore}>
<FormattedMessage <FormattedMessage
id="H60H6L"
defaultMessage="Default Store View" defaultMessage="Default Store View"
description="attribute values list: name column header" description="attribute values list: name column header"
/> />
@ -196,6 +201,7 @@ const AttributeValues: React.FC<AttributeValuesProps> = ({
<TableRow> <TableRow>
<TableCell colSpan={numberOfColumns}> <TableCell colSpan={numberOfColumns}>
<FormattedMessage <FormattedMessage
id="g5zIpS"
defaultMessage="No values found" defaultMessage="No values found"
description="No attribute values found" description="No attribute values found"
/> />

View file

@ -4,9 +4,11 @@ import { defineMessages, IntlShape } from "react-intl";
const messages = defineMessages({ const messages = defineMessages({
attributeSlugUnique: { attributeSlugUnique: {
id: "eWV760",
defaultMessage: "Attribute with this slug already exists" defaultMessage: "Attribute with this slug already exists"
}, },
attributeValueAlreadyExists: { attributeValueAlreadyExists: {
id: "J/QqOI",
defaultMessage: "This value already exists within this attribute" defaultMessage: "This value already exists within this attribute"
} }
}); });

View file

@ -89,6 +89,7 @@ const AttributeDetails: React.FC<AttributeDetailsProps> = ({ params }) => {
notify({ notify({
status: "success", status: "success",
text: intl.formatMessage({ text: intl.formatMessage({
id: "jTifz+",
defaultMessage: "Successfully created attribute" defaultMessage: "Successfully created attribute"
}) })
}); });
@ -100,7 +101,7 @@ const AttributeDetails: React.FC<AttributeDetailsProps> = ({ params }) => {
const [updatePrivateMetadata] = useUpdatePrivateMetadataMutation({}); const [updatePrivateMetadata] = useUpdatePrivateMetadataMutation({});
const id = params.id const id = params.id
? parseInt(params.id, 0) + pageInfo.startCursor ? parseInt(params.id, 10) + pageInfo.startCursor
: undefined; : undefined;
const [openModal, closeModal] = createDialogActionHandlers< const [openModal, closeModal] = createDialogActionHandlers<

View file

@ -95,6 +95,7 @@ const AttributeDetails: React.FC<AttributeDetailsProps> = ({ id, params }) => {
notify({ notify({
status: "success", status: "success",
text: intl.formatMessage({ text: intl.formatMessage({
id: "V/VAHG",
defaultMessage: "Attribute deleted" defaultMessage: "Attribute deleted"
}) })
}); });
@ -112,6 +113,7 @@ const AttributeDetails: React.FC<AttributeDetailsProps> = ({ id, params }) => {
notify({ notify({
status: "success", status: "success",
text: intl.formatMessage({ text: intl.formatMessage({
id: "7H2D5m",
defaultMessage: "Value deleted", defaultMessage: "Value deleted",
description: "attribute value deleted" description: "attribute value deleted"
}) })
@ -150,6 +152,7 @@ const AttributeDetails: React.FC<AttributeDetailsProps> = ({ id, params }) => {
notify({ notify({
status: "success", status: "success",
text: intl.formatMessage({ text: intl.formatMessage({
id: "xVn5B0",
defaultMessage: "Added new value", defaultMessage: "Added new value",
description: "added new attribute value" description: "added new attribute value"
}) })
@ -224,7 +227,10 @@ const AttributeDetails: React.FC<AttributeDetailsProps> = ({ id, params }) => {
"metadata", "metadata",
"privateMetadata" "privateMetadata"
]), ]),
storefrontSearchPosition: parseInt(data.storefrontSearchPosition, 0) storefrontSearchPosition: parseInt(
data.storefrontSearchPosition,
10
)
} }
} }
}) })

View file

@ -81,6 +81,7 @@ const AttributeList: React.FC<AttributeListProps> = ({ params }) => {
notify({ notify({
status: "success", status: "success",
text: intl.formatMessage({ text: intl.formatMessage({
id: "lw9WIk",
defaultMessage: "Attributes successfully delete", defaultMessage: "Attributes successfully delete",
description: "deleted multiple attributes" description: "deleted multiple attributes"
}) })

View file

@ -56,6 +56,7 @@ const LoginCard: React.FC<LoginCardProps> = props => {
<> <>
<Typography variant="h3" className={classes.header}> <Typography variant="h3" className={classes.header}>
<FormattedMessage <FormattedMessage
id="vzgZ3U"
defaultMessage="Sign In" defaultMessage="Sign In"
description="card header" description="card header"
/> />
@ -84,6 +85,7 @@ const LoginCard: React.FC<LoginCardProps> = props => {
fullWidth fullWidth
autoComplete="password" autoComplete="password"
label={intl.formatMessage({ label={intl.formatMessage({
id: "5sg7KC",
defaultMessage: "Password" defaultMessage: "Password"
})} })}
name="password" name="password"
@ -114,6 +116,7 @@ const LoginCard: React.FC<LoginCardProps> = props => {
data-test-id="reset-password-link" data-test-id="reset-password-link"
> >
<FormattedMessage <FormattedMessage
id="3tbL7x"
defaultMessage="Forgot password?" defaultMessage="Forgot password?"
description="description" description="description"
/> />
@ -127,7 +130,11 @@ const LoginCard: React.FC<LoginCardProps> = props => {
type="submit" type="submit"
data-test-id="submit" data-test-id="submit"
> >
<FormattedMessage defaultMessage="Sign in" description="button" /> <FormattedMessage
id="AubJ/S"
defaultMessage="Sign in"
description="button"
/>
</Button> </Button>
</div> </div>
{externalAuthentications.length > 0 && ( {externalAuthentications.length > 0 && (
@ -137,6 +144,7 @@ const LoginCard: React.FC<LoginCardProps> = props => {
<FormSpacer /> <FormSpacer />
<Typography> <Typography>
<FormattedMessage <FormattedMessage
id="ENBELI"
defaultMessage="or login using" defaultMessage="or login using"
description="description" description="description"
/> />

View file

@ -11,7 +11,6 @@ export interface LoginFormData {
export interface UseLoginFormResult { export interface UseLoginFormResult {
change: FormChange; change: FormChange;
data: LoginFormData; data: LoginFormData;
hasChanged: boolean;
submit: () => SubmitPromise; submit: () => SubmitPromise;
} }
@ -35,16 +34,15 @@ function useLoginForm(
): UseLoginFormResult { ): UseLoginFormResult {
const form = useForm(getLoginFormData()); const form = useForm(getLoginFormData());
const { change, hasChanged, data, setChanged } = form; const { change, data } = form;
const handleFormSubmit = useHandleFormSubmit({ onSubmit, setChanged }); const handleFormSubmit = useHandleFormSubmit({ onSubmit });
const submit = async () => handleFormSubmit(data); const submit = async () => handleFormSubmit(data);
return { return {
change, change,
data, data,
hasChanged,
submit submit
}; };
} }

View file

@ -3,15 +3,18 @@ import { defineMessages, IntlShape } from "react-intl";
export const errorMessages = defineMessages({ export const errorMessages = defineMessages({
loginError: { loginError: {
id: "tTtoKd",
defaultMessage: defaultMessage:
"Sorry, your username and/or password are incorrect. Please try again.", "Sorry, your username and/or password are incorrect. Please try again.",
description: "error message" description: "error message"
}, },
externalLoginError: { externalLoginError: {
id: "M4q0Ye",
defaultMessage: "Sorry, login went wrong. Please try again.", defaultMessage: "Sorry, login went wrong. Please try again.",
description: "error message" description: "error message"
}, },
serverError: { serverError: {
id: "ChGI4V",
defaultMessage: defaultMessage:
"Saleor is unavailable, please check your network connection and try again.", "Saleor is unavailable, please check your network connection and try again.",
description: "error message" description: "error message"

View file

@ -45,13 +45,17 @@ const NewPasswordPage: React.FC<NewPasswordPageProps> = props => {
<> <>
<Typography variant="h3" className={classes.header}> <Typography variant="h3" className={classes.header}>
<FormattedMessage <FormattedMessage
id="WhKGPA"
defaultMessage="Set up new password" defaultMessage="Set up new password"
description="page title" description="page title"
/> />
</Typography> </Typography>
{!!error && <div className={classes.panel}>{error}</div>} {!!error && <div className={classes.panel}>{error}</div>}
<Typography variant="caption" color="textSecondary"> <Typography variant="caption" color="textSecondary">
<FormattedMessage defaultMessage="Please set up a new password for your account. Repeat your new password to make sure you will be able to remember it." /> <FormattedMessage
id="m0Dz+2"
defaultMessage="Please set up a new password for your account. Repeat your new password to make sure you will be able to remember it."
/>
</Typography> </Typography>
<FormSpacer /> <FormSpacer />
<TextField <TextField
@ -60,6 +64,7 @@ const NewPasswordPage: React.FC<NewPasswordPageProps> = props => {
autoComplete="none" autoComplete="none"
disabled={disabled} disabled={disabled}
label={intl.formatMessage({ label={intl.formatMessage({
id: "Ev6SEF",
defaultMessage: "New Password" defaultMessage: "New Password"
})} })}
name="password" name="password"
@ -77,6 +82,7 @@ const NewPasswordPage: React.FC<NewPasswordPageProps> = props => {
autoComplete="none" autoComplete="none"
disabled={disabled} disabled={disabled}
label={intl.formatMessage({ label={intl.formatMessage({
id: "vfG+nh",
defaultMessage: "Confirm Password" defaultMessage: "Confirm Password"
})} })}
name="confirmPassword" name="confirmPassword"
@ -86,6 +92,7 @@ const NewPasswordPage: React.FC<NewPasswordPageProps> = props => {
helperText={ helperText={
passwordError && passwordError &&
intl.formatMessage({ intl.formatMessage({
id: "7Chrsf",
defaultMessage: "Passwords do not match" defaultMessage: "Passwords do not match"
}) })
} }
@ -103,6 +110,7 @@ const NewPasswordPage: React.FC<NewPasswordPageProps> = props => {
type="submit" type="submit"
> >
<FormattedMessage <FormattedMessage
id="S22jIs"
defaultMessage="Set new password" defaultMessage="Set new password"
description="button" description="button"
/> />

View file

@ -38,11 +38,14 @@ const ResetPasswordPage: React.FC<ResetPasswordPageProps> = props => {
<ArrowRightIcon className={classes.arrow} /> <ArrowRightIcon className={classes.arrow} />
</IconButton> </IconButton>
<Typography variant="h3" className={classes.header}> <Typography variant="h3" className={classes.header}>
<FormattedMessage defaultMessage="Reset password" /> <FormattedMessage id="Yy/yDL" defaultMessage="Reset password" />
</Typography> </Typography>
{!!error && <div className={classes.panel}>{error}</div>} {!!error && <div className={classes.panel}>{error}</div>}
<Typography variant="caption" color="textSecondary"> <Typography variant="caption" color="textSecondary">
<FormattedMessage defaultMessage="Provide us with an email - if we find it in our database we will send you a link to reset your password. You should be able to find it in your inbox in the next couple of minutes." /> <FormattedMessage
id="54M0Gu"
defaultMessage="Provide us with an email - if we find it in our database we will send you a link to reset your password. You should be able to find it in your inbox in the next couple of minutes."
/>
</Typography> </Typography>
<FormSpacer /> <FormSpacer />
<TextField <TextField
@ -68,6 +71,7 @@ const ResetPasswordPage: React.FC<ResetPasswordPageProps> = props => {
type="submit" type="submit"
> >
<FormattedMessage <FormattedMessage
id="lm9NSK"
defaultMessage="Send an email with reset link" defaultMessage="Send an email with reset link"
description="password reset, button" description="password reset, button"
/> />

View file

@ -21,10 +21,13 @@ const ResetPasswordSuccessPage: React.FC<ResetPasswordSuccessPageProps> = props
return ( return (
<> <>
<Typography variant="h3" className={classes.header}> <Typography variant="h3" className={classes.header}>
<FormattedMessage defaultMessage="Reset password" /> <FormattedMessage id="Yy/yDL" defaultMessage="Reset password" />
</Typography> </Typography>
<Typography> <Typography>
<FormattedMessage defaultMessage="Success! In a few minutes youll receive a message with instructions on how to reset your password." /> <FormattedMessage
id="2ob30/"
defaultMessage="Success! In a few minutes youll receive a message with instructions on how to reset your password."
/>
</Typography> </Typography>
<FormSpacer /> <FormSpacer />
<Button <Button
@ -33,7 +36,11 @@ const ResetPasswordSuccessPage: React.FC<ResetPasswordSuccessPageProps> = props
onClick={onBack} onClick={onBack}
type="submit" type="submit"
> >
<FormattedMessage defaultMessage="Back to login" description="button" /> <FormattedMessage
id="2oyWT9"
defaultMessage="Back to login"
description="button"
/>
</Button> </Button>
</> </>
); );

View file

@ -30,6 +30,7 @@ const ResetPasswordView: React.FC = () => {
) { ) {
setError( setError(
intl.formatMessage({ intl.formatMessage({
id: "C0JLNW",
defaultMessage: defaultMessage:
"Provided email address does not exist in our database." "Provided email address does not exist in our database."
}) })

View file

@ -59,6 +59,7 @@ const CategoryBackground: React.FC<CategoryBackgroundProps> = props => {
<Card> <Card>
<CardTitle <CardTitle
title={intl.formatMessage({ title={intl.formatMessage({
id: "DP6b8U",
defaultMessage: "Background Image (optional)", defaultMessage: "Background Image (optional)",
description: "section header" description: "section header"
})} })}
@ -102,6 +103,7 @@ const CategoryBackground: React.FC<CategoryBackgroundProps> = props => {
name="backgroundImageAlt" name="backgroundImageAlt"
label={intl.formatMessage(commonMessages.description)} label={intl.formatMessage(commonMessages.description)}
helperText={intl.formatMessage({ helperText={intl.formatMessage({
id: "0iMYc+",
defaultMessage: "(Optional)", defaultMessage: "(Optional)",
description: "field is optional" description: "field is optional"
})} })}

Some files were not shown because too many files have changed in this diff Show more