src/elements/embed/EmbedSpec.tsx (60 lines of code) (raw):
import {
createCustomDropdownField,
createCustomField,
} from "../../plugin/fieldViews/CustomFieldView";
import { createFlatRichTextField } from "../../plugin/fieldViews/RichTextFieldView";
import { createTextField } from "../../plugin/fieldViews/TextFieldView";
import { undefinedDropdownValue } from "../../plugin/helpers/constants";
import {
htmlMaxLength,
maxLength,
required,
} from "../../plugin/helpers/validation";
import { parseHtml } from "../helpers/html";
import type { MainEmbedOptions } from "./EmbedForm";
export const getCalloutTag = (html: string) => {
const element = parseHtml(html);
if (element) {
const tagName = element.getAttribute("data-callout-tagname");
if (tagName) {
return tagName;
}
}
return undefined;
};
export const createEmbedFields = ({
createCaptionPlugins,
}: MainEmbedOptions) => ({
role: createCustomDropdownField(undefinedDropdownValue, [
{ text: "inline (default)", value: undefinedDropdownValue },
{ text: "supporting", value: "supporting" },
{ text: "showcase", value: "showcase" },
{ text: "thumbnail", value: "thumbnail" },
{ text: "immersive", value: "immersive" },
]),
url: createTextField({
placeholder: "Enter the source URL for this embed…",
}),
html: createTextField({
rows: 2,
isCode: true,
maxRows: 10,
isResizeable: true,
isMultiline: true,
validators: [required(undefined, "WARN")],
placeholder: "Paste in the embed code…",
}),
caption: createFlatRichTextField({
createPlugins: createCaptionPlugins,
marks: "em strong link strike",
validators: [htmlMaxLength(1000, undefined, "WARN")],
placeholder: "Enter a caption for this media…",
}),
alt: createTextField({
rows: 2,
isResizeable: true,
validators: [maxLength(1000), required()],
placeholder: "Enter some alt text…",
}),
isMandatory: createCustomField(true, true),
});