@opentiny/vue-renderless
Version:
An enterprise-class UI component library, support both Vue.js 2 and Vue.js 3, as well as PC and mobile.
148 lines (147 loc) • 5.09 kB
JavaScript
import {
__spreadValues
} from "../../chunk-G2ADBYYC.js";
import { xss } from "@opentiny/utils";
import { browserInfo } from "@opentiny/utils";
import { toTreeArray } from "../static";
import { getCellValue, getFuncText } from "../utils";
import { exportExcel } from "./exportExcel";
const getCsvLabelData = (columns, oData, tableElem) => {
const trElemList = tableElem.querySelectorAll(".tiny-grid__body-wrapper.body__wrapper .tiny-grid-body__row");
const trData = [];
for (let i = 0, len = trElemList.length; i < len; i++) {
const item = {};
const trElem = trElemList[i];
columns.forEach((column) => {
const cell = trElem.querySelector(`.${column.id}`);
item[column.id] = cell ? cell.innerText.trim() : "";
});
trData.push(item);
}
return trData;
};
const getCsvData = (opts, oData, oColumns, tableElem) => {
const isOriginal = opts.original;
let columns = opts.columns ? opts.columns : oColumns;
if (opts.columnFilterMethod) {
columns = columns.filter(opts.columnFilterMethod);
}
let datas = opts.data ? opts.data : isOriginal ? oData : getCsvLabelData(columns, oData, tableElem);
if (opts.dataFilterMethod) {
datas = datas.filter(opts.dataFilterMethod);
}
return { columns, datas };
};
const getCsvContent = ($table, opts, oColumns, oData) => {
const isOriginal = opts.original;
const tableEl = $table.$el;
const tab = opts.useTabs === false ? "" : " ";
const { columns, datas } = getCsvData(opts, oData, oColumns, tableEl);
let content = "\uFEFF";
const transfrom = (str) => {
if (str === null || str === void 0) {
return "" + tab;
}
if (typeof str === "number" && isNaN(str)) {
return "-" + tab;
}
if (typeof str === "string" && str.replace(/ /g, "").match(/[\s,"]/)) {
str = '"' + str.replace(/"/g, '""') + '"';
}
if (typeof str === "string" && str.match(/^([@=]|([-\\+].*[^0-9\\.])).*$/)) {
str = " " + str;
}
return str + tab;
};
if (opts.isHeader) {
content += columns.map(({ own }) => transfrom(getFuncText(own.title || own.label))).join(",") + "\n";
}
datas.forEach((row, rowIndex) => {
if (isOriginal) {
content += columns.map((column) => {
if (column.type === "index") {
return column.indexMethod ? column.indexMethod(rowIndex) : rowIndex + 1;
}
return transfrom(getCellValue(row, column));
}).join(",") + "\n";
} else {
content += columns.map((column) => transfrom(row[column.id])).join(",") + "\n";
}
});
if (opts.isFooter) {
const footerData = $table.footerData;
const footers = opts.footerFilterMethod ? footerData.filter(opts.footerFilterMethod) : footerData;
const filterMaps = $table.tableColumn.map((column) => ~columns.indexOf(column));
footers.forEach((rows) => {
content += rows.filter((val, colIndex) => filterMaps[colIndex]).join(",") + "\n";
});
}
return content;
};
const getCsvUrl = (opts, content) => {
if (window.Blob && window.URL && window.URL.createObjectURL && browserInfo.name !== "safari") {
return URL.createObjectURL(new Blob([content], { type: "text/csv;charset=utf-8" }));
}
return `data:attachment/csv;charset=utf-8,${encodeURIComponent(content)}`;
};
const downloadCsc = (options, content) => {
if (!options.download) {
return Promise.resolve(content);
}
if (navigator.msSaveBlob && window.Blob) {
navigator.msSaveBlob(new Blob([content], { type: "text/csv;charset=utf-8" }), options.filename);
} else {
const linkElem = document.createElement("a");
linkElem.target = "_blank";
linkElem.rel = "noopener noreferrer";
linkElem.download = options.filename;
linkElem.href = xss.filterUrl(getCsvUrl(options, content));
document.body.appendChild(linkElem);
linkElem.click();
document.body.removeChild(linkElem);
}
};
var export_default = {
_exportCsv(options) {
let { visibleColumn, scrollXLoad, scrollYLoad, treeConfig } = this;
let mergedOpts = __spreadValues({
columns: null,
columnFilterMethod: (column) => column.property && !["index", "selection", "radio"].includes(column.type),
download: true,
data: null,
dataFilterMethod: null,
filename: "table.csv",
footerFilterMethod: null,
isHeader: true,
isFooter: true,
original: !!treeConfig
}, options);
if (!mergedOpts.filename.includes(".csv")) {
mergedOpts.filename += ".csv";
}
if (!mergedOpts.original) {
if (scrollXLoad || scrollYLoad) {
mergedOpts.original = true;
}
}
let columns = visibleColumn;
let oData = this.tableFullData;
if (treeConfig) {
oData = toTreeArray(oData, treeConfig);
}
oData.forEach((value) => {
Object.keys(value).forEach((key) => {
if (value[key] === 0) {
value[key] = "0";
}
});
});
return downloadCsc(mergedOpts, getCsvContent(this, mergedOpts, columns, oData));
},
_exportExcel(options) {
exportExcel(this, options);
}
};
export {
export_default as default
};