diff --git a/.changeset/quick-shrimps-sort.md b/.changeset/quick-shrimps-sort.md new file mode 100644 index 000000000..13cd02175 --- /dev/null +++ b/.changeset/quick-shrimps-sort.md @@ -0,0 +1,5 @@ +--- +'@lblod/ember-rdfa-editor': minor +--- + +Add option to configure editor as non-editable diff --git a/addon/components/editor.ts b/addon/components/editor.ts index 912d40a4d..fbc9b7cae 100644 --- a/addon/components/editor.ts +++ b/addon/components/editor.ts @@ -35,6 +35,7 @@ export interface RdfaEditorArgs { }; defaultAttrGenerators?: DefaultAttrGenPuginOptions; keyMapOptions?: KeymapOptions; + editable?: boolean; } /** @@ -70,6 +71,10 @@ export default class RdfaEditor extends Component { return this.args.baseIRI || window.document.baseURI; } + get editable() { + return this.args.editable; + } + /** * Handle init of rawEditor * @@ -111,6 +116,9 @@ export default class RdfaEditor extends Component { nodeViews: this.args.nodeViews, defaultAttrGenerators: this.args.defaultAttrGenerators, keyMapOptions: this.args.keyMapOptions, + editable: () => { + return !(this.editable === false); + }, }); window.__PM = this.prosemirror; window.__PC = new SayController(this.prosemirror); diff --git a/addon/components/ember-node/embedded-editor.ts b/addon/components/ember-node/embedded-editor.ts index 285dca97f..3750805f1 100644 --- a/addon/components/ember-node/embedded-editor.ts +++ b/addon/components/ember-node/embedded-editor.ts @@ -130,6 +130,9 @@ export default class EmbeddedEditor extends Component { this.contentWrapper, { decorations: () => this.args.contentDecorations, + editable: () => { + return this.outerView.editable; + }, state: EditorState.create({ doc: this.node, plugins: [keymap(this.keymap), ...this.plugins], diff --git a/addon/core/say-controller.ts b/addon/core/say-controller.ts index 761472fd1..d7e55a17a 100644 --- a/addon/core/say-controller.ts +++ b/addon/core/say-controller.ts @@ -63,6 +63,18 @@ export default class SayController { return this.mainEditorView.domParser; } + get editable() { + return this.mainEditorView.editable; + } + + setEditable(editable: boolean) { + this.mainEditorView.setProps({ + editable: () => { + return editable; + }, + }); + } + clone() { return new SayController(this.editor); } diff --git a/addon/core/say-editor.ts b/addon/core/say-editor.ts index c03717847..64242f1db 100644 --- a/addon/core/say-editor.ts +++ b/addon/core/say-editor.ts @@ -53,6 +53,7 @@ interface SayEditorArgs { controller: SayController, ) => Record; defaultAttrGenerators?: DefaultAttrGenPuginOptions; + editable?: SayView['props']['editable']; } export default class SayEditor { @@ -87,6 +88,7 @@ export default class SayEditor { }, defaultAttrGenerators = [], keyMapOptions, + editable, }: SayEditorArgs & { keyMapOptions?: KeymapOptions }) { this.logger = createLogger(this.constructor.name); this.owner = owner; @@ -148,6 +150,7 @@ export default class SayEditor { state, attributes: { class: 'say-editor__inner say-content' }, nodeViews: nodeViews(new SayController(this)), + editable, dispatchTransaction: (tr) => { const newState = this.mainView.state.apply(tr); this.mainView.updateState(newState); diff --git a/e2e/__screenshots__/list.spec.ts/ordered-list.png b/e2e/__screenshots__/list.spec.ts/ordered-list.png index c47e20d3e..dd21fd1ca 100644 Binary files a/e2e/__screenshots__/list.spec.ts/ordered-list.png and b/e2e/__screenshots__/list.spec.ts/ordered-list.png differ diff --git a/e2e/__screenshots__/list.spec.ts/unordered-list.png b/e2e/__screenshots__/list.spec.ts/unordered-list.png index 895100d73..96955a0b9 100644 Binary files a/e2e/__screenshots__/list.spec.ts/unordered-list.png and b/e2e/__screenshots__/list.spec.ts/unordered-list.png differ diff --git a/tests/dummy/app/controllers/index.ts b/tests/dummy/app/controllers/index.ts index ca1a386f2..f3e846b20 100644 --- a/tests/dummy/app/controllers/index.ts +++ b/tests/dummy/app/controllers/index.ts @@ -69,6 +69,7 @@ import { headingWithConfig } from '@lblod/ember-rdfa-editor/plugins/heading/node export default class IndexController extends Controller { @tracked rdfaEditor?: SayController; + @tracked editable = true; @service declare intl: IntlService; schema = new Schema({ nodes: { @@ -126,6 +127,10 @@ export default class IndexController extends Controller { }; } + toggleEditable = () => { + this.editable = !this.editable; + }; + @tracked plugins: PluginConfig = [ listTrackingPlugin(), firefoxCursorFix(), diff --git a/tests/dummy/app/templates/index.hbs b/tests/dummy/app/templates/index.hbs index 4f3c7945d..69c3928ab 100644 --- a/tests/dummy/app/templates/index.hbs +++ b/tests/dummy/app/templates/index.hbs @@ -2,6 +2,7 @@ <:header> + <:content> {{#if this.rdfaEditor}}