@stimulus-library/controllers
Version:
A library of useful controllers for Stimulus
122 lines (121 loc) • 5.32 kB
JavaScript
import { BaseController } from "@stimulus-library/utilities";
import { useTrixModifiers } from "@stimulus-library/mixins";
export class TrixModifierController extends BaseController {
get enabledBehaviours() {
const enabled = (datasetProp) => datasetProp !== undefined && datasetProp !== "false";
const behaviourIfEnabled = (datasetProp, trixInstallable) => enabled(datasetProp) ? [trixInstallable] : [];
return [
...(behaviourIfEnabled(this.el.dataset.noBold, this.bold)),
...(behaviourIfEnabled(this.el.dataset.noBulletList, this.bulletList)),
...(behaviourIfEnabled(this.el.dataset.noCode, this.code)),
...(behaviourIfEnabled(this.el.dataset.noHeading, this.heading)),
...(behaviourIfEnabled(this.el.dataset.noItalic, this.italic)),
...(behaviourIfEnabled(this.el.dataset.noStrikethrough, this.strikethrough)),
...(behaviourIfEnabled(this.el.dataset.noLink, this.link)),
...(behaviourIfEnabled(this.el.dataset.noIndents, this.indents)),
...(behaviourIfEnabled(this.el.dataset.noNumberList, this.numberList)),
...(behaviourIfEnabled(this.el.dataset.noQuote, this.quote)),
...(behaviourIfEnabled(this.el.dataset.noFileUploads, this.fileUploads)),
];
}
get bold() {
return this.formattingHandlers(".trix-button--icon-bold", "bold");
}
get bulletList() {
return this.formattingHandlers(".trix-button--icon-bullet-list", "bullet-list");
}
get code() {
return this.formattingHandlers(".trix-button--icon-code", "code");
}
get heading() {
return this.formattingHandlers(".trix-button--icon-heading-1", "heading");
}
get italic() {
return this.formattingHandlers(".trix-button--icon-italic", "italic");
}
get strikethrough() {
return this.formattingHandlers(".trix-button--icon-strike", "strike");
}
get link() {
return this.formattingHandlers(".trix-button--icon-link", "href");
}
get indents() {
return this.simpleHideShowHandlers([
".trix-button--icon-decrease-nesting-level, .trix-button--icon-increase-nesting-level",
".trix-button--icon-decrease-nesting-level, .trix-button--icon-increase-nesting-level",
].join(", "));
}
get numberList() {
return this.simpleHideShowHandlers(".trix-button--icon-number-list");
}
get quote() {
return this.simpleHideShowHandlers(".trix-button--icon-quote");
}
get fileUploads() {
const selector = ".trix-button-group.trix-button-group--file-tools";
const preventUploads = (e) => e === null || e === void 0 ? void 0 : e.preventDefault();
const self = this;
const element = this.el;
return {
install(elements) {
self.simpleHideShowHandlers(selector).install(elements);
self.el.addEventListener("trix-file-accept", preventUploads);
},
pasteEvent(event) {
const { dataTransfer, html } = event.paste;
const { editor } = element;
if (dataTransfer.files.length > 0 || html.includes("<img")) {
alert("The content you pasted contains images and/or files. File uploads are not supported.");
editor.undo();
}
},
uninstall(elements) {
self.simpleHideShowHandlers(selector).uninstall(elements);
self.el.removeEventListener("trix-file-accept", preventUploads);
},
};
}
connect() {
useTrixModifiers(this);
}
install(elements) {
this.enabledBehaviours.forEach(behaviour => behaviour.install(elements));
}
pasteEvent(event) {
this.enabledBehaviours.forEach(behaviour => behaviour.pasteEvent && behaviour.pasteEvent(event));
}
uninstall(elements) {
this.enabledBehaviours.forEach(behaviour => behaviour.uninstall(elements));
}
simpleHideShowHandlers(selector) {
return {
install: ({ toolbar }) => this.hideToolbarSelector(toolbar, selector),
uninstall: ({ toolbar }) => this.showToolbarSelector(toolbar, selector),
};
}
formattingHandlers(selector, trixAttribute) {
const element = this.el;
const { editor } = element;
return {
install: (elements) => {
this.simpleHideShowHandlers(selector).install(elements);
},
pasteEvent(pasteEvent) {
const { range } = pasteEvent.paste;
const prevRange = element.editor.getSelectedRange();
editor.setSelectedRange(range);
editor.deactivateAttribute(trixAttribute);
editor.setSelectedRange(prevRange);
},
uninstall: (elements) => {
this.simpleHideShowHandlers(selector).uninstall(elements);
},
};
}
showToolbarSelector(toolbar, selector) {
toolbar.querySelectorAll(selector).forEach(el => el.style.display = "");
}
hideToolbarSelector(toolbar, selector) {
toolbar.querySelectorAll(selector).forEach(el => el.style.display = "none");
}
}