UNPKG

covid19-dashboard

Version:

Dashboard App displaying COVID-19 numbers by country

624 lines (543 loc) 18.5 kB
import Base from '../../../../node_modules/neo.mjs/src/list/Base.mjs'; import Collection from '../../../../node_modules/neo.mjs/src/collection/Base.mjs'; /** * @class Docs.view.classdetails.MembersList * @extends Neo.list.Base */ class MembersList extends Base { static getConfig() {return { /** * @member {String} className='Docs.view.classdetails.MembersList' * @protected */ className: 'Docs.view.classdetails.MembersList', /** * @member {String} ntype='classdetails-memberslist' * @protected */ ntype: 'classdetails-memberslist', /** * @member {String[]} cls=['docs-classhierarchy-memberslist'] */ cls: ['docs-classhierarchy-memberslist'], /** * @member {String} filterMembersQuery_='' * @protected */ filterMembersQuery_: '', /** * @member {Boolean} showPrivateMembers_=true */ showPrivateMembers_: true, /** * @member {Boolean} showProtectedMembers_=true */ showProtectedMembers_: true, /** * @member {Boolean} showStaticMembers_=true */ showStaticMembers_: true, /** * @member {Neo.collection.Base} store=null */ store: null, /** * @member {String|null} targetClassName=null */ targetClassName: null, /** * @member {Object} _vdom={cn: []} */ _vdom: { cn: [] } }} /** * */ onConstructed() { super.onConstructed(); let me = this, hierarchyView = me.up('classdetails-maincontainer').down('classhierarchy-treelist'), mainStore = me.up('main-container').store; hierarchyView.on({ refreshClassMembers: me.onRefreshClassMembers, scope : me }); me.store = Neo.create(Collection, { filterMode: 'advanced', sourceId : mainStore.id }); me.onRefreshClassMembers(); } /** * Triggered after the filterMembersQuery config got changed * @param {String} value * @param {String} oldValue * @protected */ afterSetFilterMembersQuery(value, oldValue) { if (oldValue !== undefined) { this.onRefreshClassMembers(); } } /** * Triggered after the showProtectedMembers config got changed * @param {Boolean} value * @param {Boolean} oldValue * @protected */ afterSetShowProtectedMembers(value, oldValue) { if (oldValue !== undefined) { this.onRefreshClassMembers(); } } /** * Triggered after the showPrivateMembers config got changed * @param {Boolean} value * @param {Boolean} oldValue * @protected */ afterSetShowPrivateMembers(value, oldValue) { if (oldValue !== undefined) { this.onRefreshClassMembers(); } } /** * Triggered after the showStaticMembers config got changed * @param {Boolean} value * @param {Boolean} oldValue * @protected */ afterSetShowStaticMembers(value, oldValue) { if (oldValue !== undefined) { this.onRefreshClassMembers(); } } /** * * @param {Neo.collection.Base} store * @param {Object} vdom * @returns {Object} vdom */ applyConfigsHeader(store, vdom) { if (store.items[0] && store.items[0].kind === 'member') { vdom.cn.push({ // scrolling placeholder }, { cls : ['neo-docs-memberlist-group-header'], innerHTML: 'Configs', 'data-list-header': 'Configs' }); } return vdom; } /** * * @param {Object} item * @param {Number} index * @param {Neo.collection.Base} store * @param {Object} vdom * @returns {Object} vdom */ applyEventsHeader(item, index, store, vdom) { if ( item.kind === 'event' && store.items[index -1] && store.items[index -1].kind !== 'event' ) { vdom.cn.push({ // scrolling placeholder }, { cls : ['neo-docs-memberlist-group-header'], innerHTML: 'Events', style : {zIndex: 3}, 'data-list-header': 'Events' }); } return vdom; } /** * * @param {Object} item * @param {Number} index * @param {Neo.collection.Base} store * @param {Object} vdom * @returns {Object} vdom */ applyMethodsHeader(item, index, store, vdom) { if ( item.kind === 'function' && ( !store.items[index -1] || ( store.items[index -1] && store.items[index -1].kind !== 'function' ) ) ) { vdom.cn.push({ // scrolling placeholder }, { cls : ['neo-docs-memberlist-group-header'], innerHTML: 'Methods', style : {zIndex: 2}, 'data-list-header': 'Methods' }); } return vdom; } /** * */ createItems() { let me = this, filterMembersRegEx = new RegExp(me.filterMembersQuery || '', 'gi'), hasExamples = false, targetClassName = me.targetClassName, vdom = me.vdom, headerText, itemAttributes, itemConfig, path; vdom.cn = []; vdom = me.applyConfigsHeader(me.store, vdom); me.store.items.forEach((item, index) => { vdom = me.applyEventsHeader( item, index, me.store, vdom); vdom = me.applyMethodsHeader(item, index, me.store, vdom); itemAttributes = []; if (item.name.substr(-1) === '_') { item.name = item.name.slice(0, -1) ; itemAttributes.push('GS'); } if (item.neoClassName !== targetClassName) { itemAttributes.push('inherited'); } if (item.access === 'private' || item.access === 'protected') { itemAttributes.push(item.access); } if (item.scope === 'static') { itemAttributes.push('static'); } headerText = item.name; if (me.filterMembersQuery !== '' && me.filterMembersQuery !== null) { headerText = headerText.replace(filterMembersRegEx, match => `<span class="neo-highlight-search">${match}</span>`); } // configs if (item.type && item.type.names) { headerText += (': {' + MembersList.escapeHtml(item.type.names.join('|')) + '}'); } if (item.hasOwnProperty('defaultvalue')) { headerText += (' = ' + item.defaultvalue); } // methods if (item.params && item.kind !== 'event') { headerText += ('(' + item.params.reduce((result, param) => { if (param.name.indexOf('.') < 0) { if (param.optional) { result.push('[' + param.name + ']'); } else { result.push(param.name); } } return result; }, []).join(', ') + ')'); } if (item.returns) { headerText += (' → {' + MembersList.escapeHtml(item.returns[0].type.names.join('|') + '}')); } path = item.meta.path; if (path.includes('/neo.mjs/')) { path = path.substr(path.indexOf('/neo.mjs/') + 9); } else if (path.includes('/neomjs/')) { path = path.substr(path.indexOf('/neomjs/') + 8); } else if (path.includes('/neo/')) { path = path.substr(path.indexOf('/neo/') + 5); } itemConfig = { cls: ['neo-list-item'], cn : [{ cls: ['neo-list-item-header-container'], cn : [{ cls : ['neo-list-item-header'], innerHTML: headerText }, { style: { flex: 1 } }, { cls : ['neo-list-item-header'], innerHTML: itemAttributes.join(', ') }] }, { cls: 'neo-docs-view-source-link-container', cn :[{ tag : 'a', cls : ['neo-docs-view-source-link'], href : '#viewSource=' + item.neoClassName + '&line=' + item.meta.lineno, innerHTML: 'Source: ' + path + '/' + item.meta.filename + ' (Line ' + item.meta.lineno + ')' }] }, { innerHTML: item.description }] }; if (item.examples && item.examples.length > 0) { hasExamples = true; item.examples.forEach(example => { itemConfig.cn.push({ tag: 'pre', cn : [{ tag : 'code', html: example }] }); }); } if (item.params && item.params.length > 0) { itemConfig.cn.push(MembersList.createParametersTable(item.params)); } if (item.returns && item.kind !== 'event') { itemConfig.cn.push({ innerHTML: 'Returns {' + MembersList.escapeHtml(item.returns[0].type.names.join('|') + '} ') + (item.returns[0].description || '') }); } vdom.cn.push(itemConfig); }); me.vdom = vdom; if (hasExamples) { setTimeout(() => { Neo.main.addon.HighlightJS.syntaxHighlightInit(); }, 100); } } /** * * @param {Object} params * @returns {Object} vdom */ static createParametersTable(params) { let hasDefaultValues = false, hasOptionalParams = false, description, nestedParams, paramTable; params.forEach(param => { if (param.hasOwnProperty('defaultvalue')) { hasDefaultValues = true; } if (param.hasOwnProperty('optional')) { hasOptionalParams = true; } }); paramTable = { tag: 'table', cls: 'docs-param-table', cn : [{ tag: 'thead', cn : [{ tag : 'th', innerHTML: 'Name' }, { tag : 'th', innerHTML: 'Type' }, { tag : 'th', innerHTML: 'Description' }] }] }; if (hasDefaultValues) { paramTable.cn[0].cn.splice(2, 0, { tag : 'th', innerHTML: 'Default' }); } if (hasOptionalParams) { paramTable.cn[0].cn.splice(2, 0, { tag : 'th', innerHTML: 'Optional' }); } params.forEach(param => { if (param.name.indexOf('.') < 0) { // ignore nested params description = { tag : 'td', innerHTML: param.description }; nestedParams = []; params.forEach(p => { if (p.name.indexOf(param.name + '.') === 0) { p = Neo.clone(p, true); p.name = p.name.split('.'); p.name.shift(); p.name = p.name.join('.'); nestedParams.push(p); } }); if (nestedParams.length > 0) { description = { tag: 'td', cn : [{ innerHTML: description.innerHTML }, MembersList.createParametersTable(nestedParams)] } } paramTable.cn.push({ tag: 'tr', cn : [{ tag : 'td', innerHTML: param.name }, { tag : 'td', innerHTML: param.type ? MembersList.escapeHtml(param.type.names.join(' | ')) : '' }, description] }); if (hasDefaultValues) { paramTable.cn[paramTable.cn.length - 1].cn.splice(2, 0, { tag : 'td', innerHTML: param.defaultvalue === undefined ? '' : (param.defaultvalue + '') }); } if (hasOptionalParams) { paramTable.cn[paramTable.cn.length - 1].cn.splice(2, 0, { tag : 'td', innerHTML: param.optional }); } } }); return paramTable; } /** * Replaces '<' & '>' * @param {String} value * @returns {String} */ static escapeHtml(value) { return value.replace(/</g, '&lt;').replace(/>/g, '&gt;'); } /** * */ filterAndSortItems() { let me = this, hierarchyMap = {}, hierarchyStore = me.up('classdetails-maincontainer').down('classhierarchy-treelist').store, hierarchyItems = hierarchyStore.items, i = 0, tmpItems = [], filters, tmpItemsLen; hierarchyItems.forEach(cls => { if (cls.checked === true) { tmpItems.push(cls.name); } }); tmpItemsLen = tmpItems.length; for (; i < tmpItemsLen; i++) { hierarchyMap[tmpItems[i]] = i; } me.targetClassName = hierarchyItems[hierarchyItems.length -1].name; filters = [{ operator: 'included', property: 'neoClassName', value : tmpItems }, { operator: '!==', property: 'kind', value : 'class' }, { operator: '!==', property: 'kind', value : 'constant' // todo? }, { operator: '!==', property: 'kind', value : 'module' }, { operator: 'isUndefined', property: 'inherited' }]; if (!me.showPrivateMembers) { filters.push({ operator: '!==', property: 'access', value : 'private' }); } if (!me.showProtectedMembers) { filters.push({ operator: '!==', property: 'access', value : 'protected' }); } if (!me.showStaticMembers) { filters.push({ operator: '!==', property: 'scope', value : 'static' }); } if (me.filterMembersQuery !== '' && me.filterMembersQuery !== null) { filters.push({ operator: 'like', property: 'name', value : me.filterMembersQuery }); } filters.push({ scope : me, filterBy: function(opts) { let me = this, filteredItems = opts.filteredItems, item = opts.item, targetClassName = me.targetClassName, filteredItem, i, len; // always exclude inherited className & ntype configs if (item.name === 'ntype' && item.neoClassName !== targetClassName ) { return true; } if (item.neoClassName !== targetClassName) { i = 0; len = filteredItems.length; for (; i < len; i++) { filteredItem = filteredItems[i]; if (item.id !== filteredItem.id) { if ( item.name === filteredItem.name && item.scope === filteredItem.scope && // static VS instance members hierarchyMap[item.neoClassName] < hierarchyMap[filteredItem.neoClassName] ) { return true; } } } } return false; } }); me.store.filters = filters; me.store.sorters = [{ // Configs => Methods => Events sortBy: function(a, b) { a = a.kind === 'member' ? 0 : a.kind === 'function' ? 1 : 2; b = b.kind === 'member' ? 0 : b.kind === 'function' ? 1 : 2; return a > b ? 1 : a < b ? -1 : 0; } }, { direction: 'ASC', property : 'name' }]; me.fire('mutateItems', me.store); } /** * Override to not call createItems() at this point => onRefreshClassMembers() */ onStoreFilter() {} /** * */ onRefreshClassMembers() { this.filterAndSortItems(); this.createItems(); } } Neo.applyClassConfig(MembersList); export {MembersList as default};