|
|
@ -44,15 +44,15 @@ |
|
|
* @module Pages |
|
|
* @module Pages |
|
|
*/ |
|
|
*/ |
|
|
|
|
|
|
|
|
import { isString, bindAll, unique, flatten } from 'underscore'; |
|
|
import { isString, bindAll, unique, flatten } from "underscore"; |
|
|
import { createId } from '../utils/mixins'; |
|
|
import { createId } from "../utils/mixins"; |
|
|
import { Model, Module } from '../abstract'; |
|
|
import { Model, Module } from "../abstract"; |
|
|
import { ItemManagerModule } from '../abstract/Module'; |
|
|
import { ItemManagerModule, ModuleConfig } from "../abstract/Module"; |
|
|
import Pages from './model/Pages'; |
|
|
import Pages from "./model/Pages"; |
|
|
import Page from './model/Page'; |
|
|
import Page from "./model/Page"; |
|
|
import EditorModel from '../editor/model/Editor'; |
|
|
import EditorModel from "../editor/model/Editor"; |
|
|
|
|
|
|
|
|
export const evAll = 'page'; |
|
|
export const evAll = "page"; |
|
|
export const evPfx = `${evAll}:`; |
|
|
export const evPfx = `${evAll}:`; |
|
|
export const evPageSelect = `${evPfx}select`; |
|
|
export const evPageSelect = `${evPfx}select`; |
|
|
export const evPageSelectBefore = `${evPageSelect}:before`; |
|
|
export const evPageSelectBefore = `${evPageSelect}:before`; |
|
|
@ -61,8 +61,8 @@ export const evPageAdd = `${evPfx}add`; |
|
|
export const evPageAddBefore = `${evPageAdd}:before`; |
|
|
export const evPageAddBefore = `${evPageAdd}:before`; |
|
|
export const evPageRemove = `${evPfx}remove`; |
|
|
export const evPageRemove = `${evPfx}remove`; |
|
|
export const evPageRemoveBefore = `${evPageRemove}:before`; |
|
|
export const evPageRemoveBefore = `${evPageRemove}:before`; |
|
|
const chnSel = 'change:selected'; |
|
|
const chnSel = "change:selected"; |
|
|
const typeMain = 'main'; |
|
|
const typeMain = "main"; |
|
|
const events = { |
|
|
const events = { |
|
|
all: evAll, |
|
|
all: evAll, |
|
|
select: evPageSelect, |
|
|
select: evPageSelect, |
|
|
@ -73,37 +73,37 @@ const events = { |
|
|
remove: evPageRemove, |
|
|
remove: evPageRemove, |
|
|
removeBefore: evPageRemoveBefore, |
|
|
removeBefore: evPageRemoveBefore, |
|
|
}; |
|
|
}; |
|
|
export default class PageManager extends ItemManagerModule { |
|
|
|
|
|
name = 'PageManager'; |
|
|
|
|
|
|
|
|
|
|
|
storageKey = 'pages'; |
|
|
interface Config extends ModuleConfig { |
|
|
|
|
|
pages?: string[]; |
|
|
Page; |
|
|
} |
|
|
|
|
|
export default class PageManager extends ItemManagerModule<Config, Pages> { |
|
|
Pages; |
|
|
storageKey = "pages"; |
|
|
|
|
|
|
|
|
get pages() { |
|
|
get pages() { |
|
|
return this.all; |
|
|
return this.all; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
model: Model; |
|
|
/** |
|
|
/** |
|
|
* Initialize module |
|
|
* Initialize module |
|
|
* @param {Object} config Configurations |
|
|
* @param {Object} config Configurations |
|
|
* @private |
|
|
* @private |
|
|
*/ |
|
|
*/ |
|
|
constructor(em) { |
|
|
constructor(em: EditorModel) { |
|
|
const pages = new Pages([]); |
|
|
super(em, "PageManager", new Pages([]), events); |
|
|
super(em, 'PageManager', pages, events); |
|
|
bindAll(this, "_onPageChange"); |
|
|
bindAll(this, '_onPageChange'); |
|
|
this.getAll; |
|
|
const model = new Model({ _undo: true }); |
|
|
const model = new Model({ _undo: true } as any); |
|
|
this.model = model; |
|
|
this.model = model; |
|
|
pages.on('reset', coll => coll.at(0) && this.select(coll.at(0))); |
|
|
this.pages.on("reset", (coll) => coll.at(0) && this.select(coll.at(0))); |
|
|
pages.on('all', this.__onChange, this); |
|
|
this.pages.on("all", this.__onChange, this); |
|
|
model.on(chnSel, this._onPageChange); |
|
|
model.on(chnSel, this._onPageChange); |
|
|
|
|
|
|
|
|
return this; |
|
|
return this; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
__onChange(event, page, coll, opts) { |
|
|
__onChange(event: string, page: Page, coll: Pages, opts?: any) { |
|
|
const options = opts || coll; |
|
|
const options = opts || coll; |
|
|
this.em.trigger(evAll, { event, page, options }); |
|
|
this.em.trigger(evAll, { event, page, options }); |
|
|
} |
|
|
} |
|
|
@ -111,23 +111,30 @@ export default class PageManager extends ItemManagerModule { |
|
|
onLoad() { |
|
|
onLoad() { |
|
|
const { pages } = this; |
|
|
const { pages } = this; |
|
|
const opt = { silent: true }; |
|
|
const opt = { silent: true }; |
|
|
pages.add(this.config.pages?.map(page => new Page(page, { em: this.em, config: this.config })) || [], opt); |
|
|
pages.add( |
|
|
const mainPage = !pages.length ? this.add({ type: typeMain }, opt) : this.getMain(); |
|
|
this.config.pages?.map( |
|
|
this.select(mainPage, opt); |
|
|
(page) => new Page(page, { em: this.em, config: this.config }) |
|
|
|
|
|
) || [], |
|
|
|
|
|
opt |
|
|
|
|
|
); |
|
|
|
|
|
const mainPage = !pages.length |
|
|
|
|
|
? this.add({ type: typeMain }, opt) |
|
|
|
|
|
: this.getMain(); |
|
|
|
|
|
mainPage && this.select(mainPage, opt); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
_onPageChange(m, page, opts) { |
|
|
_onPageChange(m: any, page: Page, opts: any) { |
|
|
const { em } = this; |
|
|
const { em } = this; |
|
|
const lm = em.get('LayerManager'); |
|
|
const lm = em.get("LayerManager"); |
|
|
const mainComp = page.getMainComponent(); |
|
|
const mainComp = page.getMainComponent(); |
|
|
lm && mainComp && lm.setRoot(mainComp); |
|
|
lm && mainComp && lm.setRoot(mainComp); |
|
|
em.trigger(evPageSelect, page, m.previous('selected')); |
|
|
em.trigger(evPageSelect, page, m.previous("selected")); |
|
|
this.__onChange(chnSel, page, opts); |
|
|
this.__onChange(chnSel, page, opts); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
postLoad() { |
|
|
postLoad() { |
|
|
const { em, model } = this; |
|
|
const { em, model } = this; |
|
|
const um = em.get('UndoManager'); |
|
|
const um = em.get("UndoManager"); |
|
|
um && um.add(model); |
|
|
um && um.add(model); |
|
|
um && um.add(this.pages); |
|
|
um && um.add(this.pages); |
|
|
} |
|
|
} |
|
|
@ -144,11 +151,17 @@ export default class PageManager extends ItemManagerModule { |
|
|
* component: '<div class="my-class">My element</div>', // or a JSON of components
|
|
|
* component: '<div class="my-class">My element</div>', // or a JSON of components
|
|
|
* }); |
|
|
* }); |
|
|
*/ |
|
|
*/ |
|
|
add(props, opts = {}) { |
|
|
add( |
|
|
|
|
|
props: any, //{ id?: string; styles: string; component: string },
|
|
|
|
|
|
opts: any = {} |
|
|
|
|
|
) { |
|
|
const { em } = this; |
|
|
const { em } = this; |
|
|
props.id = props.id || this._createId(); |
|
|
props.id = props.id || this._createId(); |
|
|
const add = () => { |
|
|
const add = () => { |
|
|
const page = this.pages.add(new Page(props, { em: this.em, config: this.config }), opts); |
|
|
const page = this.pages.add( |
|
|
|
|
|
new Page(props, { em: this.em, config: this.config }), |
|
|
|
|
|
opts |
|
|
|
|
|
); |
|
|
opts.select && this.select(page); |
|
|
opts.select && this.select(page); |
|
|
return page; |
|
|
return page; |
|
|
}; |
|
|
}; |
|
|
@ -166,7 +179,7 @@ export default class PageManager extends ItemManagerModule { |
|
|
* const somePage = pageManager.get('page-id'); |
|
|
* const somePage = pageManager.get('page-id'); |
|
|
* pageManager.remove(somePage); |
|
|
* pageManager.remove(somePage); |
|
|
*/ |
|
|
*/ |
|
|
remove(page, opts = {}) { |
|
|
remove(page: string | Page, opts: any = {}) { |
|
|
const { em } = this; |
|
|
const { em } = this; |
|
|
const pg = isString(page) ? this.get(page) : page; |
|
|
const pg = isString(page) ? this.get(page) : page; |
|
|
const rm = () => { |
|
|
const rm = () => { |
|
|
@ -184,8 +197,8 @@ export default class PageManager extends ItemManagerModule { |
|
|
* @example |
|
|
* @example |
|
|
* const somePage = pageManager.get('page-id'); |
|
|
* const somePage = pageManager.get('page-id'); |
|
|
*/ |
|
|
*/ |
|
|
get(id) { |
|
|
get(id: string) { |
|
|
return this.pages.filter(p => p.get('id') === id)[0]; |
|
|
return this.pages.filter((p) => p.get(p.idAttribute) === id)[0]; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
@ -196,17 +209,7 @@ export default class PageManager extends ItemManagerModule { |
|
|
*/ |
|
|
*/ |
|
|
getMain() { |
|
|
getMain() { |
|
|
const { pages } = this; |
|
|
const { pages } = this; |
|
|
return pages.filter(p => p.get('type') === typeMain)[0] || pages.at(0); |
|
|
return pages.filter((p) => p.get("type") === typeMain)[0] || pages.at(0); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* Get all pages |
|
|
|
|
|
* @returns {Array<[Page]>} |
|
|
|
|
|
* @example |
|
|
|
|
|
* const arrayOfPages = pageManager.getAll(); |
|
|
|
|
|
*/ |
|
|
|
|
|
getAll() { |
|
|
|
|
|
return [...this.pages.models]; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
@ -219,14 +222,13 @@ export default class PageManager extends ItemManagerModule { |
|
|
*/ |
|
|
*/ |
|
|
getAllWrappers() { |
|
|
getAllWrappers() { |
|
|
const pages = this.getAll(); |
|
|
const pages = this.getAll(); |
|
|
return unique(flatten(pages.map(page => page.getAllFrames().map(frame => frame.getComponent())))); |
|
|
return unique( |
|
|
} |
|
|
flatten( |
|
|
|
|
|
pages.map((page) => |
|
|
getAllMap() { |
|
|
page.getAllFrames().map((frame) => frame.getComponent()) |
|
|
return this.getAll().reduce((acc, i) => { |
|
|
) |
|
|
acc[i.get('id')] = i; |
|
|
) |
|
|
return acc; |
|
|
); |
|
|
}, {}); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
@ -239,11 +241,11 @@ export default class PageManager extends ItemManagerModule { |
|
|
* const somePage = pageManager.get('page-id'); |
|
|
* const somePage = pageManager.get('page-id'); |
|
|
* pageManager.select(somePage); |
|
|
* pageManager.select(somePage); |
|
|
*/ |
|
|
*/ |
|
|
select(page, opts = {}) { |
|
|
select(page: string | Page, opts = {}) { |
|
|
const pg = isString(page) ? this.get(page) : page; |
|
|
const pg = isString(page) ? this.get(page) : page; |
|
|
if (pg) { |
|
|
if (pg) { |
|
|
this.em.trigger(evPageSelectBefore, pg, opts); |
|
|
this.em.trigger(evPageSelectBefore, pg, opts); |
|
|
this.model.set('selected', pg, opts); |
|
|
this.model.set("selected", pg, opts); |
|
|
} |
|
|
} |
|
|
return this; |
|
|
return this; |
|
|
} |
|
|
} |
|
|
@ -255,21 +257,22 @@ export default class PageManager extends ItemManagerModule { |
|
|
* const selectedPage = pageManager.getSelected(); |
|
|
* const selectedPage = pageManager.getSelected(); |
|
|
*/ |
|
|
*/ |
|
|
getSelected() { |
|
|
getSelected() { |
|
|
return this.model.get('selected'); |
|
|
return this.model.get("selected"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
destroy() { |
|
|
destroy() { |
|
|
this.pages.off().reset(); |
|
|
this.pages.off().reset(); |
|
|
this.model.stopListening(); |
|
|
this.model.stopListening(); |
|
|
this.model.clear({ silent: true }); |
|
|
this.model.clear({ silent: true }); |
|
|
['selected', 'model'].map(i => (this[i] = 0)); |
|
|
//@ts-ignore
|
|
|
|
|
|
["selected", "model"].map((i) => (this[i] = 0)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
store() { |
|
|
store() { |
|
|
return this.getProjectData(); |
|
|
return this.getProjectData(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
load(data) { |
|
|
load(data: any) { |
|
|
return this.loadProjectData(data, { all: this.pages, reset: true }); |
|
|
return this.loadProjectData(data, { all: this.pages, reset: true }); |
|
|
} |
|
|
} |
|
|
|
|
|
|