|
|
@@ -1,7 +1,7 @@ |
|
|
|
/* |
|
|
|
columns: <displayed columns>, |
|
|
|
columns_options: {} |
|
|
|
serial: true/false, |
|
|
|
model_options: <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', { |
|
|
|