|
|
@ -1,28 +1,73 @@ |
|
|
import Editor from '../../../src/editor'; |
|
|
import Editor from '../../../src/editor'; |
|
|
import EditorModel from '../../../src/editor/model/Editor'; |
|
|
import EditorModel from '../../../src/editor/model/Editor'; |
|
|
import ComponentWrapper from '../../../src/dom_components/model/ComponentWrapper'; |
|
|
import ComponentWrapper from '../../../src/dom_components/model/ComponentWrapper'; |
|
|
|
|
|
import { setupTestEditor } from '../../common'; |
|
|
|
|
|
|
|
|
describe('Pages with same component ids across pages', () => { |
|
|
describe('Pages with same component ids across pages', () => { |
|
|
let editor: Editor; |
|
|
let editor: Editor; |
|
|
let em: EditorModel; |
|
|
let em: EditorModel; |
|
|
let pm: Editor['Pages']; |
|
|
let pm: Editor['Pages']; |
|
|
let domc: Editor['Components']; |
|
|
let domc: Editor['Components']; |
|
|
const getTitle = (wrapper: ComponentWrapper) => wrapper.components().at(0)!.components().at(0)!; |
|
|
const rootDefaultProps = { |
|
|
|
|
|
type: 'wrapper', |
|
|
|
|
|
head: { type: 'head' }, |
|
|
|
|
|
docEl: { tagName: 'html' }, |
|
|
|
|
|
stylable: [ |
|
|
|
|
|
'background', |
|
|
|
|
|
'background-color', |
|
|
|
|
|
'background-image', |
|
|
|
|
|
'background-repeat', |
|
|
|
|
|
'background-attachment', |
|
|
|
|
|
'background-position', |
|
|
|
|
|
'background-size', |
|
|
|
|
|
], |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
beforeAll(() => { |
|
|
const getTitle = (wrapper: ComponentWrapper) => wrapper.components().at(0); |
|
|
editor = new Editor({ |
|
|
|
|
|
pageManager: { |
|
|
const getRootComponent = ({ idBody = 'body', idTitle = 'main-title', contentTitle = 'A' } = {}) => ({ |
|
|
pages: [ |
|
|
|
|
|
{ |
|
|
|
|
|
id: 'p1', |
|
|
|
|
|
frames: [ |
|
|
|
|
|
{ |
|
|
|
|
|
component: { |
|
|
|
|
|
type: 'wrapper', |
|
|
type: 'wrapper', |
|
|
attributes: { id: 'body' }, |
|
|
attributes: { id: idBody }, |
|
|
components: [ |
|
|
components: [ |
|
|
{ |
|
|
{ |
|
|
tagName: 'section', |
|
|
tagName: 'h1', |
|
|
|
|
|
type: 'text', |
|
|
|
|
|
attributes: { id: idTitle }, |
|
|
|
|
|
components: [{ type: 'textnode', content: contentTitle }], |
|
|
|
|
|
}, |
|
|
|
|
|
], |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
beforeEach(() => { |
|
|
|
|
|
({ editor } = setupTestEditor()); |
|
|
|
|
|
em = editor.getModel(); |
|
|
|
|
|
pm = em.Pages; |
|
|
|
|
|
domc = em.Components; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
afterEach(() => { |
|
|
|
|
|
editor.destroy(); |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
test('Default behavior with pages having components with same ids are incremented', () => { |
|
|
|
|
|
editor.Pages.add({ |
|
|
|
|
|
id: 'page1', |
|
|
|
|
|
frames: [{ component: getRootComponent() }], |
|
|
|
|
|
}); |
|
|
|
|
|
editor.Pages.add({ |
|
|
|
|
|
id: 'page2', |
|
|
|
|
|
frames: [{ component: getRootComponent({ contentTitle: 'B' }) }], |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
const root1 = pm.get('page1')!.getMainComponent(); |
|
|
|
|
|
const root2 = pm.get('page2')!.getMainComponent(); |
|
|
|
|
|
|
|
|
|
|
|
expect(editor.getHtml({ component: root1 })).toBe('<body id="body"><h1 id="main-title">A</h1></body>'); |
|
|
|
|
|
expect(editor.getHtml({ component: root2 })).toBe('<body id="body-2"><h1 id="main-title-2">B</h1></body>'); |
|
|
|
|
|
|
|
|
|
|
|
expect(JSON.parse(JSON.stringify(root1))).toEqual({ |
|
|
|
|
|
...rootDefaultProps, |
|
|
|
|
|
attributes: { id: 'body' }, |
|
|
components: [ |
|
|
components: [ |
|
|
{ |
|
|
{ |
|
|
tagName: 'h1', |
|
|
tagName: 'h1', |
|
|
@ -31,81 +76,83 @@ describe('Pages with same component ids across pages', () => { |
|
|
components: [{ type: 'textnode', content: 'A' }], |
|
|
components: [{ type: 'textnode', content: 'A' }], |
|
|
}, |
|
|
}, |
|
|
], |
|
|
], |
|
|
}, |
|
|
}); |
|
|
], |
|
|
|
|
|
}, |
|
|
expect(JSON.parse(JSON.stringify(root2))).toEqual({ |
|
|
}, |
|
|
...rootDefaultProps, |
|
|
], |
|
|
attributes: { id: 'body-2' }, |
|
|
}, |
|
|
|
|
|
{ |
|
|
|
|
|
id: 'p2', |
|
|
|
|
|
frames: [ |
|
|
|
|
|
{ |
|
|
|
|
|
component: { |
|
|
|
|
|
type: 'wrapper', |
|
|
|
|
|
attributes: { id: 'body' }, |
|
|
|
|
|
components: [ |
|
|
|
|
|
{ |
|
|
|
|
|
tagName: 'section', |
|
|
|
|
|
components: [ |
|
|
components: [ |
|
|
{ |
|
|
{ |
|
|
tagName: 'h1', |
|
|
tagName: 'h1', |
|
|
type: 'text', |
|
|
type: 'text', |
|
|
attributes: { id: 'main-title' }, |
|
|
attributes: { id: 'main-title-2' }, |
|
|
components: [{ type: 'textnode', content: 'B' }], |
|
|
components: [{ type: 'textnode', content: 'B' }], |
|
|
}, |
|
|
}, |
|
|
], |
|
|
], |
|
|
}, |
|
|
|
|
|
], |
|
|
|
|
|
}, |
|
|
|
|
|
}, |
|
|
|
|
|
], |
|
|
|
|
|
}, |
|
|
|
|
|
], |
|
|
|
|
|
}, |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
em = editor.getModel(); |
|
|
|
|
|
pm = em.Pages; |
|
|
|
|
|
domc = em.Components; |
|
|
|
|
|
pm.onLoad(); |
|
|
|
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
afterAll(() => { |
|
|
|
|
|
editor.destroy(); |
|
|
|
|
|
}); |
|
|
}); |
|
|
|
|
|
|
|
|
test('Handles pages with components having the same id across pages', () => { |
|
|
test('Handles pages with components having the same id across pages', () => { |
|
|
const pages = pm.getAll(); |
|
|
editor.Components.config.keepAttributeIdsCrossPages = true; |
|
|
expect(pages.length).toBe(2); |
|
|
editor.Pages.add({ |
|
|
|
|
|
id: 'page1', |
|
|
const p1 = pages[0]; |
|
|
frames: [{ component: getRootComponent() }], |
|
|
const p2 = pages[1]; |
|
|
}); |
|
|
|
|
|
editor.Pages.add({ |
|
|
const w1 = p1.getMainComponent(); |
|
|
id: 'page2', |
|
|
const w2 = p2.getMainComponent(); |
|
|
frames: [{ component: getRootComponent({ contentTitle: 'B' }) }], |
|
|
|
|
|
}); |
|
|
|
|
|
const page1 = pm.get('page1')!; |
|
|
|
|
|
const page2 = pm.get('page2')!; |
|
|
|
|
|
const root1 = page1.getMainComponent(); |
|
|
|
|
|
const root2 = page2.getMainComponent(); |
|
|
|
|
|
|
|
|
expect(w1.getId()).toBe('body'); |
|
|
expect(root1.getId()).toBe('body'); |
|
|
expect(w2.getId()).toBe('body'); |
|
|
expect(root2.getId()).toBe('body'); |
|
|
|
|
|
|
|
|
const t1 = getTitle(w1); |
|
|
const title1 = getTitle(root1); |
|
|
const t2 = getTitle(w2); |
|
|
const title2 = getTitle(root2); |
|
|
|
|
|
|
|
|
// IDs should be preserved per page but stored uniquely in the shared map
|
|
|
// IDs should be preserved per page but stored uniquely in the shared map
|
|
|
expect(t1.getId()).toBe('main-title'); |
|
|
expect(title1.getId()).toBe('main-title'); |
|
|
expect(t2.getId()).toBe('main-title'); |
|
|
expect(title2.getId()).toBe('main-title'); |
|
|
|
|
|
|
|
|
const all = domc.allById(); |
|
|
const all = domc.allById(); |
|
|
|
|
|
|
|
|
expect(all['body']).toBe(w1); |
|
|
expect(all['body']).toBe(root1); |
|
|
expect(all['body-2']).toBe(w2); |
|
|
expect(all['body-2']).toBe(root2); |
|
|
expect(all['main-title']).toBe(t1); |
|
|
expect(all['main-title']).toBe(title1); |
|
|
expect(all['main-title-2']).toBe(t2); |
|
|
expect(all['main-title-2']).toBe(title2); |
|
|
|
|
|
|
|
|
|
|
|
expect(editor.getHtml({ component: root1 })).toBe('<body id="body"><h1 id="main-title">A</h1></body>'); |
|
|
|
|
|
expect(editor.getHtml({ component: root2 })).toBe('<body id="body"><h1 id="main-title">B</h1></body>'); |
|
|
|
|
|
|
|
|
const html1 = editor.getHtml({ component: w1 }); |
|
|
expect(JSON.parse(JSON.stringify(root1))).toEqual({ |
|
|
const html2 = editor.getHtml({ component: w2 }); |
|
|
...rootDefaultProps, |
|
|
|
|
|
attributes: { id: 'body' }, |
|
|
|
|
|
components: [ |
|
|
|
|
|
{ |
|
|
|
|
|
tagName: 'h1', |
|
|
|
|
|
type: 'text', |
|
|
|
|
|
attributes: { id: 'main-title' }, |
|
|
|
|
|
components: [{ type: 'textnode', content: 'A' }], |
|
|
|
|
|
}, |
|
|
|
|
|
], |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
expect(html1).toContain('A'); |
|
|
expect(JSON.parse(JSON.stringify(root2))).toEqual({ |
|
|
expect(html2).toContain('B'); |
|
|
...rootDefaultProps, |
|
|
|
|
|
id: 'body-2', |
|
|
|
|
|
attributes: { id: 'body' }, |
|
|
|
|
|
components: [ |
|
|
|
|
|
{ |
|
|
|
|
|
id: 'main-title-2', |
|
|
|
|
|
tagName: 'h1', |
|
|
|
|
|
type: 'text', |
|
|
|
|
|
attributes: { id: 'main-title' }, |
|
|
|
|
|
components: [{ type: 'textnode', content: 'B' }], |
|
|
|
|
|
}, |
|
|
|
|
|
], |
|
|
|
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
}); |
|
|
|