wui-print
Version:
前端打印插件,包含打印设计器、打印表单、打印API
287 lines (285 loc) • 11.8 kB
JavaScript
import { deepCopy, extractNumbers } from "../../print-designer-utils";
export default ({ printData, printConfig, formConfig, layoutConfig, tablePaginationElements } = {}) => {
const formatLayoutConfig = () => {
console.log("【复杂表格分页】formatLayoutConfig入参===>", {
printData: deepCopy(printData),
printConfig: deepCopy(printConfig),
formConfig: deepCopy(formConfig),
layoutConfig: deepCopy(layoutConfig),
tablePaginationElements
});
let paginationDetails = _getPaginationDetails();
console.log("【复杂表格分页】获取续打信息====>paginationDetails", paginationDetails);
if (!paginationDetails.paginationState || !paginationDetails.dataField) {
return layoutConfig;
}
printData[paginationDetails.dataField] = _formatTableData({ paginationDetails });
let continueAllData = printData[paginationDetails.dataField];
console.log("【复杂表格分页】处理后的数据====>continueAllData", deepCopy(continueAllData));
let continueSplitData = _splitPaginationAllData({
continueAllData,
pageMaxRow: paginationDetails.pageMaxRow
});
console.log("【复杂表格分页】拆分数据====>continueSplitData", continueSplitData);
let oldLayoutConfig = _filterLayoutConfig();
let layoutConfigExcludingLastPage = _formatLayoutConfigExcludingLastPage({ oldLayoutConfig });
let newLayoutConfig = [];
continueSplitData.forEach((item, index) => {
let currentPage = index + 1;
let pageLayoutConfig = _createPageLayoutConfig({
oldLayoutConfig,
layoutConfigExcludingLastPage,
paginationDetails,
pageComplateTableData: item,
currentPage: currentPage,
pageCount: continueSplitData.length
});
newLayoutConfig.push(...pageLayoutConfig);
});
return newLayoutConfig;
};
function _createPageLayoutConfig({
oldLayoutConfig,
layoutConfigExcludingLastPage,
paginationDetails,
pageComplateTableData,
currentPage,
pageCount
} = {}) {
let pageLayoutConfig;
if (currentPage < pageCount) {
// 不是最后一页 需要过滤在最后一页显示的元素
pageLayoutConfig = deepCopy(layoutConfigExcludingLastPage);
} else {
pageLayoutConfig = deepCopy(oldLayoutConfig);
}
let newField = `_pagination_${paginationDetails.dataField}_${currentPage}`;
let nowTablePaginationConfig = {
type: "pagination_default",
currentPage,
blankRowCount: 0
};
let layoutConfigIndex = _getComplexTableIndex({ nowLayoutConfig: pageLayoutConfig });
pageLayoutConfig[layoutConfigIndex].props.field = newField;
printData[newField] = deepCopy(pageComplateTableData);
// 最后一页还有空白行
if (currentPage == pageCount && pageComplateTableData.length < paginationDetails.pageMaxRow) {
nowTablePaginationConfig.blankRowCount = paginationDetails.pageMaxRow - pageComplateTableData.length;
nowTablePaginationConfig.type = "pagination_afterBlankRow";
}
pageLayoutConfig[layoutConfigIndex]._tablePaginationConfig = nowTablePaginationConfig;
if (pageCount > 1) {
if (currentPage > 1) {
// 添加分页上边距
pageLayoutConfig.unshift({
type: "pageTop"
});
}
if (currentPage < pageCount) {
// 添加分页下边距
pageLayoutConfig.push({
type: "pageBottom"
});
// 添加分页
pageLayoutConfig.push({
type: "pageBreak"
});
}
}
return pageLayoutConfig;
}
function _filterLayoutConfig() {
// 只保留第一个续打表格
let newLayoutConfig = [];
let paginationConfigItem = false;
layoutConfig.forEach((item, index) => {
let nowProps = !!item.props ? item.props : {};
if (item.type == "complexTable" && !!nowProps.canContinue && !!paginationConfigItem) {
return;
}
if (item.type == "complexTable" && !!nowProps.canContinue) {
paginationConfigItem = item;
}
newLayoutConfig.push(item);
});
return newLayoutConfig;
}
function _getPaginationDetails() {
let paginationDetails = {
paginationState: false
};
if (!layoutConfig || layoutConfig.length <= 0) {
return paginationDetails;
}
let paginationConfigItem = false;
layoutConfig.forEach((item, index) => {
if (!!paginationConfigItem) {
return;
}
let nowProps = !!item.props ? item.props : {};
if (item.type == "complexTable" && !!nowProps.isPaginationMode) {
paginationConfigItem = item;
}
});
if (!paginationConfigItem) {
return paginationDetails;
}
let paginationConfigItemProps = !!paginationConfigItem.props ? paginationConfigItem.props : {};
let paginationConfigItemStyle = !!paginationConfigItem.style ? paginationConfigItem.style : {};
paginationDetails.paginationState = true;
paginationDetails.paginationConfigItem = deepCopy(paginationConfigItem);
paginationDetails.dataField = !!paginationConfigItemProps.field ? paginationConfigItemProps.field : "";
paginationDetails.pageMaxRow = !!paginationConfigItemProps.perPageMaxRow ? paginationConfigItemProps.perPageMaxRow : 0;
paginationDetails.contentRowHeight = !!paginationConfigItemProps.contentRowHeight
? paginationConfigItemProps.contentRowHeight
: 0;
if (!paginationConfigItemStyle.contentCell_borderWidth && !!paginationConfigItemStyle.contentCell_borderTopWidth) {
paginationDetails.contentRowBorderTop = extractNumbers(paginationConfigItemStyle.contentCell_borderTopWidth);
} else if (!!paginationConfigItemStyle.contentCell_borderWidth) {
paginationDetails.contentRowBorderTop = extractNumbers(paginationConfigItemStyle.contentCell_borderWidth);
} else {
paginationDetails.contentRowBorderTop = 0;
}
if (!paginationConfigItemStyle.contentCell_borderWidth && !!paginationConfigItemStyle.contentCell_borderBottomWidth) {
paginationDetails.contentRowBorderBottom = extractNumbers(paginationConfigItemStyle.contentCell_borderBottomWidth);
} else if (!!paginationConfigItemStyle.contentCell_borderWidth) {
paginationDetails.contentRowBorderBottom = extractNumbers(paginationConfigItemStyle.contentCell_borderWidth);
} else {
paginationDetails.contentRowBorderBottom = 0;
}
// 页尾向上合并行数
if (!!paginationConfigItemProps.mergedFooterRowCount || paginationConfigItemProps.mergedFooterRowCount === 0) {
paginationDetails.mergedFooterRowCount = paginationConfigItemProps.mergedFooterRowCount;
} else {
paginationDetails.mergedFooterRowCount = 1;
}
//_printDataTotal内部逻辑使用
paginationDetails._printDataTotal = 0;
return paginationDetails;
}
function _formatTableData({ paginationDetails } = {}) {
let oldTableData = [];
let tempTableData = [];
let tableDataGroup = [];
if (!!printData[paginationDetails.dataField]) {
oldTableData = deepCopy(printData[paginationDetails.dataField]);
}
tempTableData.push(...oldTableData);
tempTableData.forEach((item, index) => {
let groupItem = [];
let excessRows = _getContentTrExcessRows({ paginationDetails, index, rowData: item });
item._paginationMode_excessRowsLength = excessRows.length;
groupItem.push(item, ...excessRows);
tableDataGroup.push(groupItem);
});
let newTableData = [];
tableDataGroup.forEach((groupItem, groupIndex) => {
if (groupIndex.length > 1) {
groupItem[0]._paginationMode_type = "excessContentRow";
} else {
groupItem[0]._paginationMode_type = "notExcess";
}
newTableData.push(...groupItem);
});
return newTableData;
}
function _getContentTrExcessRows({ paginationDetails, index, rowData }) {
// 获取超出行数
const trElement = tablePaginationElements.querySelector(`[content-index="${index}"]`);
let trContentMinHeight =
trElement.clientHeight - paginationDetails.contentRowBorderTop - paginationDetails.contentRowBorderBottom;
let trContentHeight = trContentMinHeight;
let contentTextElements = trElement.querySelectorAll(".content-text");
for (let i = 0; i < contentTextElements.length; i++) {
let element = contentTextElements[i];
if (element.offsetHeight > trContentHeight) {
trContentHeight = element.offsetHeight;
}
}
let excessRows = [];
let excessRowsLength = (trContentHeight - paginationDetails.contentRowHeight) / paginationDetails.contentRowHeight;
excessRowsLength = Math.ceil(excessRowsLength);
paginationDetails._printDataTotal += excessRowsLength + 1;
// 剩余行数
let pageSurplus = paginationDetails.pageMaxRow - (paginationDetails._printDataTotal % paginationDetails.pageMaxRow);
if (pageSurplus >= 0 && pageSurplus <= paginationDetails.mergedFooterRowCount) {
excessRowsLength += pageSurplus;
paginationDetails._printDataTotal += pageSurplus;
}
for (let i = 0; i < excessRowsLength; i++) {
let newRowData = deepCopy(rowData);
newRowData._paginationMode_type = "excessBlankRow";
newRowData._paginationMode_excessIndex = i;
newRowData._paginationMode_excessRowsLength = excessRowsLength;
excessRows.push(newRowData);
}
return excessRows;
}
function _splitPaginationAllData({ continueAllData, pageMaxRow, continueBeforeRowCount }) {
let result = [];
let newAllData = continueAllData;
for (let i = 0; i < newAllData.length; i += pageMaxRow) {
result.push(newAllData.slice(i, i + pageMaxRow));
}
return result;
}
function _formatLayoutConfigExcludingLastPage({ oldLayoutConfig }) {
// 排除最后一页显示的元素
let newLayoutConfig = [];
let layoutConfigCopy = deepCopy(oldLayoutConfig);
layoutConfigCopy.forEach((item, index) => {
if (item.type == "grid") {
item.children.forEach((gridItem, gridItemIndex) => {
let gridItemCopy = deepCopy(gridItem);
gridItem.children = [];
gridItemCopy.children.forEach((componentItem, componentIndex) => {
if (!__getExcludingState(componentItem)) {
gridItem.children.push(componentItem);
}
});
});
newLayoutConfig.push(item);
} else if (item.type == "tableLayout") {
let itemCopy = deepCopy(item);
item.children = [];
itemCopy.children.forEach((componentItem, componentIndex) => {
if (!__getExcludingState(componentItem)) {
item.children.push(componentItem);
}
});
newLayoutConfig.push(item);
} else if (item.type == "complexTable") {
newLayoutConfig.push(item);
} else {
if (!__getExcludingState(item)) {
newLayoutConfig.push(item);
}
}
});
function __getExcludingState(componentItem) {
if (!componentItem.props) {
return false;
}
if (!!componentItem.props.showOnLastPage) {
return true;
}
return false;
}
return newLayoutConfig;
}
function _getComplexTableIndex({ nowLayoutConfig }) {
let layoutConfigIndex = -1;
nowLayoutConfig.forEach((item, index) => {
if (layoutConfigIndex >= 0) {
return;
}
if (item.type == "complexTable") {
layoutConfigIndex = index;
}
});
return layoutConfigIndex;
}
return {
formatLayoutConfig
};
};