From 7da7a6b91cf7bb0cf1c6716ba3eec869953ff31a Mon Sep 17 00:00:00 2001 From: Artur Arseniev Date: Sat, 20 Feb 2021 00:29:54 +0100 Subject: [PATCH] Draft Pages module --- src/pages/index.js | 97 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/pages/index.js diff --git a/src/pages/index.js b/src/pages/index.js new file mode 100644 index 000000000..c663deab6 --- /dev/null +++ b/src/pages/index.js @@ -0,0 +1,97 @@ +import { isString } from 'underscore'; + +export default () => { + const evPfx = `page:`; + + return { + name: 'Pages', + + /** + * Initialize module + * @param {Object} config Configurations + * @private + */ + init(opts = {}) { + const { em } = opts; + this.config = { ...opts }; + const pages = []; + pages.on('add', (p, c, o) => em.trigger(`${evPfx}add`, p, o)); + pages.on('remove', (p, c, o) => em.trigger(`${evPfx}remove`, p, o)); + this.em = em; + this.pages = pages; + + return this; + }, + + /** + * Add new page + * @param {Object} props Page properties + * @param {Object} [options] Options + * @returns {Page} + */ + add(props, opts = {}) { + props.id = props.id || this._createId(); + return this.pages.add(props, opts); + }, + + /** + * Remove page + * @param {String|Page} page Page or page id + * @returns {Page} + */ + remove(pg) { + const page = isString(pg) ? this.get(pg) : pg; + page && this.pages.remove(page); + return page; + }, + + /** + * Get page by id + * @param {String} id Page id + * @returns {Page} + */ + get(id) { + return this.pages.filter(p => p.get('id') === id)[0]; + }, + + /** + * Get all pages + */ + getAll() { + return this.pages; + }, + + /** + * Select page + * @param {String|Page} page Page or page id + * @returns {this} + */ + select(pg) { + const page = isString(pg) ? this.get(pg) : pg; + this.selected = page; + this.em.trigger(`${evPfx}:select`, page); + return this; + }, + + /** + * Get the selected page + * @returns {Page} + */ + getSelected() { + return this.selected; + }, + + /** + * Destroy all + */ + destroy() { + this.pages.off().reset(); + ['selected', 'config', 'em', 'pages'].map(i => (this[i] = 0)); + }, + + // TODO + _createId() { + return Math.random(); + } + }; +};