Browse Source

Create hooks before add and remove pages

pull/3411/head
Artur Arseniev 6 years ago
parent
commit
13dc3b9c4f
  1. 32
      src/pages/index.js
  2. 50
      test/specs/pages/index.js

32
src/pages/index.js

@ -20,6 +20,14 @@ export default () => {
Pages, Pages,
events: {
select: evPageSelect,
add: evPageAdd,
addBefore: evPageAddBefore,
remove: evPageRemove,
removeBefore: evPageRemoveBefore
},
/** /**
* Initialize module * Initialize module
* @param {Object} config Configurations * @param {Object} config Configurations
@ -30,6 +38,7 @@ export default () => {
const { em } = opts; const { em } = opts;
const cnf = { ...opts }; const cnf = { ...opts };
this.config = cnf; this.config = cnf;
this.em = em;
const defPages = cnf.pages || []; const defPages = cnf.pages || [];
const pages = new Pages(defPages, cnf); const pages = new Pages(defPages, cnf);
this.pages = pages; this.pages = pages;
@ -37,7 +46,6 @@ export default () => {
const mainPage = !pages.length const mainPage = !pages.length
? this.add({ type: typeMain }) ? this.add({ type: typeMain })
: this.getMain(); : this.getMain();
this.em = em;
this.model = model; this.model = model;
this.select(mainPage, { silent: 1, main: 1 }); this.select(mainPage, { silent: 1, main: 1 });
pages.on('add', (p, c, o) => em.trigger(evPageAdd, p, o)); pages.on('add', (p, c, o) => em.trigger(evPageAdd, p, o));
@ -70,11 +78,16 @@ export default () => {
* @returns {Page} * @returns {Page}
*/ */
add(props, opts = {}) { add(props, opts = {}) {
const { em } = this;
props.id = props.id || this._createId(); props.id = props.id || this._createId();
props.frames = props.frames || [{}]; props.frames = props.frames || [{}];
const page = this.pages.add(props, opts); const add = () => {
opts.select && this.select(page); const page = this.pages.add(props, opts);
return page; opts.select && this.select(page);
return page;
};
em.trigger(evPageAddBefore, props, add, opts);
return !opts.abort && add();
}, },
/** /**
@ -82,10 +95,15 @@ export default () => {
* @param {String|Page} page Page or page id * @param {String|Page} page Page or page id
* @returns {Page} * @returns {Page}
*/ */
remove(pg) { remove(pg, opts = {}) {
const { em } = this;
const page = isString(pg) ? this.get(pg) : pg; const page = isString(pg) ? this.get(pg) : pg;
page && this.pages.remove(page); const rm = () => {
return page; page && this.pages.remove(page, opts);
return page;
};
em.trigger(evPageRemoveBefore, page, rm, opts);
return !opts.abort && rm();
}, },
/** /**

50
test/specs/pages/index.js

@ -187,8 +187,56 @@ describe('Managing pages', () => {
domc = 0; domc = 0;
}); });
test('Able to abort page add', () => { test('Add page', () => {
const eventAdd = jest.fn();
em.on(pm.events.add, eventAdd);
pm.add({}); pm.add({});
expect(pm.getAll().length).toBe(2); expect(pm.getAll().length).toBe(2);
expect(eventAdd).toBeCalledTimes(1);
});
test('Abort add page', () => {
em.on(pm.events.addBefore, (p, c, opts) => {
opts.abort = 1;
});
pm.add({});
expect(pm.getAll().length).toBe(1);
});
test('Abort add page and complete', () => {
em.on(pm.events.addBefore, (p, complete, opts) => {
opts.abort = 1;
complete();
});
pm.add({});
expect(pm.getAll().length).toBe(2);
});
test('Remove page', () => {
const eventRm = jest.fn();
em.on(pm.events.remove, eventRm);
const page = pm.add({});
pm.remove(page.id);
expect(pm.getAll().length).toBe(1);
expect(eventRm).toBeCalledTimes(1);
});
test('Abort remove page', () => {
em.on(pm.events.removeBefore, (p, c, opts) => {
opts.abort = 1;
});
const page = pm.add({});
pm.remove(page.id);
expect(pm.getAll().length).toBe(2);
});
test('Abort remove page and complete', () => {
em.on(pm.events.removeBefore, (p, complete, opts) => {
opts.abort = 1;
complete();
});
const page = pm.add({});
pm.remove(page.id);
expect(pm.getAll().length).toBe(1);
}); });
}); });

Loading…
Cancel
Save