covid19-dashboard
Version:
Dashboard App displaying COVID-19 numbers by country
624 lines (543 loc) • 18.5 kB
JavaScript
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, '<').replace(/>/g, '>');
}
/**
*
*/
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};