<template>
<div class="zhc-birt-grid-sheet">
<div
v-if="conf.rowSplit === 'pageSplit'"
style="page-break-after: always"
/>
<table :style="confStyle" :class="confClass">
<thead>
<tr>
<th
v-for="(th, i) in conf.cols"
:style="getThStyle(th)"
:key="'th' + i"
></th>
</tr>
</thead>
<tbody>
<tr
v-for="(tr, j) in conf.rows"
:style="{ height: tr.rowHeight + 'px' }"
:key="'tr' + j"
>
<td
v-for="(td, k) in tr.tds"
:key="'td' + k"
:style="getTdStyle(td)"
:rowspan="td.rowspan"
:colspan="td.colspan"
>
<birt-cell-children v-if="td.children" :children="td.children" />
<view-style v-else-if="td.viewStyle" :td-obj="td" />
<hc-link-hrefs
v-else-if="td.hrefs && td.hrefs.length > 0"
:td-obj="td"
/>
<span v-else>{{ formatValue(td.value, td.format) }}</span>
</td>
</tr>
</tbody>
</table>
</div>
</template>
<script>
import autosize from "@birt/components/mixins/autosize";
import ViewStyle from "@birt/components/ViewStyle";
import format from "@birt/components/mixins/format";
export default {
name: "birt-grid-sheet",
mixins: [autosize, format],
components: {
ViewStyle,
},
props: {
conf: {
type: Object,
default: function () {
return {};
},
},
},
data() {
return {};
},
computed: {
width() {
return this.conf.width;
},
height() {
return this.conf.height;
},
confStyle() {
return `${this.autoSizeStyle()};${this.conf.style};`;
},
confClass() {
return this.conf.class;
},
},
methods: {
// 初始化条件表达式列表
initConditionExpr() {
for (var key in this.conf.rows) {
let tr = this.conf.rows[key];
for (var tdkey in tr.tds) {
let td = tr.tds[tdkey];
if (td.conditionExprs) {
this.setTdStyleByConditionExpr(td, tr);
}
}
}
this.conf.hasInitConditionExpr = true;
},
// 获取表头th样式
getThStyle(th) {
if (typeof th.colWidth == "number") {
return `width:${th.colWidth}px;`;
} else {
return `width:${th.colWidth};`;
}
},
getTdStyle(td) {
let tdStyle = td.style || "";
if (td.styleExpr) {
tdStyle += td.styleExpr() || "";
}
return tdStyle;
},
// 根据条件表达式配置,初始化[当前单元格、当前行、当前列]样式
setTdStyleByConditionExpr(td, tr) {
let me = this;
td.conditionExprs.forEach((cdion) => {
if (cdion.expr.call()) {
let applyItems = cdion.applyItems;
applyItems.forEach((item) => {
let itemStyle = me.getApplyItemStyle(item);
if (item.applyScheme === "applyCell") {
if (td.style === undefined) {
td.style = "";
}
td.style += itemStyle;
} else if (item.applyScheme === "applyRow") {
me.setTrStyleByApplyRow(tr, itemStyle);
} else if (item.applyScheme === "applyCol") {
me.setTdStyleByConditionExpr(td, itemStyle);
}
});
}
});
},
// 设置条件表达式行应用样式
setTrStyleByApplyRow(tr, styleVal) {
for (var tdkey in tr.tds) {
let td = tr.tds[tdkey];
td.style += styleVal;
}
},
// 设置条件表达式列应用样式
setColStyleByApplyRow(td, styleVal) {},
getApplyItemStyle(applyItem) {
let retuStyle = "";
if (applyItem.controlName === "ConditionApplyColor") {
retuStyle += `color:${applyItem.color};`;
} else if (applyItem.controlName === "ConditionApplyBackgroundColor") {
retuStyle += `background-color:${applyItem.backgroundColor};`;
}
return retuStyle;
},
},
created() {
if (!this.conf.hasInitConditionExpr) {
this.initConditionExpr();
}
},
};
</script>
<style lang="scss" scoped>
</style>