UNPKG

element-plus

Version:

A Component Library for Vue 3

161 lines (158 loc) 5.17 kB
import { defineComponent, provide, computed, resolveComponent, openBlock, createElementBlock, normalizeClass, createElementVNode, renderSlot, createTextVNode, toDisplayString, createCommentVNode, Fragment, renderList, createBlock } from 'vue'; import '../../../utils/index.mjs'; import '../../../hooks/index.mjs'; import DescriptionsRow from './descriptions-row.mjs'; import { elDescriptionsKey } from './token.mjs'; import _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs'; import { isValidComponentSize } from '../../../utils/vue/validator.mjs'; import { useSize } from '../../../hooks/use-common-props/index.mjs'; import { useNamespace } from '../../../hooks/use-namespace/index.mjs'; const _sfc_main = defineComponent({ name: "ElDescriptions", components: { [DescriptionsRow.name]: DescriptionsRow }, props: { border: { type: Boolean, default: false }, column: { type: Number, default: 3 }, direction: { type: String, default: "horizontal" }, size: { type: String, validator: isValidComponentSize }, title: { type: String, default: "" }, extra: { type: String, default: "" } }, setup(props, { slots }) { provide(elDescriptionsKey, props); const descriptionsSize = useSize(); const ns = useNamespace("descriptions"); const descriptionKls = computed(() => [ ns.b(), ns.is(ns.m(descriptionsSize.value), !!descriptionsSize.value) ]); const flattedChildren = (children) => { const temp = Array.isArray(children) ? children : [children]; const res = []; temp.forEach((child) => { if (Array.isArray(child.children)) { res.push(...flattedChildren(child.children)); } else { res.push(child); } }); return res; }; const filledNode = (node, span, count, isLast = false) => { if (!node.props) { node.props = {}; } if (span > count) { node.props.span = count; } if (isLast) { node.props.span = span; } return node; }; const getRows = () => { var _a; const children = flattedChildren((_a = slots.default) == null ? void 0 : _a.call(slots)).filter((node) => { var _a2; return ((_a2 = node == null ? void 0 : node.type) == null ? void 0 : _a2.name) === "ElDescriptionsItem"; }); const rows = []; let temp = []; let count = props.column; let totalSpan = 0; children.forEach((node, index) => { var _a2; const span = ((_a2 = node.props) == null ? void 0 : _a2.span) || 1; if (index < children.length - 1) { totalSpan += span > count ? count : span; } if (index === children.length - 1) { const lastSpan = props.column - totalSpan % props.column; temp.push(filledNode(node, lastSpan, count, true)); rows.push(temp); return; } if (span < count) { count -= span; temp.push(node); } else { temp.push(filledNode(node, span, count)); rows.push(temp); count = props.column; temp = []; } }); return rows; }; return { descriptionKls, getRows, ns }; } }); function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_el_descriptions_row = resolveComponent("el-descriptions-row"); return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.descriptionKls) }, [ _ctx.title || _ctx.extra || _ctx.$slots.title || _ctx.$slots.extra ? (openBlock(), createElementBlock("div", { key: 0, class: normalizeClass(_ctx.ns.e("header")) }, [ createElementVNode("div", { class: normalizeClass(_ctx.ns.e("title")) }, [ renderSlot(_ctx.$slots, "title", {}, () => [ createTextVNode(toDisplayString(_ctx.title), 1) ]) ], 2), createElementVNode("div", { class: normalizeClass(_ctx.ns.e("extra")) }, [ renderSlot(_ctx.$slots, "extra", {}, () => [ createTextVNode(toDisplayString(_ctx.extra), 1) ]) ], 2) ], 2)) : createCommentVNode("v-if", true), createElementVNode("div", { class: normalizeClass(_ctx.ns.e("body")) }, [ createElementVNode("table", { class: normalizeClass([_ctx.ns.e("table"), _ctx.ns.is("bordered", _ctx.border)]) }, [ createElementVNode("tbody", null, [ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.getRows(), (row, index) => { return openBlock(), createBlock(_component_el_descriptions_row, { key: index, row }, null, 8, ["row"]); }), 128)) ]) ], 2) ], 2) ], 2); } var Descriptions = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__file", "/home/runner/work/element-plus/element-plus/packages/components/descriptions/src/index.vue"]]); export { Descriptions as default }; //# sourceMappingURL=index.mjs.map