Skip to content

Commit

Permalink
Merge pull request #136 from lblod/chore/cleanup
Browse files Browse the repository at this point in the history
various cleanup chores in the editor
nvdk authored Jul 30, 2021
2 parents 7ca2cfc + 3fef2c8 commit 25d9fba
Showing 17 changed files with 236 additions and 525 deletions.
Original file line number Diff line number Diff line change
@@ -11,5 +11,5 @@
{{on "beforeinput" this.beforeInput}}
{{on "input" this.handleInput}}
{{did-insert this.insertedEditorElement}}
contenteditable={{@editable}} class={{@class}} ...attributes>
contenteditable="true" class={{@class}} ...attributes>
</div>
Original file line number Diff line number Diff line change
@@ -1,26 +1,39 @@
import { layout as templateLayout } from "@ember-decorators/component";
import { tracked } from '@glimmer/tracking';
import { action } from "@ember/object";
import Component from '@ember/component';
import layout from '../../templates/components/ce/content-editable';
import forgivingAction from '../../utils/ce/forgiving-action';
import EnterHandler from '@lblod/ember-rdfa-editor/editor/input-handlers/enter-handler';
import IgnoreModifiersHandler from '../../utils/ce/handlers/ignore-modifiers-handler';
import { inject as service } from '@ember/service';
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import BackspaceHandler from '@lblod/ember-rdfa-editor/editor/input-handlers/backspace-handler';
import TextInputHandler from '@lblod/ember-rdfa-editor/editor/input-handlers/text-input-handler';
import TabHandler from '@lblod/ember-rdfa-editor/editor/input-handlers/tab-handler';
import DisableDeleteHandler from '@lblod/ember-rdfa-editor/utils/ce/handlers/delete-handler';
import FallbackInputHandler from '../../utils/ce/handlers/fallback-input-handler';
import BoldItalicUnderlineHandler from '@lblod/ember-rdfa-editor/editor/input-handlers/bold-italic-underline-handler';
import UndoHandler from '../../utils/ce/handlers/undo-hander';
import ArrowHandler from '../../utils/ce/handlers/arrow-handler';
import CutHandler from "@lblod/ember-rdfa-editor/editor/input-handlers/cut-handler";
import EnterHandler from '@lblod/ember-rdfa-editor/editor/input-handlers/enter-handler';
import EscapeHandler from '@lblod/ember-rdfa-editor/editor/input-handlers/escape-handler';
import LumpNodeMovementObserver from '../../utils/ce/movement-observers/lump-node-movement-observer';
import { inject as service } from '@ember/service';
import { A } from '@ember/array';
import LegacyRawEditor from "@lblod/ember-rdfa-editor/utils/ce/legacy-raw-editor";
import { HandlerResponse } from '@lblod/ember-rdfa-editor/editor/input-handlers/handler-response';
import { InputHandler } from '@lblod/ember-rdfa-editor/editor/input-handlers/input-handler';
import PasteHandler from "@lblod/ember-rdfa-editor/editor/input-handlers/paste-handler";
import CutHandler from "@lblod/ember-rdfa-editor/editor/input-handlers/cut-handler";
import TabHandler from '@lblod/ember-rdfa-editor/editor/input-handlers/tab-handler';
import TextInputHandler from '@lblod/ember-rdfa-editor/editor/input-handlers/text-input-handler';
import ArrowHandler from '@lblod/ember-rdfa-editor/utils/ce/handlers/arrow-handler';
import DisableDeleteHandler from '@lblod/ember-rdfa-editor/utils/ce/handlers/delete-handler';
import FallbackInputHandler from '@lblod/ember-rdfa-editor/utils/ce/handlers/fallback-input-handler';
import IgnoreModifiersHandler from '@lblod/ember-rdfa-editor/utils/ce/handlers/ignore-modifiers-handler';
import UndoHandler from '@lblod/ember-rdfa-editor/utils/ce/handlers/undo-hander';
import LumpNodeMovementObserver from '@lblod/ember-rdfa-editor/utils/ce/movement-observers/lump-node-movement-observer';
import PernetRawEditor from '@lblod/ember-rdfa-editor/utils/ce/pernet-raw-editor';
import RawEditor from '@lblod/ember-rdfa-editor/utils/ce/raw-editor';
import { IllegalAccessToRawEditor } from "@lblod/ember-rdfa-editor/utils/errors";
import { taskFor } from "ember-concurrency-ts";


