diff --git a/src/components/Table.js b/src/components/Table.js index 33f1057..3b4cab8 100644 --- a/src/components/Table.js +++ b/src/components/Table.js @@ -1,7 +1,7 @@ /* - columns: , + columns_options: {} serial: true/false, - model_options: + model: model */ export default initial_vnode => { @@ -9,20 +9,23 @@ export default initial_vnode => { let model = initial_vnode.attrs.model // displayed columns - let columns = initial_vnode.attrs.columns - if (!columns) { - if (model.configs().selects) { - columns = model.configs().selects.map(select => ({ - label: select.alias || select.label - })) - } + let columns = [] + if (model.configs().selects) { + // construct by selects + columns = model.configs().selects.map(select => ({ + label: select.alias || select.label + })) + // merge column options + columns = columns.map( + column => column.label in initial_vnode.attrs.columns_options + ? {...initial_vnode.attrs.columns_options[column.label], ...column} : column + ).filter(column => !('display' in column) || column.display != false) } // pagination let offset = 0 let limit = initial_vnode.attrs.pagination && initial_vnode.attrs.pagination.size || Infinity let pages = [] // [{activie: boolean, show: boolean}] - function generate_pages() { if (limit > 0 && limit < Infinity && model.cache().count) { let active_page = offset / limit @@ -63,7 +66,13 @@ export default initial_vnode => { view: vnode => { // try to generate columns if it is still uninitialized if (typeof columns == 'undefined' || columns.length == 0) { + // construct by data columns = model.data(offset, limit) && model.data(offset, limit).length && Object.keys(model.data(offset, limit)[0]).map(key => ({label: key})) || [] + // merge column options + columns = columns.map( + column => column.label in initial_vnode.attrs.columns_options + ? {...initial_vnode.attrs.columns_options[column.label], ...column} : column + ).filter(column => !('display' in column) || column.display != false) } // refresh paginations @@ -76,6 +85,7 @@ export default initial_vnode => { vnode.attrs.serial ? m('th.centered', '序号') : undefined, ...columns.map(column => m('th.centered', column.label)) ])), + // table content model.data(offset, limit).length ? m('tbody', model.data(offset, limit).map((row, i) => m('tr', [ vnode.attrs.serial ? m('td.centered', offset+i+1) : undefined, ...columns.map(column => { @@ -88,6 +98,7 @@ export default initial_vnode => { }) ]))) : m('', 'Empty') ]), + // page navigation pages.length > 1 ? m('.centered', m('.pagination.centered', pages.map((page, i) => page.show ? m('a', {