/**
* dynamicTable 动态表格
* @param { Object } resource
* @param { String } el : 指定元素
* @param { Array } header : 表头
* @param { Array } data : 数据行
* @param { Number } rowNum : 显示行数
* @param { Boolean } index : 是否显示索引列
* @param { Number } timeout : 滚动动画延时
* @param { String } headerBGC : 标题栏背景颜色
* @param { String } oddRowBGC : 奇数行背景颜色
* @param { String } evenRowBGC : 偶数行背景颜色
* @param { String } fontColor : 字体颜色
* @param { String } indexBGC : 索引列背景颜色
* @param { Array } colWidth : 每列的宽度
*/
let dynamicTable = resource => {
'use strict';
//检查参数类型
if (typeof resource !== 'object') {
console.error('未传入参数,或者参数不是Object类型');
return
}
// 检查是否传入元素
const ele = resource.el;
if (!ele) {
console.error('元素获取不正确!');
return
}
/**
* 检查是否传入动画触发时长
* 当时间小于 10 计算为秒级单位,
* 大于 10 计算为毫秒级单位
*/
let timeout = resource.timeout;
if (!timeout) {
timeout = 2000
} else if (timeout < 10) {
timeout = timeout * 1000
}
// 检查 配置元素是否传入数据
const colName = resource.header === undefined ? '' : resource.header;
const rowData = resource.data === undefined ? '' : resource.data;
const rowNum = resource.rowNum === undefined ? '20%' : 100 / resource.rowNum + '%';
const headerBGC = resource.headerBGC === undefined ? '#999' : resource.headerBGC;
const oddRowBGC = resource.oddRowBGC === undefined ? '#bbb' : resource.oddRowBGC;
const evenRowBGC = resource.evenRowBGC === undefined ? '#ddd' : resource.evenRowBGC;
const fontColor = resource.fontColor === undefined ? 'black' : resource.fontColor;
const indexBGC = resource.indexBGC === undefined ? '#555' : resource.indexBGC;
const colIndex = resource.index === undefined ? true : resource.index;
const colWidth = resource.colWidth === undefined ? false : resource.colWidth;
const indexColor = fontColor.search(/('black')|(0{3,6})/) ? "white" : fontColor;
//基本table html
const html = `
`;
//Css样式集
const boxCSS = {
overflow: 'hidden',
background: headerBGC
};
const tableCSS = {
color: fontColor,
width: '100%',
height: '100%'
};
const theadCSS = {
width: '100%',
height: '20%'
};
const thead_trCSS = {
display: "flex",
flexWrap: "nowrap",
width: "100%",
height: "100%",
background: headerBGC,
justifyContent: "space-around"
};
const thCSS = {
justifyContent: "space-around",
fontWeight: "bold"
};
const tbodyCSS = {
width: "100%",
height: '80%',
boxSizing: 'border-box'
};
const tbody_trCSS = {
flexWrap: "nowrap",
width: "100%",
height: rowNum,
justifyContent: "space-around"
};
const trOddCSS = {
display: "flex",
background: oddRowBGC
};
const trEvenCSS = {
display: "flex",
background: evenRowBGC
};
const th_tdCSS = {
margin: 'auto',
whiteSpace: 'nowrap',
overflow: "hidden",
textOverflow: 'ellipsis',
textAlign: 'center',
padding: '0 4px 0 4px'
};
const indexCSS = {
display: 'inline-block',
width: '90%',
height: "90%",
background: indexBGC,
color: indexColor,
borderRadius: '20%',
margin: 'auto'
};
//插入table元素
$(ele).append(html);
//核心代码
//遍历插入数据 表头
if (colIndex) {
$(ele + '>.table>.thead>.tr').append('#
')
}
colName.forEach(element => {
$(ele + '>.table>.thead>.tr').append(`${element}
`)
});
//遍历插入数据 数据行
for (let i = 0; i < rowData.length; i++) {
$(ele + '>.table>.tbody').append('');
if (colIndex) {
$(ele + '>.table>.tbody>.tr:eq(' + i + ')').append(
`${i+1}
`)
}
rowData[i].forEach(element => {
if (element == "一级") {
$(ele + '>.table>.tbody>.tr:eq(' + i + ')').append(
``
)
} else if (element == "二级") {
$(ele + '>.table>.tbody>.tr:eq(' + i + ')').append(
``
)
} else if (element == "三级") {
$(ele + '>.table>.tbody>.tr:eq(' + i + ')').append(
``
)
} else if (element == "未处理") {
$(ele + '>.table>.tbody>.tr:eq(' + i + ')').append(
`${element}
`
)
} else if (element == "处理中") {
$(ele + '>.table>.tbody>.tr:eq(' + i + ')').append(
`${element}
`
)
} else if (element == "已结束") {
$(ele + '>.table>.tbody>.tr:eq(' + i + ')').append(
`${element}
`
)
} else {
$(ele + '>.table>.tbody>.tr:eq(' + i + ')').append(`${element}
`)
}
})
}
//设置CSS样式
$(ele).css(boxCSS);
$(ele + '>.table').css(tableCSS);
$(ele + '>.table>.thead').css(theadCSS);
$(ele + '>.table>.thead>.tr').css(thead_trCSS);
$(ele + '>.table>.thead>.tr>.th').css(th_tdCSS).css(thCSS);
$(ele + '>.table>.tbody').css(tbodyCSS);
$(ele + '>.table>.tbody>.tr').css(tbody_trCSS);
$(ele + '>.table>.tbody>.tr:odd').css(trOddCSS);
$(ele + '>.table>.tbody>.tr:even').css(trEvenCSS);
$(ele + '>.table>.tbody>.tr>.td').css(th_tdCSS);
$(ele + '>.table span.index').css(indexCSS)
//统一计量单位
const emptyUnit = element => element.replace(/[^0-9]/g, '');
const hendlen = $(`${ele}>.table>.thead>.tr>.th`).length;
const bodylen = $(`${ele}>.table>.tbody>.tr:nth-child(1)>.td`).length;
const ceil = Math.ceil;
/**
* 设置每列的宽度
* eq() 是在匹配的元素中取下标为n的元素
* nth-child() 是在匹配元素的父元素中选择第n个元素
*/
if (!colWidth) {
$(`${ele}>.table>.thead>.tr>.th`).css({
width: ceil(100 / hendlen) + '%'
});
$(`${ele}>.table>.tbody>.tr>.td`).css({
width: ceil(100 / bodylen) + '%'
});
} else {
for (let i = 0; i < colWidth.length; i++) {
let emptyUnitColWidth = emptyUnit(colWidth[i]);
$(`${ele}>.table>.thead>.tr>.th:nth-child(${i+1})`).width(emptyUnitColWidth);
$(`${ele}>.table>.tbody>.tr>.td:nth-child(${i+1})`).width(emptyUnitColWidth);
}
}
//奇偶校验 --> 处理最后一行是奇数的问题
let oddORevenCheck = $(`${ele}>.table>.tbody>.tr`).length % 2 == 0 ? 'even' : 'odd';
//滚动动画
setInterval(function() {
$(ele + '>.table>.tbody>.tr:eq(0)').slideToggle(100, function() {
switch (oddORevenCheck) {
case 'even':
$(this).clone().css(trEvenCSS).appendTo(ele + '>.table>.tbody');
oddORevenCheck = 'odd';
break;
case 'odd':
$(this).clone().css(trOddCSS).appendTo(ele + '>.table>.tbody');
oddORevenCheck = 'even';
break;
}
$(this).remove();
});
}, timeout);
// 组件销毁钩子
$(`${ele}`).bind('DOMNodeRemoved', (e) => {
if (e.target.classList[0] === 'asit-table') {
clearInterval(timer);
}
});
}