diff --git a/src/pages/index.js b/src/pages/index.js index 6717c1c9c..ee0a113f5 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -1,4 +1,5 @@ import { isString } from 'underscore'; +import { createId } from 'utils/mixins'; import Pages from './model/Pages'; import Page from './model/Page'; @@ -24,7 +25,8 @@ export default () => { const defPages = cnf.pages || []; const pages = new Pages(defPages); this.pages = pages; - !pages.length && this.add({ type: 'main' }); + const mainPage = !pages.length ? this.add({ type: 'main' }) : pages.at(0); + this.select(mainPage); 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; @@ -70,15 +72,23 @@ export default () => { return this.pages; }, + getAllMap() { + return this.getAll().reduce((acc, i) => { + acc[i.get('id')] = i; + return acc; + }, {}); + }, + /** * Select page * @param {String|Page} page Page or page id * @returns {this} */ select(pg) { + const { em } = this; const page = isString(pg) ? this.get(pg) : pg; this.selected = page; - this.em.trigger(`${evPfx}:select`, page); + em && em.trigger(`${evPfx}:select`, page); return this; }, @@ -98,9 +108,17 @@ export default () => { ['selected', 'config', 'em', 'pages'].map(i => (this[i] = 0)); }, - // TODO _createId() { - return Math.random(); + const pages = this.getAll(); + const len = pages.length + 16; + const pagesMap = this.getAllMap(); + let id; + + do { + id = createId(len); + } while (pagesMap[id]); + + return id; } }; }; diff --git a/src/utils/mixins.js b/src/utils/mixins.js index def931d31..0cbd12cf9 100644 --- a/src/utils/mixins.js +++ b/src/utils/mixins.js @@ -223,6 +223,17 @@ const setViewEl = (el, view) => { el.__gjsv = view; }; +const createId = (length = 16) => { + let result = ''; + const chars = + 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + const len = chars.length; + for (let i = 0; i < length; i++) { + result += chars.charAt(Math.floor(Math.random() * len)); + } + return result; +}; + export { on, off, @@ -248,5 +259,6 @@ export { isObject, isEmptyObj, isComponent, + createId, isRule };