interface FeatureService {
isEnabled(key: string): boolean

}
interface ContentEditableArgs {
externalHandlers: InputHandler[]
rawEditorInit(editor: RawEditor): void
}



/**
* content-editable is the core of {{#crossLinkModule "rdfa-editor"}}rdfa-editor{{/crossLinkModule}}.
@@ -40,23 +53,11 @@ import CutHandler from "@lblod/ember-rdfa-editor/editor/input-handlers/cut-handl
* @class ContentEditableComponent
* @extends Component
*/
@templateLayout(layout)
export default class ContentEditable extends Component {
tagName = ''
@service features;

pasteHandler = null;
cutHandler = null;

/**
* WIP: Rich selection
*
* @property richSelection
* @type Object
*
* @private
*/
richSelection;
export default class ContentEditable extends Component<ContentEditableArgs> {
@service() declare features : FeatureService;
pasteHandler: InputHandler;
cutHandler: InputHandler;
_rawEditor: PernetRawEditor;

/**
* element of the component, it is aliased to the rawEditor.rootNode
@@ -66,22 +67,27 @@ export default class ContentEditable extends Component {
*
* @private
*/
@tracked rootNode = null;
@tracked rootNode: HTMLElement | null = null;

/**
*
* @property rawEditor
* @type RawEditor
*/
@tracked rawEditor = null;
get rawEditor(): PernetRawEditor {
if (!this._rawEditor) {
throw new IllegalAccessToRawEditor();
}
return this._rawEditor;
}

/**
* ordered set of input handlers
* @property eventHandlers
* @type Array
* @public
*/
get inputHandlers() {
get inputHandlers(): InputHandler[] {
return this.externalHandlers.concat(this.defaultHandlers);
}

@@ -91,97 +97,60 @@ export default class ContentEditable extends Component {
* @type Array
* @private
*/
@tracked defaultHandlers = null;
@tracked defaultHandlers: InputHandler[];

/**
* external input handlers
* @property externalHandlers
* @type Array
* @private
*/
externalHandlers = null;
externalHandlers: InputHandler[];

/**
* @constructor
*/
init() {
super.init(...arguments);
const rawEditor = LegacyRawEditor.create({ });
constructor(owner: unknown, args: ContentEditableArgs) {
super(owner, args);
const rawEditor = PernetRawEditor.create({});
rawEditor.registerMovementObserver(new LumpNodeMovementObserver());
this.set('rawEditor', rawEditor);
const forceParagraph = this.features.isEnabled('editor-force-paragraph');
const defaultInputHandlers = [ new ArrowHandler({rawEditor}),
new EnterHandler({rawEditor}),
new BackspaceHandler({rawEditor}),
new TabHandler({rawEditor}),
new TextInputHandler({rawEditor, forceParagraph }),
new DisableDeleteHandler({rawEditor}),
new IgnoreModifiersHandler({rawEditor}),
new UndoHandler({rawEditor}),
new BoldItalicUnderlineHandler({rawEditor}),
new EscapeHandler({rawEditor}),
new FallbackInputHandler({rawEditor}),
];

this.set('currentTextContent', '');
this.set('defaultHandlers', defaultInputHandlers);
this.set('capturedEvents', A());

this.set('pasteHandler', new PasteHandler({rawEditor}));
this.set('cutHandler', new CutHandler({rawEditor}));

if(!this.externalHandlers) {
this.set('externalHandlers', []);
}
this._rawEditor = rawEditor;
this.defaultHandlers = [
new ArrowHandler({ rawEditor }),
new EnterHandler({ rawEditor }),
new BackspaceHandler({ rawEditor }),
new TabHandler({ rawEditor }),
new TextInputHandler({ rawEditor }),
new DisableDeleteHandler({ rawEditor }),
new IgnoreModifiersHandler({ rawEditor }),
new UndoHandler({ rawEditor }),
new BoldItalicUnderlineHandler({ rawEditor }),
new EscapeHandler({ rawEditor }),
new FallbackInputHandler({ rawEditor }),
];
this.externalHandlers = this.args.externalHandlers ? this.args.externalHandlers : [];
this.pasteHandler = new PasteHandler({rawEditor});
this.cutHandler = new CutHandler({rawEditor});
}

/**
* specify whether the editor should autofocus the contenteditable field
*
* @property focused
* @type boolean
* @default false
*
* @public
*/
focused = false;

/**
* specify whether the editor should be contenteditable
*
* @property editable
* @type boolean
* @default true
*
* @public
*/
editable = true;

/**
* didRender hook, makes sure the element is focused
* and calls the rootNodeUpdated action
*
* @method insertedEditorElement
*/
@action
insertedEditorElement(element) {
this.rawEditor.rootNode = element;
insertedEditorElement(element: HTMLElement) {
this.rawEditor.rootNode = element;
this.rawEditor.updateRichNode();
this.rawEditor.setCurrentPosition(0);
this.rawEditor.generateDiffEvents.perform();
forgivingAction('rawEditorInit', this)(this.rawEditor);
}

/**
* willDestroyElement, calls the rootNodeUpdated action
*
* @method willDestroyElement
*
*/
willDestroyElement() {
this.set('richNode', null);
this.set('rawEditor.rootNode', null);
forgivingAction('elementUpdate', this)();
// TODO: this is pretty unclear
// e.g. because of the debounce in generateDiffEvents rawEditorInit will be called before any diffs are calculated
// eslint-disable-next-line @typescript-eslint/unbound-method
void taskFor(this.rawEditor.generateDiffEvents).perform();
if (this.args.rawEditorInit) {
this.args.rawEditorInit(this.rawEditor);
}
}

/**
@@ -213,7 +182,7 @@ export default class ContentEditable extends Component {
* browser input.
*/
@action
handleKeyDown(event) {
handleKeyDown(event: KeyboardEvent) {
if (!this.keydownMapsToOtherEvent(event)) {
const preventDefault = this.passEventToHandlers(event);
if (preventDefault) {
@@ -227,7 +196,7 @@ export default class ContentEditable extends Component {
* browser input.
*/
@action
handleKeyUp(event) {
handleKeyUp(event: KeyboardEvent) {
const preventDefault = this.passEventToHandlers(event);
if (preventDefault) {
event.preventDefault();
@@ -239,19 +208,27 @@ export default class ContentEditable extends Component {
* this method is only called for input that hasn't been handled in earlier events (like keydown)
*/
@action
handleInput(event) {
handleInput(event: InputEvent) {
const preventDefault = this.passEventToHandlers(event);
if (preventDefault)
event.preventDefault();
}

@action
beforeInput(event: InputEvent) {
const preventDefault = this.passEventToHandlers(event);
if (preventDefault) {
event.preventDefault();
}
}

/**
* compositionEnd events are parsed for complex input, for uncaptured events we update
* the internal state to be inline with reality
*/
@action
compositionEnd(event) {
const preventDefault = this.passEventToHandlers( event );
compositionEnd(event: CompositionEvent) {
const preventDefault = this.passEventToHandlers(event);
if (preventDefault)
event.preventDefault();
}
@@ -260,27 +237,18 @@ export default class ContentEditable extends Component {
* paste events are parsed and handled as good as possible
*/
@action
paste(event) {
paste(event: ClipboardEvent) {
event.preventDefault();
this.pasteHandler.handleEvent(
event,
this.features.isEnabled("editor-html-paste"),
this.features.isEnabled("editor-extended-html-paste")
);
}

@action
beforeInput(event) {
const preventDefault = this.passEventToHandlers( event );
if (preventDefault) {
event.preventDefault();
}
}

@action
cut(event) {
cut(event: ClipboardEvent) {
event.preventDefault();
if (this.features.isEnabled("editor-cut")) {
event.preventDefault();
this.cutHandler.handleEvent(event);
}
}
@@ -289,40 +257,40 @@ export default class ContentEditable extends Component {
* copy is relegated to the browser for now
*/
@action
copy(/* event */) {
copy( /* event: ClipboardEvent */) {
//not handling just yet
}

@action
handleMouseUp(event) {
handleMouseUp(event: MouseEvent) {
const preventDefault = this.passEventToHandlers(event);
if (preventDefault)
event.preventDefault();
}

@action
handleMouseDown(/* event */){
handleMouseDown(/* event: MouseEvent */) {
// not handling just yet
}

@action
undo( /* event */) {
undo( /* event: InputEvent */) {
// TODO: shouldn't we cancel this event ?
this.rawEditor.undo();
}

/**
* passes an event to handlers and returns whether the event default should be prevented or not
* @method passEventToHandlers
* @param {DOMEvent} event
* @return {Boolean}
* @private
*/
passEventToHandlers(event) {
passEventToHandlers(event: Event): boolean {
const handlers = this.inputHandlers.filter(h => h.isHandlerFor(event));
if (handlers.length > 0) {
let preventDefault = false;
for (let handler of handlers) {
const handlerResponse = handler.handleEvent(event);
for (const handler of handlers) {
const handlerResponse: HandlerResponse = handler.handleEvent(event);
if (!handlerResponse.allowBrowserDefault) {
// if one handler decided the event default (e.g. browser bubbling) should be prevented we do so.
preventDefault = true;
@@ -332,7 +300,8 @@ export default class ContentEditable extends Component {
break;
}
}
this.rawEditor.generateDiffEvents.perform();
// eslint-disable-next-line @typescript-eslint/unbound-method
void taskFor(this.rawEditor.generateDiffEvents).perform();
this.rawEditor.model.read();
return preventDefault;
}
@@ -347,7 +316,7 @@ export default class ContentEditable extends Component {
* currently tries to catch copy, paste, cut and undo. definitly needs testing on mac
* @method keydownMapsToOtherEvent
*/
keydownMapsToOtherEvent(event) {
return (event.ctrlKey || event.metaKey) && ["v","c","x"].includes(event.key);
keydownMapsToOtherEvent(event: KeyboardEvent) : boolean {
return (event.ctrlKey || event.metaKey) && ["v", "c", "x"].includes(event.key);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
<div class="say-container {{if @editorOptions.showRdfaHover "say-container--sidebar-left" }}">
<div class="say-container {{if @editorOptions.showRdfaHover "say-container--sidebar-left" }}" {{did-update this.updateProfile @profile}}>
{{#if this.editor}}
<Rdfa::EditorToolbar
@editor={{this.editor}}
@@ -27,11 +27,7 @@
<Ce::ContentEditable
@class="say-editor__inner say-content"
@rawEditorInit={{this.handleRawEditorInit}}
@elementUpdate={{fn (or this.domUpdate this.noop) this.editor.rootNode}}
@externalHandlers={{this.handlers}}
@editable={{true}}
@focused={{true}}
/>
/>
</div>
</div>

Original file line number Diff line number Diff line change
@@ -1,18 +1,51 @@
import classic from "ember-classic-decorator";
import { debug, warn } from '@ember/debug';
import { action } from "@ember/object";
import { layout as templateLayout } from "@ember-decorators/component";
import { inject } from "@ember/service";
import { A } from '@ember/array';
import Component from '@ember/component';
import { inject as service } from "@ember/service";
import Component from '@glimmer/component';
import { tracked } from "@glimmer/tracking";
import { debug, warn } from '@ember/debug';
import layout from '../../templates/components/rdfa/rdfa-editor';
import HintsRegistry from '../../utils/rdfa/hints-registry';
import EventProcessor from '../../utils/rdfa/event-processor';
import forgivingAction from '../../utils/rdfa/forgiving-action';
import { analyse as analyseRdfa } from '@lblod/marawa/rdfa-context-scanner';
import { inject as service } from '@ember/service';
import EventProcessor from '../../utils/rdfa/event-processor';
import HintsRegistry from '../../utils/rdfa/hints-registry';
import RdfaDocument from '../../utils/rdfa/rdfa-document';
import type IntlService from 'ember-intl/services/intl';
import RdfaEditorDispatcher from 'dummy/services/rdfa-editor-dispatcher';
import RawEditor from '@lblod/ember-rdfa-editor/utils/ce/raw-editor';
import PernetRawEditor from '@lblod/ember-rdfa-editor/utils/ce/pernet-raw-editor';

interface DebugInfo {
hintsRegistry: HintsRegistry
editor: RawEditor
}

interface RdfaEditorArgs {
/**
* Function accepting a debug object containing the components used for debugging
* (e.g. hints registry, context scanner, editor)
* @property initDebug
* @type function
*
* @public
*/
initDebug(debugInfo: DebugInfo): void
/**
* Plugin profile of the RDFa editor
* @default 'default'
* @public
*/
profile?: string
/**
* callback that is called with an interface to the editor after editor init completed
* @default 'default'
* @public
*/
rdfaEditorInit(editor: RdfaDocument): void
}

interface SuggestedHint {
component: string
info: Record<string, unknown>
}

/**
* RDFa editor
*
@@ -32,65 +65,46 @@ import RdfaDocument from '../../utils/rdfa/rdfa-document';
* @class RdfaEditorComponent
* @extends Component
*/
@classic
@templateLayout(layout)
export default class RdfaEditor extends Component {

@service intl;
/**
* Plugin profile of the RDFa editor
*
* @property profile
* @type string
* @default 'default'
*
* @public
*/
export default class RdfaEditor extends Component<RdfaEditorArgs> {
@service declare intl: IntlService;
@tracked profile = 'default';

/**
* Function accepting a debug object containing the components used for debugging
* (e.g. hints registry, context scanner, editor)
* @property initDebug
* @type function
*
* @public
*/
initDebug = null;

/**
* @property rdfaEditorDispatcher
* @type RdfaEditorDispatcher
*
* @private
*/
@inject()
rdfaEditorDispatcher;
@service declare rdfaEditorDispatcher: RdfaEditorDispatcher;

/**
* @property eventProcessor
* @type EventProcessor
*
* @private
*/
@tracked eventProcessor = null;
@tracked eventProcessor?: EventProcessor;

/**
* @property hinstRegistry
* @property hintsRegistry
* @type HintsRegistry
*
* @private
*/
@tracked hintsRegistry = null;
@tracked hintsRegistry?: HintsRegistry;

@tracked suggestedHints : SuggestedHint[] = [];

/**
* @property hasHints
* @type boolean
*
* @private
*/
get hasHints() {
return this.hintsRegistry?.registry.length > 0;
get hasHints(): boolean {
return this.hintsRegistry?.registry
? this.hintsRegistry.registry.length > 0
: false;
}

/**
@@ -99,48 +113,36 @@ export default class RdfaEditor extends Component {
*
* @private
*/
get hasActiveHints() {
return this.hintsRegistry?.activeHints?.length > 0;
get hasActiveHints(): boolean {
return this.hintsRegistry?.activeHints
? this.hintsRegistry?.activeHints?.length > 0
: false;
}

/**
* @property hasSuggestedHints
*/
get hasSuggestedHints() {
get hasSuggestedHints(): boolean {
return this.suggestedHints.length > 0;
}

/**
* @property rootModelNode
*/
get rootModelNode() {
return this.editor.rootModelNode;
}
/**
* Contains extra handlers for input events on the editor.
*
* @property handlers
* @type Ember.A
*
* @private
*/
handlers = null;

/**
* editor controller
*
*/
@tracked editor;
@tracked editor?: PernetRawEditor;

init() {
super.init(...arguments);
const userLocale = ( navigator.language || navigator.languages[0] );
constructor(owner: unknown, args: RdfaEditorArgs) {
super(owner, args);
const userLocale = (navigator.language || navigator.languages[0]);
this.intl.setLocale([userLocale, 'nl-BE']);
this.set('handlers', A());
if (this.args.profile) {
this.profile = this.args.profile;
}
}

didUpdateAttrs() {
if (this.profile != this.eventProcessor.profile) {
@action
updateProfile() {
if (this.eventProcessor && this.profile !== this.eventProcessor.profile) {
this.eventProcessor.profile = this.profile;
}
}
@@ -175,8 +177,7 @@ export default class RdfaEditor extends Component {
* @private
*/
@action
handleRawEditorInit(editor) {

handleRawEditorInit(editor: PernetRawEditor) {
this.editor = editor;
this.hintsRegistry = new HintsRegistry(editor);
this.eventProcessor = new EventProcessor({
@@ -187,28 +188,29 @@ export default class RdfaEditor extends Component {
});
editor.registerContentObserver(this.eventProcessor);
editor.registerMovementObserver(this.eventProcessor);
this.hintsRegistry.addRegistryObserver( (registry) => {
this.eventProcessor.handleRegistryChange(registry);
this.hintsRegistry.addRegistryObserver( (_registry: HintsRegistry) => {
this.eventProcessor?.handleRegistryChange();
});

this.hintsRegistry.addNewCardObserver( (card) => {
this.eventProcessor.handleNewCardInRegistry(card);
this.hintsRegistry.addNewCardObserver( (location: [number,number]) => {
this.eventProcessor?.handleNewCardInRegistry(location);
});

this.hintsRegistry.addRemovedCardObserver( (card) => {
this.eventProcessor.handleRemovedCardInRegistry(card);
this.hintsRegistry.addRemovedCardObserver( (location: [number, number]) => {
this.eventProcessor?.handleRemovedCardInRegistry(location);
});

if (this.initDebug) {
if (this.args.initDebug) {
const debugInfo = {
hintsRegistry: this.hintsRegistry,
editor: this.eventProcessor.editor,
contextScanner: this.eventProcessor.scanner
};
this.initDebug(debugInfo);
this.args.initDebug(debugInfo);
}
const rdfaDocument = new RdfaDocument(editor);
forgivingAction('rdfaEditorInit', this)(rdfaDocument);
if (this.args.rdfaEditorInit) {
this.args.rdfaEditorInit(rdfaDocument);
}
}

/**
@@ -218,24 +220,30 @@ export default class RdfaEditor extends Component {
*/
@action
async triggerHints() {
if (!this.editor) {
return;
}

const rootNode = this.editor.rootNode;
const currentNode = this.editor.currentNode;
let region = [];

let region;
if (currentNode) {
const currentRichNode = this.editor.getRichNodeFor(currentNode);
region = currentRichNode.region;
region = currentRichNode?.region;
} else {
region = this.editor.currentSelection;
}
const contexts = analyseRdfa(rootNode, region);
if (contexts && contexts.length) {
const context = contexts[0];
const hints = await this.rdfaEditorDispatcher.requestHints(this.profile, context, this.editor);
this.set('suggestedHints', hints);
} else {
debug('No RDFa blocks found in currentNode. Cannot hint suggestions.');
if (region) {
const contexts = analyseRdfa(rootNode, region);
if (contexts && contexts.length) {
const context = contexts[0];
const hints = await this.rdfaEditorDispatcher.requestHints(this.profile, context, this.editor);
this.suggestedHints = hints;
} else {
debug('No RDFa blocks found in currentNode. Cannot hint suggestions.');
}
}

}

// Toggle RDFA blocks
@@ -244,8 +252,8 @@ export default class RdfaEditor extends Component {
@action
toggleRdfaBlocks() {
this.showRdfaBlocks = !this.showRdfaBlocks;

// Focus editor
document.getElementsByClassName("say-editor__inner")[0].focus();
if (this.editor?.model) {
this.editor.model.writeSelection();
}
}
}
5 changes: 3 additions & 2 deletions addon/editor/input-handlers/backspace-handler.ts
Original file line number Diff line number Diff line change
@@ -22,7 +22,7 @@ import {
RemoveVoidElementManipulation,
VoidElement
} from '@lblod/ember-rdfa-editor/editor/input-handlers/manipulation';
import {HandlerResponse, InputHandler, InputPlugin} from './input-handler';
import {InputHandler, InputPlugin} from './input-handler';
import {
editorDebug,
hasVisibleChildren,
@@ -33,6 +33,7 @@ import {
} from '@lblod/ember-rdfa-editor/editor/utils';
import RawEditor from "@lblod/ember-rdfa-editor/utils/ce/raw-editor";
import PernetRawEditor from "@lblod/ember-rdfa-editor/utils/ce/pernet-raw-editor";
import { HandlerResponse } from './handler-response';

/**
* Represents the coordinates of a DOMRect relative to RootNode of the editor.
@@ -348,7 +349,7 @@ export default class BackspaceHandler extends InputHandler {
* @return {HandlerResponse}
* @public
*/
handleEvent(event: Event): HandlerResponse {
handleEvent(event: KeyboardEvent): HandlerResponse {
// TODO: reason more about async behaviour of backspace.
event.preventDefault(); // make sure event propagation is stopped, async behaviour of backspace could cause the browser to execute eventDefault before it is finished

4 changes: 2 additions & 2 deletions addon/editor/input-handlers/delete-handler.ts
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@ import {
RemoveVoidElementManipulation,
VoidElement
} from '@lblod/ember-rdfa-editor/editor/input-handlers/manipulation';
import {HandlerResponse, InputHandler, InputPlugin} from './input-handler';
import {InputHandler, InputPlugin} from './input-handler';
import {
editorDebug,
hasVisibleChildren,
@@ -22,6 +22,7 @@ import {
} from '@lblod/ember-rdfa-editor/editor/utils';
import ListDeletePlugin from '@lblod/ember-rdfa-editor/utils/plugins/lists/delete-plugin';
import PernetRawEditor from "@lblod/ember-rdfa-editor/utils/ce/pernet-raw-editor";
import { HandlerResponse } from './handler-response';

/**
* We introduce an abstract reference point to check for visual changes.
@@ -396,7 +397,6 @@ export default class DeleteHandler extends InputHandler {
/**
* handle delete event
* @method handleEvent
* @return {HandlerResponse}
* @public
*/
handleEvent(event: Event): HandlerResponse {
2 changes: 1 addition & 1 deletion addon/editor/input-handlers/handler-response.ts
Original file line number Diff line number Diff line change
@@ -7,5 +7,5 @@ export interface HandlerResponse {
/**
* specify if the event can be handled by the browser
*/
allowBrowserDefault: boolean | undefined
allowBrowserDefault?: boolean
}
13 changes: 1 addition & 12 deletions addon/editor/input-handlers/input-handler.ts
Original file line number Diff line number Diff line change
@@ -5,18 +5,7 @@ import {
} from "@lblod/ember-rdfa-editor/editor/input-handlers/manipulation";
import {editorDebug} from "@lblod/ember-rdfa-editor/editor/utils";
import PernetRawEditor from "@lblod/ember-rdfa-editor/utils/ce/pernet-raw-editor";

export interface HandlerResponse {
/**
* specify if the event can also handled by another handler
* @property allowPropagation
* @type boolean
* @default true
* @public
*/
allowPropagation: boolean
}

import { HandlerResponse } from "./handler-response";
export interface InputPlugin {
/**
* One-liner explaining what the plugin solves.
8 changes: 0 additions & 8 deletions addon/editor/raw-editor.ts

This file was deleted.

253 changes: 0 additions & 253 deletions addon/utils/ce/legacy-raw-editor.ts

This file was deleted.

2 changes: 1 addition & 1 deletion addon/utils/ce/movement-observers/movement-observer.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {InternalSelection} from "@lblod/ember-rdfa-editor/editor/raw-editor";
import RawEditor from "@lblod/ember-rdfa-editor/utils/ce/raw-editor";
import { InternalSelection } from "../pernet-raw-editor";

export default interface MovementObserver {
handleMovement: (document: RawEditor, oldSelection?: InternalSelection, newSelection?: InternalSelection) => void;
12 changes: 9 additions & 3 deletions addon/utils/ce/pernet-raw-editor.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import Ember from "ember";
import {A} from '@ember/array';
import {TaskGenerator, timeout} from 'ember-concurrency';
import {task} from 'ember-concurrency-decorators';
import {TaskGenerator, task, timeout} from 'ember-concurrency';
import {diff_match_patch as DiffMatchPatch} from 'diff-match-patch';
import {taskFor} from "ember-concurrency-ts";
import {
@@ -27,7 +26,6 @@ import {
} from './editor';
import {findRichNode, findUniqueRichNodes} from '../rdfa/rdfa-rich-node-helpers';
import {debug, warn} from '@ember/debug';
import {InternalSelection, RawEditorSelection} from "@lblod/ember-rdfa-editor/editor/raw-editor";
import {computed, get} from '@ember/object';
import flatMap from "@lblod/ember-rdfa-editor/utils/ce/flat-map";
import {getTextContent, processDomNode as walkDomNodeAsText} from "@lblod/ember-rdfa-editor/utils/ce/text-node-walker";
@@ -42,13 +40,21 @@ import { tracked } from '@glimmer/tracking';
import { Editor } from "@lblod/ember-rdfa-editor/editor/input-handlers/manipulation";
import {ModelError} from "@lblod/ember-rdfa-editor/utils/errors";
import EventBus from "@lblod/ember-rdfa-editor/utils/event-bus";
import { Region } from "@lblod/marawa/rdfa-block";

export interface ContentObserver {
handleTextInsert: (position: number, text: string, extraInfo: Array<unknown>) => void
handleTextRemoval: (start: number, end: number, extraInfo: Array<unknown>) => void
handleFullContentUpdate: (extraInfo: Array<unknown>) => void
}

export type RawEditorSelection = Region;

export interface InternalSelection {
startNode: RichNode;
endNode: RichNode;
}

/**
* Compatibility layer for components still using the Pernet API
*/
6 changes: 6 additions & 0 deletions addon/utils/errors.ts
Original file line number Diff line number Diff line change
@@ -126,3 +126,9 @@ export class KeyError extends CustomError {
super(`Missing key ${String(key) || ""}`);
}
}

export class IllegalAccessToRawEditor extends CustomError {
constructor() {
super("raw editor was used before it was initialized");
}
}
3 changes: 1 addition & 2 deletions addon/utils/rdfa/event-processor.ts
Original file line number Diff line number Diff line change
@@ -4,9 +4,8 @@ import {isEmpty} from '@ember/utils';
import globalTextRegionToModelRange from '@lblod/ember-rdfa-editor/utils/global-text-region-to-model-range';
import RdfaEditorDispatcher from 'dummy/services/rdfa-editor-dispatcher';
import RawEditor from '../ce/raw-editor';
import {ContentObserver} from '../ce/pernet-raw-editor';
import { ContentObserver, InternalSelection} from '../ce/pernet-raw-editor';
import MovementObserver from '../ce/movement-observers/movement-observer';
import {InternalSelection} from '@lblod/ember-rdfa-editor/editor/raw-editor';


/**
3 changes: 1 addition & 2 deletions addon/utils/rdfa/hints-registry.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import { set } from '@ember/object';
import { A } from '@ember/array';
import { next } from '@ember/runloop';
import { timeout } from 'ember-concurrency';
import { task } from 'ember-concurrency-decorators';
import { task, timeout } from 'ember-concurrency';
import { reorderBlocks, getExtendedRegions } from './rdfa-block-helpers';
import { tracked } from '@glimmer/tracking';

3 changes: 1 addition & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -48,8 +48,7 @@
"ember-cli-babel": "^7.21.0",
"ember-cli-htmlbars": "^5.2.0",
"ember-cli-typescript": "^4.2.1",
"ember-concurrency": "^1.0.0",
"ember-concurrency-decorators": "^1.0.0",
"ember-concurrency": "^2.1.0",
"ember-concurrency-ts": "^0.2.0",
"ember-decorators": "^6.1.1",
"ember-feature-flags": "^6.0.0",
4 changes: 2 additions & 2 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"compilerOptions": {
"target": "es2019",
"target": "es2020",
"allowJs": true,
"moduleResolution": "node",
"allowSyntheticDefaultImports": true,
@@ -20,7 +20,7 @@
"baseUrl": ".",
"module": "es6",
"experimentalDecorators": true,
"lib": ["ES2017", "ES2019.Object", "DOM", "DOM.Iterable"],
"lib": ["ES2017", "ES2019.Object", "ES2020", "DOM", "DOM.Iterable"],
"paths": {
"dummy/tests/*": [
"tests/*"

0 comments on commit 25d9fba

Please sign in to comment.