Skip to content

Instantly share code, notes, and snippets.

@awcodes
Created March 29, 2023 14:24
Show Gist options
  • Save awcodes/fb0425c4a2afd0fc8c3318784d9a53fb to your computer and use it in GitHub Desktop.
Save awcodes/fb0425c4a2afd0fc8c3318784d9a53fb to your computer and use it in GitHub Desktop.
Custom Tiptap Editor Extensions
<?php
// Config file
...
'extensions' => [
[
'id' => 'hurdle',
'name' => 'Hurdle',
'view' => 'tools.hurdle',
'source' => 'resources/js/tools/hurdle.js',
'builder' => 'vite',
]
],
...
@php
$colors = [
'gray_light' => 'Gray - Light',
'gray' => 'Gray',
'gray_dark' => 'Gray - Dark',
'primary' => 'Primary',
'secondary' => 'Secondary',
'tertiary' => 'Tertiary',
'accent' => 'Accent',
];
@endphp
<x-filament-tiptap-editor::dropdown-button
label="Hurdle"
active="'hurdle'"
icon="hurdle"
>
@foreach($colors as $key => $label)
<x-filament-tiptap-editor::dropdown-button-item
action="editor().chain().focus().setHurdle({ color: '{{ $key }}' }).run()"
>
{{ $label }}
</x-filament-tiptap-editor::dropdown-button-item>
@endforeach
</x-filament-tiptap-editor::dropdown-button>
import { Node, mergeAttributes } from "@tiptap/core";
const Hurdle = Node.create({
name: "hurdle",
group: "block",
content: "block+",
addOptions() {
return {
colors: [
"gray_light",
"gray",
"gray_dark",
"primary",
"secondary",
"tertiary",
"accent",
],
HTMLAttributes: {
class: "filament-tiptap-hurdle",
},
};
},
addAttributes() {
return {
color: {
default: "gray",
parseHTML: (element) => element.getAttribute("data-color"),
renderHTML: (attributes) => {
return {
"data-color": attributes.color,
};
},
},
};
},
parseHTML() {
return [
{
tag: "div",
getAttrs: (element) =>
element.classList.contains("filament-tiptap-hurdle"),
},
];
},
renderHTML({ node, HTMLAttributes }) {
return [
"div",
mergeAttributes(this.options.HTMLAttributes, HTMLAttributes),
0,
];
},
addCommands() {
return {
setHurdle:
(attributes) =>
({ commands }) => {
if (!this.options.colors.includes(attributes.color)) {
return false;
}
return commands.toggleWrap(this.name, attributes);
},
};
},
});
document.addEventListener("tiptapeditor:init", () => {
window.registerTiptapEditorExtension('hurdle', Hurdle)
});
@Meraik
Copy link

Meraik commented Sep 7, 2023

I get the following error when trying this example:
Unable to locate a class or view for component [tools.hurdle].

I have my files in the following locations:
config/filament-tiptap-editor.php
resources/js/tools/hurdle.js
resources/views/tools/hurdle.blade.php

Running:
livewire v2.12.6
filament v2.17.53
laravel v10.22.0

@Meraik
Copy link

Meraik commented Sep 7, 2023

Solved it.
the hurdle.blade.php needs to be inside
resources/views/Components/tools/

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment