[WIP] Placeholder media picker extension for Tiptap RTE

This commit is contained in:
leekelleher
2024-09-16 15:24:41 +01:00
parent 0b476a1e88
commit a42068607b
3 changed files with 80 additions and 1 deletions

View File

@@ -0,0 +1,10 @@
import type { ManifestTiptapExtension } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTiptapExtension> = [
{
type: 'tiptapExtension',
alias: 'Umb.Tiptap.MediaPicker',
name: 'Media Picker Tiptap Extension',
api: () => import('./tiptap-mediapicker.extension.js'),
},
];

View File

@@ -0,0 +1,68 @@
import { UmbTiptapExtensionBase } from '../components/input-tiptap/tiptap-extension.js';
import { mergeAttributes, Node } from '@umbraco-cms/backoffice/external/tiptap';
import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';
import type { Editor } from '@umbraco-cms/backoffice/external/tiptap';
import { UMB_MEDIA_PICKER_MODAL } from '@umbraco-cms/backoffice/media';
export default class UmbTiptapMediaPickerPlugin extends UmbTiptapExtensionBase {
getExtensions() {
return [
Node.create({
name: 'umbMediaPicker',
group: 'block',
marks: '',
draggable: true,
addNodeView() {
return () => {
//console.log('umb-media.addNodeView');
const dom = document.createElement('umb-debug');
dom.attributes.setNamedItem(document.createAttribute('visible'));
dom.attributes.setNamedItem(document.createAttribute('dialog'));
return { dom };
};
},
parseHTML() {
//console.log('umb-media.parseHTML');
return [{ tag: 'umb-media' }];
},
renderHTML({ HTMLAttributes }) {
//console.log('umb-media.renderHTML');
return ['umb-media', mergeAttributes(HTMLAttributes)];
},
}),
];
}
getToolbarButtons() {
return [
{
name: 'umb-media',
icon: 'icon-picture',
isActive: (editor?: Editor) => editor?.isActive('umbMediaPicker'),
command: async (editor?: Editor) => {
//console.log('umb-media.command', editor);
const selection = await this.#openMediaPicker();
if (!selection || !selection.length) return;
editor?.chain().focus().insertContent(`<umb-media>${selection}</umb-media>`).run();
},
},
];
}
async #openMediaPicker() {
const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT);
const modalHandler = modalManager?.open(this, UMB_MEDIA_PICKER_MODAL, {
data: { multiple: false },
value: { selection: [] },
});
if (!modalHandler) return;
const { selection } = await modalHandler.onSubmit().catch(() => ({ selection: undefined }));
//console.log('umb-media.selection', selection);
return selection;
}
}

View File

@@ -1,4 +1,5 @@
import { manifests as extensions } from './extensions/manifests.js';
import { manifests as propertyEditors } from './property-editors/manifests.js';
import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry';
export const manifests: Array<ManifestTypes> = [...propertyEditors];
export const manifests: Array<ManifestTypes> = [...extensions, ...propertyEditors];