UNPKG

substance

Version:

Substance is a JavaScript library for web-based content editing. It provides building blocks for realizing custom text editors and web-based publishing systems.

146 lines (134 loc) 4.54 kB
import { module } from 'substance-test' import nestedContainers from './fixture/nestedContainers' import setupEditor from './fixture/setupEditor' const test = module('IsolatedNode') test("IsolatedNodes should be 'not-selected' when selection is null", function(t) { let { editorSession, editor } = setupEditor(t, nestedContainers) let isolatedNodes = editor.findAll('.sc-isolated-node') editorSession.setSelection(null) isolatedNodes.forEach(n => _notSelected(t, n)) t.end() }) test("IsolatedNodes should be 'not-selected' when selection is somewhere else", function(t) { let { editorSession, editor } = setupEditor(t, nestedContainers) let isolatedNodes = editor.findAll('.sc-isolated-node') editorSession.setSelection({ type: 'property', path: ['p1', 'content'], startOffset: 0, surfaceId: 'body' }) isolatedNodes.forEach(function(isolated){ t.ok(isolated.isNotSelected(), "isolated node '"+isolated.getId()+"' should not be selected.") }) t.end() }) test("IsolatedNode should be 'selected' with node selection", function(t) { let { editorSession, editor } = setupEditor(t, nestedContainers) let isolatedNodes = editor.findAll('.sc-isolated-node') editorSession.setSelection({ type: 'node', nodeId: 'c1', containerId: 'body', surfaceId: 'body' }) let expected = { 'body/c1': 'selected', 'body/c1/c2': undefined, } isolatedNodes.forEach(n => _modeOk(t, n, expected)) t.end() }) test("IsolatedNode should be 'co-selected' with spanning container selection", function(t) { let { editorSession, editor } = setupEditor(t, nestedContainers) let isolatedNodes = editor.findAll('.sc-isolated-node') editorSession.setSelection({ type: 'container', containerId: 'body', startPath: ['p1', 'content'], startOffset: 1, endPath: ['p2', 'content'], endOffset: 2, surfaceId: 'body' }) let expected = { 'body/c1': 'co-selected', // Note: 'co-selection' does not propagate down // it is a state related to the parent container 'body/c1/c2': undefined, } isolatedNodes.forEach(n => _modeOk(t, n, expected)) t.end() }) test("IsolatedNode should be 'focused' when having the selection", function(t) { let { editorSession, editor } = setupEditor(t, nestedContainers) let isolatedNodes = editor.findAll('.sc-isolated-node') editorSession.setSelection({ type: 'property', path: ['c1_p1', 'content'], startOffset: 0, surfaceId: 'body/c1' }) let expected = { 'body/c1': 'focused', 'body/c1/c2': undefined, } isolatedNodes.forEach(n => _modeOk(t, n, expected)) t.end() }) test("IsolatedNode should be 'co-focused' when child is having the selection", function(t) { let { editorSession, editor } = setupEditor(t, nestedContainers) let isolatedNodes = editor.findAll('.sc-isolated-node') editorSession.setSelection({ type: 'property', path: ['c2_p1', 'content'], startOffset: 0, surfaceId: 'body/c1/c2' }) let expected = { 'body/c1': 'co-focused', 'body/c1/c2': 'focused', } isolatedNodes.forEach(n => _modeOk(t, n, expected)) t.end() }) test("Issue #696: IsolatedNode should detect 'co-focused' robustly in presence of surface ids with same prefix", function(t) { // as experienced in #696 it happened that co-focused state was infered just // by using startsWith on the surface path. This was leading to wrong // co-focused states when e.g. two isolated nodes `body/entity` and `body/entity-1` // exist. I.e. one surfaceId was a prefix of another one. let { editorSession, editor } = setupEditor(t, _twoStructuredNodes) let isolatedNodes = editor.findAll('.sc-isolated-node') editorSession.setSelection({ type: 'property', path: ['sn2', 'title'], startOffset: 0, surfaceId: 'body/sn2/sn2.title' }) let expected = { 'body/sn': null, 'body/sn2': 'focused', } isolatedNodes.forEach(n => _modeOk(t, n, expected)) t.end() }) function _notSelected(t, isolated) { t.ok(isolated.isNotSelected(), "isolated node '"+isolated.getId()+"' should not be selected.") } function _modeOk(t, isolated, expected) { let id = isolated.getId() t.looseEqual(isolated.getMode(), expected[id], "mode of isolated node '" + id + "' should be correct") } function _twoStructuredNodes(doc) { let body = doc.get('body') body.show(doc.create({ type: 'structured-node', id: 'sn', title: 'Foo' })) body.show(doc.create({ type: 'structured-node', id: 'sn2', title: 'Bar' })) }