kui-vue
Version:
A lightweight desktop UI component library suitable for Vue.js 2.
184 lines (176 loc) • 5.3 kB
JSX
import { defineComponent } from "vue";
import Item from "./descriptionsItem";
import { withInstall } from "../utils/vue";
import { getChildren } from "../utils/vnode";
const Descriptions = defineComponent({
name: "Descriptions",
props: {
bordered: Boolean,
column: { type: Number, default: 3 },
layout: { type: String, default: "horizontal" },
title: String,
extra: String,
size: { type: String, default: "default" },
},
setup(ps, { slots }) {
return () => {
let { column, bordered, layout, size, title, extra } = ps;
let children = getChildren(slots.default?.());
let rows = { 0: [] },
len = 0,
temps = [],
v = 0;
let i = 0;
for (let child of children) {
i++;
// let { label, span = 1 } = child.props; //for 3
let { label, span = 1 } = child?.componentOptions?.propsData;
let childNodes = child?.componentOptions?.children;
let row = rows[len] || [];
let vertical = layout == "vertical";
let temp = (vertical ? temps[v] : temps[len]) || 0;
let cols = bordered && !vertical ? column * 2 : column;
if (i == childNodes?.length - 1) {
if (bordered) {
span = cols - temp - (vertical ? 0 : 1);
} else if (temp < cols) {
span = cols - temp;
}
}
if (vertical) {
let row2 = rows[len + 1] || [];
if (temp < cols) {
row.push(
<Item
label={label}
span={span}
type="label"
layout={layout}
bordered={bordered}
/>
);
row2.push(
<Item span={span} layout={layout} bordered={bordered}>
{childNodes}
</Item>
);
rows[len] = row;
rows[len + 1] = row2;
temps[v] = temp + span;
} else if (temp >= cols) {
len += 2;
v += 1;
rows[len] = [];
rows[len + 1] = [];
temps[v] = temp + span;
rows[len].push(
<Item
label={label}
span={span}
type="label"
layout={layout}
bordered={bordered}
/>
);
rows[len + 1].push(
<Item span={span} layout={layout} bordered={bordered}>
{childNodes}
</Item>
);
}
if (temps[v] >= cols) {
len += 2;
v += 1;
}
} else {
if (bordered) {
if (temp < cols) {
row.push(
<Item
label={label}
bordered={bordered}
span={1}
type="label"
/>,
<Item span={span} bordered={bordered}>
{childNodes}
</Item>
);
rows[len] = row;
temps[len] = temp + span + 1;
} else if (temp >= cols) {
len += 1;
rows[len] = [];
temps[len] = span + 1;
rows[len].push(
<Item
label={label}
bordered={bordered}
span={1}
type="label"
/>,
<Item span={span} bordered={bordered}>
{childNodes}
</Item>
);
}
if (temps[len] >= cols) {
len += 1;
}
} else {
if (temp < cols) {
row.push(
<Item label={label} span={span}>
{childNodes}
</Item>
);
rows[len] = row;
temps[len] = temp + span;
} else if (temp >= cols) {
len += 1;
rows[len] = [];
temps[len] = temp + span;
rows[len].push(
<Item label={label} span={span}>
{childNodes}
</Item>
);
}
if (temps[len] >= cols) {
len += 1;
}
}
}
}
let trs = [];
for (let tr in rows) {
trs.push(<tr class="k-descriptions-row">{rows[tr]}</tr>);
}
const viewNode = <table>{trs}</table>;
let props = {
class: [
"k-descriptions",
{
"k-descriptions-vertical": layout == "vertical",
"k-descriptions-bordered": bordered,
"k-descriptions-middle": size == "middle",
"k-descriptions-sm": size == "small",
},
],
};
const extraNode = extra || slots.extra?.();
return (
<div {...props}>
<div class="k-descriptions-header">
<div class="k-descriptions-title">{title || slots.title?.()}</div>
{extraNode ? (
<div class="k-descriptions-extra">{extraNode}</div>
) : null}
</div>
<div class="k-descriptions-view">{viewNode}</div>
</div>
);
};
},
});
export default withInstall(Descriptions);