FEATURE Introducing the component
This commit is contained in:
parent
5a7cfe63da
commit
a62f00f31e
54
plugins/carhop-blocks/src/document-card/block.json
Normal file
54
plugins/carhop-blocks/src/document-card/block.json
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
{
|
||||
"$schema": "https://schemas.wp.org/trunk/block.json",
|
||||
"apiVersion": 3,
|
||||
"name": "carhop-blocks/document-card",
|
||||
"version": "0.1.0",
|
||||
"title": "Document Card",
|
||||
"category": "carhop-blocks",
|
||||
"icon": "smiley",
|
||||
"description": "Document Card pour la mise en forme supérieure d'éléments de contenu",
|
||||
"example": {},
|
||||
"supports": {
|
||||
"html": false,
|
||||
"color": {
|
||||
"text": true,
|
||||
"background": false,
|
||||
"link": false
|
||||
}
|
||||
},
|
||||
"textdomain": "document-card",
|
||||
"editorScript": "file:./index.js",
|
||||
"editorStyle": "file:./index.css",
|
||||
"style": "file:./style-index.css",
|
||||
"viewScript": "file:./view.js",
|
||||
"attributes": {
|
||||
"isInitilized": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
},
|
||||
"documentType": {
|
||||
"type": "string",
|
||||
"default": "document",
|
||||
"enum": [
|
||||
"internal",
|
||||
"external"
|
||||
]
|
||||
},
|
||||
"documentFileSize": {
|
||||
"type": "number",
|
||||
"default": 0
|
||||
},
|
||||
"documentUrl": {
|
||||
"type": "string",
|
||||
"default": ""
|
||||
},
|
||||
"documentId": {
|
||||
"type": "number",
|
||||
"default": 0
|
||||
},
|
||||
"UserhasValidatedExternalUrl": {
|
||||
"type": "boolean",
|
||||
"default": false
|
||||
}
|
||||
}
|
||||
}
|
||||
342
plugins/carhop-blocks/src/document-card/edit.js
Normal file
342
plugins/carhop-blocks/src/document-card/edit.js
Normal file
|
|
@ -0,0 +1,342 @@
|
|||
import { __ } from "@wordpress/i18n";
|
||||
import {
|
||||
useBlockProps,
|
||||
InnerBlocks,
|
||||
InspectorControls,
|
||||
MediaUpload,
|
||||
MediaUploadCheck,
|
||||
BlockControls,
|
||||
MediaReplaceFlow,
|
||||
} from "@wordpress/block-editor";
|
||||
import { __experimentalHStack as HStack } from "@wordpress/components";
|
||||
|
||||
import {
|
||||
PanelBody,
|
||||
TextControl,
|
||||
Button,
|
||||
Placeholder,
|
||||
ToolbarButton,
|
||||
Icon,
|
||||
__experimentalToggleGroupControl as ToggleGroupControl,
|
||||
__experimentalToggleGroupControlOption as ToggleGroupControlOption,
|
||||
} from "@wordpress/components";
|
||||
import { file, link, external } from "@wordpress/icons";
|
||||
|
||||
import { MediaPlaceholder } from "@wordpress/block-editor";
|
||||
import "./editor.scss";
|
||||
|
||||
export default function Edit({ attributes, setAttributes }) {
|
||||
const {
|
||||
isInitilized,
|
||||
documentType,
|
||||
documentUrl,
|
||||
documentId,
|
||||
UserhasValidatedExternalUrl,
|
||||
documentFileSize,
|
||||
} = attributes;
|
||||
|
||||
const blockProps = useBlockProps({
|
||||
className: "document-card",
|
||||
});
|
||||
|
||||
const hasDocument =
|
||||
(documentType === "internal" && documentId && documentUrl) ||
|
||||
(documentType === "external" && documentUrl && UserhasValidatedExternalUrl);
|
||||
|
||||
const resetDocument = () => {
|
||||
setAttributes({
|
||||
documentId: 0,
|
||||
documentUrl: "",
|
||||
documentFileSize: 0,
|
||||
isInitilized: false,
|
||||
UserhasValidatedExternalUrl: false,
|
||||
});
|
||||
};
|
||||
|
||||
const setInternalDocument = (media) => {
|
||||
const fileSize = media.filesizeInBytes || 0;
|
||||
const fileSizeInKB = Math.round(fileSize / 1024);
|
||||
|
||||
setAttributes({
|
||||
documentType: "internal",
|
||||
documentFileSize: fileSizeInKB,
|
||||
documentId: media.id,
|
||||
documentUrl: media.url,
|
||||
isInitilized: true,
|
||||
});
|
||||
};
|
||||
|
||||
const setExternalDocument = (url) => {
|
||||
setAttributes({
|
||||
documentType: "external",
|
||||
documentFileSize: 0,
|
||||
documentId: 0,
|
||||
documentUrl: url,
|
||||
isInitilized: true,
|
||||
});
|
||||
};
|
||||
|
||||
return (
|
||||
<>
|
||||
<InspectorControls>
|
||||
<PanelBody title={__("Type de document", "carhop-blocks")}>
|
||||
<ToggleGroupControl
|
||||
label={__("Document relié", "carhop-blocks")}
|
||||
value={documentType}
|
||||
onChange={(value) => {
|
||||
setAttributes({ documentType: value, isInitilized: true });
|
||||
resetDocument();
|
||||
}}
|
||||
>
|
||||
<ToggleGroupControlOption
|
||||
label={__("PDF interne", "carhop-blocks")}
|
||||
value="internal"
|
||||
/>
|
||||
<ToggleGroupControlOption
|
||||
label={__("Lien externe", "carhop-blocks")}
|
||||
value="external"
|
||||
/>
|
||||
</ToggleGroupControl>
|
||||
{documentType === "external" && (
|
||||
<>
|
||||
<TextControl
|
||||
label={__("URL du document", "carhop-blocks")}
|
||||
value={documentUrl}
|
||||
onChange={(value) => setExternalDocument(value)}
|
||||
placeholder={__(
|
||||
"https://example.com/document.pdf",
|
||||
"carhop-blocks",
|
||||
)}
|
||||
/>
|
||||
</>
|
||||
)}
|
||||
|
||||
{documentType === "internal" && (
|
||||
<MediaUploadCheck>
|
||||
<MediaUpload
|
||||
onSelect={(media) => {
|
||||
setInternalDocument(media);
|
||||
}}
|
||||
allowedTypes={["application/pdf"]}
|
||||
value={documentId}
|
||||
render={({ open }) => (
|
||||
<>
|
||||
{documentUrl ? (
|
||||
<div className="document-card__media-preview">
|
||||
<span
|
||||
style={{
|
||||
width: 48,
|
||||
height: 48,
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
}}
|
||||
>
|
||||
<Icon icon={file} />
|
||||
</span>
|
||||
<span className="document-card__media-filename">
|
||||
{documentUrl.split("/").pop()?.split("?")[0] ||
|
||||
__("Document", "carhop-blocks")}
|
||||
</span>
|
||||
<div style={{ marginTop: 8 }}>
|
||||
<Button
|
||||
variant="secondary"
|
||||
onClick={open}
|
||||
style={{ marginRight: 8 }}
|
||||
>
|
||||
{__("Remplacer", "carhop-blocks")}
|
||||
</Button>
|
||||
<Button
|
||||
variant="tertiary"
|
||||
isDestructive
|
||||
onClick={() => resetDocument()}
|
||||
>
|
||||
{__("Supprimer", "carhop-blocks")}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
) : (
|
||||
<Button variant="secondary" onClick={open}>
|
||||
{__("Choisir un document", "carhop-blocks")}
|
||||
</Button>
|
||||
)}
|
||||
</>
|
||||
)}
|
||||
/>
|
||||
</MediaUploadCheck>
|
||||
)}
|
||||
</PanelBody>
|
||||
</InspectorControls>
|
||||
|
||||
<div {...blockProps}>
|
||||
{!isInitilized && (
|
||||
<Placeholder
|
||||
icon={file}
|
||||
label={__("Document Card", "carhop-blocks")}
|
||||
instructions={__(
|
||||
"Choisissez le type de document que vous souhaitez afficher.",
|
||||
"carhop-blocks",
|
||||
)}
|
||||
className="document-card__initialization"
|
||||
>
|
||||
<HStack spacing={3} alignment="stretch" expanded={false}>
|
||||
<Button
|
||||
variant="primary"
|
||||
icon={file}
|
||||
onClick={() =>
|
||||
setAttributes({
|
||||
isInitilized: true,
|
||||
documentType: "internal",
|
||||
})
|
||||
}
|
||||
>
|
||||
{__("PDF interne", "carhop-blocks")}
|
||||
</Button>
|
||||
<Button
|
||||
variant="secondary"
|
||||
icon={link}
|
||||
onClick={() =>
|
||||
setAttributes({
|
||||
isInitilized: true,
|
||||
documentType: "external",
|
||||
})
|
||||
}
|
||||
>
|
||||
{__("Lien externe", "carhop-blocks")}
|
||||
</Button>
|
||||
</HStack>
|
||||
</Placeholder>
|
||||
)}
|
||||
|
||||
{isInitilized &&
|
||||
documentType === "internal" &&
|
||||
!documentId &&
|
||||
!documentUrl && (
|
||||
<MediaPlaceholder
|
||||
icon="media-default"
|
||||
labels={{
|
||||
title: "Fichier",
|
||||
instructions:
|
||||
"Glissez-déposez, téléversez ou sélectionnez un fichier depuis votre médiathèque.",
|
||||
}}
|
||||
onSelect={(media) => setInternalDocument(media)}
|
||||
accept="application/pdf"
|
||||
allowedTypes={["application/pdf"]}
|
||||
multiple={false}
|
||||
/>
|
||||
)}
|
||||
|
||||
{isInitilized &&
|
||||
documentType === "external" &&
|
||||
!UserhasValidatedExternalUrl && (
|
||||
<Placeholder
|
||||
icon={link}
|
||||
label={__("Lien externe", "carhop-blocks")}
|
||||
instructions={__(
|
||||
"Entrez l'URL du document (PDF, etc.) ou utilisez le panneau de réglages à droite.",
|
||||
"carhop-blocks",
|
||||
)}
|
||||
className="document-card__url-placeholder"
|
||||
>
|
||||
<TextControl
|
||||
value={documentUrl}
|
||||
onChange={(value) => setExternalDocument(value)}
|
||||
placeholder="https://example.com/document.pdf"
|
||||
style={{ minWidth: 320 }}
|
||||
/>
|
||||
<Button
|
||||
variant="secondary"
|
||||
onClick={() =>
|
||||
setAttributes({ UserhasValidatedExternalUrl: true })
|
||||
}
|
||||
>
|
||||
{__("Valider le lien", "carhop-blocks")}
|
||||
</Button>
|
||||
</Placeholder>
|
||||
)}
|
||||
|
||||
{hasDocument && (
|
||||
<>
|
||||
<BlockControls group="other">
|
||||
{documentType === "internal" ? (
|
||||
<MediaReplaceFlow
|
||||
mediaId={documentId}
|
||||
mediaUrl={documentUrl}
|
||||
allowedTypes={["application/pdf"]}
|
||||
accept="application/pdf"
|
||||
onSelect={(media) => setInternalDocument(media)}
|
||||
name={__("Remplacer le document", "carhop-blocks")}
|
||||
/>
|
||||
) : null}
|
||||
<ToolbarButton onClick={() => resetDocument()}>
|
||||
{__("Supprimer le document", "carhop-blocks")}
|
||||
</ToolbarButton>
|
||||
</BlockControls>
|
||||
|
||||
<div className="document-card__preview">
|
||||
<div className="document-card__content">
|
||||
<InnerBlocks
|
||||
allowedBlocks={[
|
||||
"core/heading",
|
||||
"core/paragraph",
|
||||
"core/list",
|
||||
"core/button",
|
||||
"core/buttons",
|
||||
"core/image",
|
||||
"core/embed",
|
||||
"core/quote",
|
||||
"core/pullquote",
|
||||
"core/media-text",
|
||||
"core/table",
|
||||
"core/group",
|
||||
"core/columns",
|
||||
"core/post-title",
|
||||
"carhop-blocks/cta",
|
||||
"carhop-blocks/heading",
|
||||
"carhop-blocks/cta-group",
|
||||
"carhop-blocks/audio-player",
|
||||
"carhop-blocks/content-box",
|
||||
"carhop-blocks/notice-panel",
|
||||
"shortcode",
|
||||
]}
|
||||
template={[
|
||||
[
|
||||
"carhop-blocks/heading",
|
||||
{},
|
||||
[
|
||||
[
|
||||
"core/heading",
|
||||
{
|
||||
content: "Titre du document",
|
||||
placeholder: "Saisir le titre",
|
||||
},
|
||||
],
|
||||
[
|
||||
"core/paragraph",
|
||||
{
|
||||
content: "Sous-titre du document",
|
||||
placeholder: "Saisir le sous-titre",
|
||||
},
|
||||
],
|
||||
],
|
||||
],
|
||||
]}
|
||||
/>
|
||||
|
||||
<div className="file_info">
|
||||
<div className="file_info__type">
|
||||
{documentType === "internal" ? "PDF" : "Document externe"}
|
||||
</div>
|
||||
{documentFileSize > 0 && (
|
||||
<div className="file_info__size">
|
||||
( {documentFileSize} Ko )
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
0
plugins/carhop-blocks/src/document-card/editor.scss
Normal file
0
plugins/carhop-blocks/src/document-card/editor.scss
Normal file
31
plugins/carhop-blocks/src/document-card/index.js
Normal file
31
plugins/carhop-blocks/src/document-card/index.js
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
import { registerBlockType } from "@wordpress/blocks";
|
||||
import "./style.scss";
|
||||
|
||||
import Edit from "./edit";
|
||||
import save from "./save";
|
||||
import metadata from "./block.json";
|
||||
|
||||
registerBlockType(metadata.name, {
|
||||
icon: {
|
||||
src: (
|
||||
<svg
|
||||
viewBox="0 0 24 24"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
context="list-view"
|
||||
aria-hidden="true"
|
||||
focusable="false"
|
||||
>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
fill="#146E63"
|
||||
d="M12.848 8a1 1 0 0 1-.914-.594l-.723-1.63a.5.5 0 0 0-.447-.276H5a.5.5 0 0 0-.5.5v11.5a.5.5 0 0 0 .5.5h14a.5.5 0 0 0 .5-.5v-9A.5.5 0 0 0 19 8h-6.152Zm.612-1.5a.5.5 0 0 1-.462-.31l-.445-1.084A2 2 0 0 0 10.763 4H5a2 2 0 0 0-2 2v11.5a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-9a2 2 0 0 0-2-2h-5.54Z"
|
||||
></path>
|
||||
</svg>
|
||||
),
|
||||
},
|
||||
edit: Edit,
|
||||
save,
|
||||
});
|
||||
39
plugins/carhop-blocks/src/document-card/save.js
Normal file
39
plugins/carhop-blocks/src/document-card/save.js
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
import { useBlockProps } from "@wordpress/block-editor";
|
||||
import { InnerBlocks } from "@wordpress/block-editor";
|
||||
|
||||
export default function save({ attributes }) {
|
||||
const { documentUrl, documentType, documentFileSize } = attributes;
|
||||
const blockProps = useBlockProps.save({
|
||||
className: "document-card",
|
||||
});
|
||||
|
||||
if (!documentUrl) {
|
||||
return (
|
||||
<div {...blockProps}>
|
||||
<InnerBlocks.Content />
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<a
|
||||
{...blockProps}
|
||||
href={documentUrl}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className={`${blockProps.className || ""} document-card--${documentType}`}
|
||||
>
|
||||
<div className="document-card__content">
|
||||
<InnerBlocks.Content />
|
||||
<div className="file_info">
|
||||
<div className="file_info__type">
|
||||
{documentType === "internal" ? "PDF" : "Document externe"}
|
||||
</div>
|
||||
{documentFileSize > 0 && (
|
||||
<div className="file_info__size">( {documentFileSize} KB )</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
);
|
||||
}
|
||||
0
plugins/carhop-blocks/src/document-card/style.scss
Normal file
0
plugins/carhop-blocks/src/document-card/style.scss
Normal file
Loading…
Reference in New Issue
Block a user