Progress for image node for TipTap: UI and dialog for image settings

pull/10/head
Jens Pelzetter 2021-10-02 18:15:45 +02:00
parent d72a740c15
commit 8da183514e
3 changed files with 164 additions and 21 deletions

View File

@ -657,10 +657,59 @@
</div> </div>
<template id="librecms-image-node-view"> <template id="librecms-image-node-view">
<figure> <figure>
<img src="#{request.contextPath}/assets/remixicon/image-line.svg" /> <!--img src="#{request.contextPath}/assets/remixicon/image-line.svg" />-->
<button class="select-image-button"> <img alt="#{CmsAdminMessages['cms_editor.image_node_view.image.none']}"
#{CmsAdminMessages['cms_editor.image_node_view.select_image.label']} src=""
</button> style="min-height: 4em;" />
<div class="border-light librecms-image-node-view-buttons">
<button class="btn btn-outline-dark select-image-button">
<librecms:remixSvgIcon icon="ri-image-edit-line" />
<span class="sr-only">#{CmsAdminMessages['cms_editor.image_node_view.select_image.label']}</span>
</button>
<button class="btn btn-outline-dark image-settings-button"
data-toggle="modal"
data-target="#librecms-image-node-view-settings-dialog-">
<librecms:remixSvgIcon icon="ri-settings-2-line" />
<span class="sr-only">#{CmsAdminMessages['cms_editor.image_node_view.select_image.label']}</span>
</button>
<div aria-hidden="true"
aria-labelledby="librecms-image-node-view-settings-dialog-title-"
class="modal fade image-settings-dialog"
id="librecms-image-node-view-settings-dialog-"
tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title"
id="librecms-image-node-view-settings-dialog-title-">
#{CmsAdminMessages['cms_editor.image_node_view.settings.dialog.title']}
</h3>
<button aria-label="#{CmsAdminMessages['cms_editor.image_node_view.settings.dialog.close']}"
class="close"
data-dismiss="modal"
type="button">
<bootstrap:svgIcon icon="x-circle" />
</button>
</div>
<div class="modal-body">
Image Node View Settings Dialog
</div>
<div class="modal-footer">
<button class="btn btn-warning"
data-dismiss="modal"
type="button">
#{CmsAdminMessages['cms_editor.image_node_view.settings.dialog.close']}
</button>
<button class="btn btn-primary"
data-dismiss="modal"
type="button">
#{CmsAdminMessages['cms_editor.image_node_view.settings.dialog.save']}
</button>
</div>
</div>
</div>
</div>
</div>
<figcaption aria-label="#{CmsAdminMessages['cms_editor.image_node_view.figcaption.label']}" <figcaption aria-label="#{CmsAdminMessages['cms_editor.image_node_view.figcaption.label']}"
contenteditable="true"> contenteditable="true">
#{CmsAdminMessages['cms_editor.image_node_view.figcaption.placeholder']} #{CmsAdminMessages['cms_editor.image_node_view.figcaption.placeholder']}

View File

@ -132,3 +132,21 @@ table.wor{
} }
} }
.cms-tiptap-editor-canvas {
max-height: 75vh;
overflow: scroll;
}
.librecms-image-node-view {
background-color: #ededed;
position: relative;
.librecms-image-node-view-buttons {
position: absolute;
top: 0;
right: 0;
width: 3em;
}
}

View File

@ -465,6 +465,31 @@ const ImageNode = Node.create({
defining: true, defining: true,
addAttributes() {
return {
altText: {
parseHTML: (element) => {
const imgElem = element.querySelector("img");
if (imgElem) {
return imgElem.alt;
} else {
return "";
}
},
},
figCaption: {
parseHTML: (element) => {
const figCaptionElem = element.querySelector("figcaption");
if (figCaptionElem) {
return figCaptionElem.innerHTML;
} else {
return "";
}
},
},
};
},
addCommands() { addCommands() {
return { return {
setLibreCmsImage: setLibreCmsImage:
@ -476,26 +501,77 @@ const ImageNode = Node.create({
}, },
addNodeView() { addNodeView() {
return ({ editor, node, getPos, HTMLAttributes, decorations, extension }) => { return ({
const templateNode = document.querySelector("#librecms-image-node-view"); editor,
if (!templateNode) { node,
const errorMsg = document.createElement("div"); getPos,
errorMsg.classList.add("alert"); HTMLAttributes,
errorMsg.classList.add("alert-danger"); decorations,
errorMsg.textContent = "Failed to create image node view."; extension,
}) => {
return errorMsg; const templateNode = document.querySelector("#librecms-image-node-view");
} if (!templateNode) {
const errorMsg = document.createElement("div");
errorMsg.classList.add("alert");
errorMsg.classList.add("alert-danger");
errorMsg.textContent = "Failed to create image node view.";
const template = templateNode as HTMLTemplateElement; return errorMsg;
const nodeView = template.content.cloneNode(true); }
const dom = document.createElement("div");
dom.appendChild(nodeView);
return { console.log("Node: ");
dom, console.dir(node);
console.log(`getPos =`);
console.dir(getPos);
console.log(`HTMLAttributes =`);
console.dir(HTMLAttributes);
console.log(`decorations = ${decorations}`);
console.dir(decorations);
console.log(`extension = ${extension}`);
console.dir(extension);
const template = templateNode as HTMLTemplateElement;
const nodeView = template.content.cloneNode(true) as HTMLElement;
const dialogId = `librecms-image-node-view-settings-dialog-${Math.floor(
Math.random() * 1000000000
)}`;
const dialogTitleId = `${dialogId}-title`;
const settingsButtonElem = nodeView.querySelector(
".image-settings-button"
);
if (settingsButtonElem) {
settingsButtonElem.setAttribute("data-target", `#${dialogId}`);
}
const settingsDialogElem = nodeView.querySelector(
".modal.image-settings-dialog"
);
if (settingsDialogElem) {
settingsDialogElem.id = dialogId;
settingsDialogElem.setAttribute("aria-labelledby", dialogTitleId);
const settingsDialogTitleElem =
settingsDialogElem.querySelector(".modal-title");
if (settingsDialogTitleElem) {
settingsDialogTitleElem.id = dialogTitleId;
} }
} }
const figCaptionElem = nodeView.querySelector("figcaption");
if (node.attrs.figCaption !== "" && figCaptionElem) {
figCaptionElem.innerHTML = node.attrs.figCaption;
}
const dom = document.createElement("div");
dom.classList.add("librecms-image-node-view", "p-2");
dom.appendChild(nodeView);
return {
dom,
};
};
}, },
parseHTML() { parseHTML() {
@ -510,7 +586,7 @@ const ImageNode = Node.create({
return [ return [
"figure", "figure",
mergeAttributes(HTMLAttributes, { "data-type": "librecms-image-node" }), mergeAttributes(HTMLAttributes, { "data-type": "librecms-image-node" }),
["img", {"src": "/assets/remixicon/image-line.svg"}], ["img", { src: "/assets/remixicon/image-line.svg" }],
["figcaption"], ["figcaption"],
]; ];
}, },