Skip to content

Commit 0055bd6

Browse files
committed
merge: get latest changes from dev
2 parents 5e0a389 + 63972fc commit 0055bd6

File tree

11 files changed

+147
-16
lines changed

11 files changed

+147
-16
lines changed

package.json

+3
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,9 @@
206206
"**/*.{js,ts,tsx}": [
207207
"prettier --write",
208208
"eslint --max-warnings=0 --no-ignore"
209+
],
210+
"**/package.json": [
211+
"yarn webiny verify-dependencies"
209212
]
210213
},
211214
"yargs": {

packages/app-headless-cms-common/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
"license": "MIT",
1515
"dependencies": {
1616
"@emotion/react": "11.10.8",
17+
"@emotion/styled": "11.10.6",
1718
"@fortawesome/fontawesome-svg-core": "^1.3.0",
1819
"@webiny/app": "0.0.0",
1920
"@webiny/app-admin": "0.0.0",
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
import React, { ErrorInfo } from "react";
2+
import type { CmsModelField } from "~/types";
3+
import { FieldElementError } from "./FieldElementError";
4+
5+
type State =
6+
| {
7+
hasError: true;
8+
error: Error;
9+
}
10+
| { hasError: false; error: undefined };
11+
12+
interface Props {
13+
field: CmsModelField;
14+
[key: string]: any;
15+
}
16+
17+
export class ErrorBoundary extends React.Component<Props, State> {
18+
constructor(props: Props) {
19+
super(props);
20+
this.state = {
21+
hasError: false,
22+
error: undefined
23+
};
24+
}
25+
26+
static getDerivedStateFromError(error: Error) {
27+
return {
28+
hasError: true,
29+
error
30+
};
31+
}
32+
33+
public override componentDidCatch(error: Error, errorInfo: ErrorInfo) {
34+
const { field } = this.props;
35+
if (!field) {
36+
return;
37+
}
38+
console.groupCollapsed(
39+
`%cFIELD ERROR%c: An error occurred while rendering model field "${field.fieldId}" (${field.id}) of type "${field.type}".`,
40+
"color:red",
41+
"color:default"
42+
);
43+
console.log("Field definition", field);
44+
console.error(error, errorInfo);
45+
console.groupEnd();
46+
}
47+
48+
public override render() {
49+
if (this.state.hasError) {
50+
return (
51+
<FieldElementError
52+
title={`Error: ${this.state.error.message}`}
53+
description={"See developer console for more details."}
54+
/>
55+
);
56+
}
57+
58+
return this.props.children;
59+
}
60+
}

packages/app-headless-cms-common/src/Fields/FieldElement.tsx

+30-3
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,24 @@ import { useBind } from "./useBind";
77
import { useRenderPlugins } from "./useRenderPlugins";
88
import { ModelFieldProvider, useModelField } from "../ModelFieldProvider";
99
import { CmsModelField, CmsEditorContentModel, BindComponent } from "~/types";
10+
import { ErrorBoundary } from "./ErrorBoundary";
1011

1112
const t = i18n.ns("app-headless-cms/admin/components/content-form");
1213

14+
declare global {
15+
// eslint-disable-next-line
16+
namespace JSX {
17+
interface IntrinsicElements {
18+
"hcms-model-field": {
19+
"data-id": string;
20+
"data-type": string;
21+
"data-field-id": string;
22+
children: React.ReactNode;
23+
};
24+
}
25+
}
26+
}
27+
1328
type RenderFieldProps = Omit<FieldElementProps, "field">;
1429

1530
const RenderField = (props: RenderFieldProps) => {
@@ -44,10 +59,22 @@ export interface FieldElementProps {
4459
export const FieldElement = makeDecoratable(
4560
"FieldElement",
4661
({ field, ...props }: FieldElementProps) => {
62+
if (!field) {
63+
return null;
64+
}
65+
4766
return (
48-
<ModelFieldProvider field={field}>
49-
<RenderField {...props} />
50-
</ModelFieldProvider>
67+
<hcms-model-field
68+
data-id={field.id}
69+
data-field-id={field.fieldId}
70+
data-type={field.type}
71+
>
72+
<ErrorBoundary field={field}>
73+
<ModelFieldProvider field={field}>
74+
<RenderField {...props} />
75+
</ModelFieldProvider>
76+
</ErrorBoundary>
77+
</hcms-model-field>
5178
);
5279
}
5380
);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import React from "react";
2+
import styled from "@emotion/styled";
3+
4+
const StyledError = styled.div`
5+
border: 2px solid red;
6+
background-color: #f87e7e;
7+
border-radius: 5px;
8+
padding: 5px 10px;
9+
`;
10+
11+
interface FieldElementErrorProps {
12+
title: string;
13+
description: string;
14+
}
15+
16+
const showError = process.env.NODE_ENV === "development";
17+
18+
export const FieldElementError = (props: FieldElementErrorProps) => {
19+
if (!showError) {
20+
return null;
21+
}
22+
23+
return (
24+
<StyledError>
25+
<h5>{props.title}</h5>
26+
<p>{props.description}</p>
27+
</StyledError>
28+
);
29+
};

packages/app-headless-cms-common/src/Fields/Fields.tsx

+19-9
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import React from "react";
22
import { Cell, Grid } from "@webiny/ui/Grid";
33
import { FieldElement } from "./FieldElement";
4-
import {
4+
import { FieldElementError } from "./FieldElementError";
5+
import type {
56
CmsEditorContentModel,
67
CmsModelField,
78
CmsEditorFieldsLayout,
@@ -25,16 +26,25 @@ export const Fields = ({ Bind, fields, layout, contentModel, gridClassName }: Fi
2526
<Grid className={gridClassName}>
2627
{layout.map((row, rowIndex) => (
2728
<React.Fragment key={rowIndex}>
28-
{row.map(fieldId => {
29-
const field = getFieldById(fields, fieldId) as CmsModelField;
29+
{row.map(id => {
30+
const field = getFieldById(fields, id) as CmsModelField;
3031

3132
return (
32-
<Cell span={Math.floor(12 / row.length)} key={fieldId}>
33-
<FieldElement
34-
field={field}
35-
Bind={Bind}
36-
contentModel={contentModel}
37-
/>
33+
<Cell span={Math.floor(12 / row.length)} key={id}>
34+
{field ? (
35+
<FieldElement
36+
field={field}
37+
Bind={Bind}
38+
contentModel={contentModel}
39+
/>
40+
) : (
41+
<FieldElementError
42+
title={`Missing field with id "${id}"!`}
43+
description={
44+
"Make sure field layout contains the correct field ids (hint: check for typos)."
45+
}
46+
/>
47+
)}
3848
</Cell>
3949
);
4050
})}

packages/app-headless-cms-common/src/Fields/Label.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ interface LabelProps {
1313
children?: React.ReactNode;
1414
}
1515

16-
const Label = ({ children }: LabelProps) => (
16+
export const Label = ({ children }: LabelProps) => (
1717
<div
1818
className={classNames(
1919
"mdc-text-field-helper-text mdc-text-field-helper-text--persistent",

packages/cli/files/duplicates.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
[{"name":"downshift","versions":[{"version":"3.1.2","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]},{"version":"2.1.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]}]
1+
[{"name":"@babel/runtime","versions":[{"version":"7.26.7","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["dependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]}]},{"version":"7.26.0","files":[{"file":"/package.json","types":["resolutions"]}]}]},{"name":"downshift","versions":[{"version":"3.1.2","files":[{"file":"/packages/app-admin/package.json","types":["dependencies"]}]},{"version":"2.1.5","files":[{"file":"/packages/ui/package.json","types":["dependencies"]}]}]},{"name":"typescript","versions":[{"version":"5.3.3","files":[{"file":"/package.json","types":["devDependencies"]},{"file":"/packages/api/package.json","types":["devDependencies"]},{"file":"/packages/api-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-settings/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users/package.json","types":["devDependencies"]},{"file":"/packages/api-admin-users-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-apw/package.json","types":["devDependencies"]},{"file":"/packages/api-apw-scheduler-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/api-authentication/package.json","types":["devDependencies"]},{"file":"/packages/api-authentication-cognito/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-es/package.json","types":["devDependencies"]},{"file":"/packages/api-background-tasks-os/package.json","types":["devDependencies"]},{"file":"/packages/api-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/api-dynamodb-to-elasticsearch/package.json","types":["devDependencies"]},{"file":"/packages/api-elasticsearch/package.json","types":["devDependencies"]},{"file":"/packages/api-elasticsearch-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-file-manager-s3/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-form-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-bulk-actions/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-es-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-tasks/package.json","types":["devDependencies"]},{"file":"/packages/api-headless-cms-tasks-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-content/package.json","types":["devDependencies"]},{"file":"/packages/api-i18n-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-log/package.json","types":["devDependencies"]},{"file":"/packages/api-mailer/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-aco/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-import-export-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-page-builder-so-ddb-es/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-aws/package.json","types":["devDependencies"]},{"file":"/packages/api-prerendering-service-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/api-security/package.json","types":["devDependencies"]},{"file":"/packages/api-security-auth0/package.json","types":["devDependencies"]},{"file":"/packages/api-security-cognito/package.json","types":["devDependencies"]},{"file":"/packages/api-security-okta/package.json","types":["devDependencies"]},{"file":"/packages/api-security-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/api-tenancy-so-ddb/package.json","types":["devDependencies"]},{"file":"/packages/api-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/api-wcp/package.json","types":["devDependencies"]},{"file":"/packages/api-websockets/package.json","types":["devDependencies"]},{"file":"/packages/app/package.json","types":["devDependencies"]},{"file":"/packages/app-aco/package.json","types":["devDependencies"]},{"file":"/packages/app-admin/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-auth0/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-cognito/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-okta/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-rmwc/package.json","types":["devDependencies"]},{"file":"/packages/app-admin-users-cognito/package.json","types":["devDependencies"]},{"file":"/packages/app-apw/package.json","types":["devDependencies"]},{"file":"/packages/app-audit-logs/package.json","types":["devDependencies"]},{"file":"/packages/app-cognito-authenticator/package.json","types":["devDependencies"]},{"file":"/packages/app-dynamic-pages/package.json","types":["devDependencies"]},{"file":"/packages/app-file-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-file-manager-s3/package.json","types":["devDependencies"]},{"file":"/packages/app-form-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-graphql-playground/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-headless-cms-common/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n/package.json","types":["devDependencies"]},{"file":"/packages/app-i18n-content/package.json","types":["devDependencies"]},{"file":"/packages/app-mailer/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder/package.json","types":["devDependencies"]},{"file":"/packages/app-page-builder-elements/package.json","types":["devDependencies"]},{"file":"/packages/app-plugin-admin-welcome-screen/package.json","types":["devDependencies"]},{"file":"/packages/app-record-locking/package.json","types":["devDependencies"]},{"file":"/packages/app-security/package.json","types":["devDependencies"]},{"file":"/packages/app-security-access-management/package.json","types":["devDependencies"]},{"file":"/packages/app-serverless-cms/package.json","types":["devDependencies"]},{"file":"/packages/app-tenancy/package.json","types":["devDependencies"]},{"file":"/packages/app-tenant-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-theme/package.json","types":["devDependencies"]},{"file":"/packages/app-theme-manager/package.json","types":["devDependencies"]},{"file":"/packages/app-trash-bin/package.json","types":["devDependencies"]},{"file":"/packages/app-utils/package.json","types":["devDependencies"]},{"file":"/packages/app-wcp/package.json","types":["devDependencies"]},{"file":"/packages/app-website/package.json","types":["devDependencies"]},{"file":"/packages/app-websockets/package.json","types":["devDependencies"]},{"file":"/packages/aws-sdk/package.json","types":["devDependencies"]},{"file":"/packages/cli/package.json","types":["dependencies"]},{"file":"/packages/cli-plugin-dependencies/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-deploy-pulumi/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-admin-app-module/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-ci/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-extensions/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-graphql-service/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-react-component/template/package.json","types":["devDependencies"]},{"file":"/packages/cli-plugin-scaffold-workspaces/package.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-es/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb-os/dependencies.json","types":["devDependencies"]},{"file":"/packages/cwp-template-aws/template/ddb/dependencies.json","types":["devDependencies"]},{"file":"/packages/data-migration/package.json","types":["devDependencies"]},{"file":"/packages/db/package.json","types":["devDependencies"]},{"file":"/packages/db-dynamodb/package.json","types":["devDependencies"]},{"file":"/packages/di-container/package.json","types":["devDependencies"]},{"file":"/packages/error/package.json","types":["devDependencies"]},{"file":"/packages/feature-flags/package.json","types":["devDependencies"]},{"file":"/packages/form/package.json","types":["devDependencies"]},{"file":"/packages/handler/package.json","types":["devDependencies"]},{"file":"/packages/handler-aws/package.json","types":["devDependencies"]},{"file":"/packages/handler-client/package.json","types":["devDependencies"]},{"file":"/packages/handler-db/package.json","types":["devDependencies"]},{"file":"/packages/handler-graphql/package.json","types":["devDependencies"]},{"file":"/packages/i18n/package.json","types":["devDependencies"]},{"file":"/packages/i18n-react/package.json","types":["devDependencies"]},{"file":"/packages/ioc/package.json","types":["devDependencies"]},{"file":"/packages/logger/package.json","types":["devDependencies"]},{"file":"/packages/migrations/package.json","types":["devDependencies"]},{"file":"/packages/plugins/package.json","types":["devDependencies"]},{"file":"/packages/project-utils/package.json","types":["dependencies"]},{"file":"/packages/pubsub/package.json","types":["devDependencies"]},{"file":"/packages/pulumi/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-aws/package.json","types":["devDependencies"]},{"file":"/packages/pulumi-sdk/package.json","types":["devDependencies"]},{"file":"/packages/react-composition/package.json","types":["devDependencies"]},{"file":"/packages/react-rich-text-renderer/package.json","types":["devDependencies"]},{"file":"/packages/react-router/package.json","types":["devDependencies"]},{"file":"/packages/serverless-cms-aws/package.json","types":["devDependencies"]},{"file":"/packages/tasks/package.json","types":["devDependencies"]},{"file":"/packages/theme/package.json","types":["devDependencies"]},{"file":"/packages/ui/package.json","types":["devDependencies"]},{"file":"/packages/ui-composer/package.json","types":["devDependencies"]},{"file":"/packages/utils/package.json","types":["devDependencies"]},{"file":"/packages/validation/package.json","types":["devDependencies"]},{"file":"/packages/wcp/package.json","types":["devDependencies"]},{"file":"/cypress-tests/package.json","types":["devDependencies"]}]},{"version":"4.9.5","files":[{"file":"/packages/api-file-manager-aco/package.json","types":["devDependencies"]}]}]}]

packages/cli/files/references.json

+1-1
Large diffs are not rendered by default.

packages/project-utils/bundling/app/config/webpackDevServer.config.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ module.exports = function ({ host, port, https, allowedHost, proxy, paths }) {
5454
// Enable HTTPS if the HTTPS environment variable is set to 'true'
5555
...server,
5656
client: {
57-
overlay: true,
57+
overlay: false,
5858
// Silence WebpackDevServer's own logs since they're generally not useful.
5959
// It will still show compile warnings and errors with this setting.
6060
logging: "warn",

0 commit comments

Comments
 (0)