From 13dc3b9c4f17cae56a9c2f6bc9d7fa8d39ae7f00 Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Sun, 7 Mar 2021 23:17:44 +0100 Subject: [PATCH] Create hooks before add and remove pages --- src/pages/index.js | 32 +++++++++++++++++++------ test/specs/pages/index.js | 50 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/src/pages/index.js b/src/pages/index.js index e0a6774c8..5b91bf81a 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -20,6 +20,14 @@ export default () => { Pages, + events: { + select: evPageSelect, + add: evPageAdd, + addBefore: evPageAddBefore, + remove: evPageRemove, + removeBefore: evPageRemoveBefore + }, + /** * Initialize module * @param {Object} config Configurations @@ -30,6 +38,7 @@ export default () => { const { em } = opts; const cnf = { ...opts }; this.config = cnf; + this.em = em; const defPages = cnf.pages || []; const pages = new Pages(defPages, cnf); this.pages = pages; @@ -37,7 +46,6 @@ export default () => { const mainPage = !pages.length ? this.add({ type: typeMain }) : this.getMain(); - this.em = em; this.model = model; this.select(mainPage, { silent: 1, main: 1 }); pages.on('add', (p, c, o) => em.trigger(evPageAdd, p, o)); @@ -70,11 +78,16 @@ export default () => { * @returns {Page} */ add(props, opts = {}) { + const { em } = this; props.id = props.id || this._createId(); props.frames = props.frames || [{}]; - const page = this.pages.add(props, opts); - opts.select && this.select(page); - return page; + const add = () => { + const page = this.pages.add(props, opts); + 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 * @returns {Page} */ - remove(pg) { + remove(pg, opts = {}) { + const { em } = this; const page = isString(pg) ? this.get(pg) : pg; - page && this.pages.remove(page); - return page; + const rm = () => { + page && this.pages.remove(page, opts); + return page; + }; + em.trigger(evPageRemoveBefore, page, rm, opts); + return !opts.abort && rm(); }, /** diff --git a/test/specs/pages/index.js b/test/specs/pages/index.js index c16b8170b..9bb7a26cf 100644 --- a/test/specs/pages/index.js +++ b/test/specs/pages/index.js @@ -187,8 +187,56 @@ describe('Managing pages', () => { domc = 0; }); - test('Able to abort page add', () => { + test('Add page', () => { + const eventAdd = jest.fn(); + em.on(pm.events.add, eventAdd); pm.add({}); 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); }); });