Skip to content

Commit

Permalink
Add quote block files
Browse files Browse the repository at this point in the history
  • Loading branch information
jonaspiterek committed Dec 19, 2023
1 parent fec5198 commit 0028042
Show file tree
Hide file tree
Showing 6 changed files with 154 additions and 0 deletions.
25 changes: 25 additions & 0 deletions src/components/Data.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import React from "react";
import { BlockDataForm } from "@plone/volto/components";
import { QuoteBlockSchema } from "./schema";

const QuoteBlockData = (props) => {
const { data, block, onChangeBlock } = props;
const schema = QuoteBlockSchema(props);

return (
<BlockDataForm
schema={schema}
title={data.title}
onChangeField={(id, value) => {
onChangeBlock(block, {
...data,
[id]: value,
});
}}
formData={data}
block={block}
/>
);
};

export default QuoteBlockData;
24 changes: 24 additions & 0 deletions src/components/Edit.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import React from "react";
import View from "./View";
import { SidebarPortal } from "@plone/volto/components";
import QuoteBlockSidebar from "./Data";

const Edit = (props) => {
const { data, block, onChangeBlock, selected } = props;

return (
<div className="block quote">
<View {...props} isEditMode />
<SidebarPortal selected={selected}>
<QuoteBlockSidebar
{...props}
data={data}
block={block}
onChangeBlock={onChangeBlock}
/>
</SidebarPortal>
</div>
);
};

export default Edit;
36 changes: 36 additions & 0 deletions src/components/View.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
import React from "react";
import cx from "classnames";

const View = (props) => {
const { data } = props;
return (
<div className={cx("block quote")}>
<div className="inner-wrapper">
{data?.image?.[0] && (
<div className="quote-image-wrapper">
<img
src={`${flattenToAppURL(
data.image[0]["@id"]
)}/@@images/image/preview`}
alt=""
width="150"
height="150"
loading="lazy"
className="quote-image"
/>
</div>
)}
<figure className="quotation">
<blockquote className="quote-text">{data.text}</blockquote>
<figcaption className="author">
<span className="person">{data.person}</span>
{data.position && ", "}
{data.position}
</figcaption>
</figure>
</div>
</div>
);
};

export default View;
48 changes: 48 additions & 0 deletions src/components/schema.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { defineMessages } from "react-intl";

const messages = defineMessages({
quoteBlock: {
id: "Quote",
defineMessage: "Quote",
},
image: {
id: "Image",
defineMessage: "Image",
},
person: {
id: "Person",
defineMessage: "Person",
},
position: {
id: "Position",
defineMessage: "Position",
},
});

export const QuoteBlockSchema = (props) => {
return {
title: props.intl.formatMessage(messages.quoteBlock),
block: "quote",
fieldsets: [
{
id: "default",
title: "Default",
fields: ["image", "person", "position"],
},
],
properties: {
image: {
title: props.intl.formatMessage(messages.image),
widget: "object-browser",
mode: "image",
},
person: {
title: props.intl.formatMessage(messages.person),
},
position: {
title: props.intl.formatMessage(messages.position),
},
},
required: [],
};
};
21 changes: 21 additions & 0 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,25 @@
import QuoteBlockView from "./components/View";
import QuoteBlockEdit from "./components/Edit";
import { QuoteBlockSchema } from "./components/schema";

import quoteSVG from "@plone/volto/icons/quote.svg";

import "./theme/main.less";

const applyConfig = (config) => {
config.blocks.blocksConfig.quote = {
id: "quote",
title: "Quote",
group: "text",
icon: quoteSVG,
view: QuoteBlockView,
edit: QuoteBlockEdit,
blockSchema: QuoteBlockSchema,
restricted: false,
mostUsed: true,
sidebarTab: 1,
};

return config;
};

Expand Down
Empty file added src/theme/main.less
Empty file.

0 comments on commit 0028042

Please sign in to comment.