UNPKG

preact-arco-design

Version:

Arco Design React UI Library.

245 lines (216 loc) 7.44 kB
var __assign = this && this.__assign || function () { __assign = Object.assign || function (t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) { if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } } return t; }; return __assign.apply(this, arguments); }; var __read = this && this.__read || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) { ar.push(r.value); } } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; import React, { useState, useEffect, useContext, useRef, Fragment } from "preact/compat"; import cs from "../_util/classNames"; import { ConfigContext } from "../ConfigProvider"; import ResponsiveObserve, { responsiveArray } from "../_util/responsiveObserve"; import { isObject, isArray, isNumber } from "../_util/is"; import useMergeProps from "../_util/hooks/useMergeProps"; var getLength = function getLength(arr) { return isArray(arr) ? arr.reduce(function (p, n) { return p + (n.span || 1); }, 0) : 0; }; var defaultProps = { layout: 'horizontal', column: 3, tableLayout: 'auto' }; function Descriptions(baseProps) { var _a; var _b = useContext(ConfigContext), getPrefixCls = _b.getPrefixCls, componentConfig = _b.componentConfig, rtl = _b.rtl; var props = useMergeProps(baseProps, defaultProps, componentConfig === null || componentConfig === void 0 ? void 0 : componentConfig.Descriptions); var style = props.style, className = props.className, column = props.column, title = props.title, data = props.data, border = props.border, labelStyle = props.labelStyle, valueStyle = props.valueStyle, colon = props.colon, layout = props.layout, size = props.size, tableLayout = props.tableLayout; var prefixCls = getPrefixCls('descriptions'); var _c = __read(useState(), 2), screen = _c[0], setScreen = _c[1]; var responsiveToken = useRef(null); useEffect(function () { responsiveToken.current = ResponsiveObserve.subscribe(function (screens) { for (var i = 0; i < responsiveArray.length; i++) { var breakpoint = responsiveArray[i]; if (screens[breakpoint]) { setScreen(breakpoint); break; } } }); return function () { ResponsiveObserve.unsubscribe(responsiveToken.current); }; }, []); // get current column number var currentColumn = 3; if (isObject(column)) { currentColumn = column[screen] || 3; } if (isNumber(column) && column > 0) { currentColumn = column; } var renderData = []; if (isArray(data) && data.length > 0 && currentColumn) { data.forEach(function (d) { var lastOne = renderData[renderData.length - 1]; var length = getLength(lastOne); if (length === 0) { renderData.push([__assign(__assign({}, d), { span: d.span ? d.span > currentColumn ? currentColumn : d.span : 1 })]); } else if (length === currentColumn) { renderData.push([__assign(__assign({}, d), { span: d.span ? d.span > currentColumn ? currentColumn : d.span : 1 })]); } else { lastOne.push(__assign(__assign({}, d), { span: d.span ? d.span + length > currentColumn ? currentColumn - length : d.span : 1 })); } }); var lastOne = renderData[renderData.length - 1]; var lastLength = getLength(lastOne); if (lastLength < currentColumn) { lastOne[lastOne.length - 1].span = lastOne[lastOne.length - 1].span + currentColumn - lastLength; } } function renderVerticalItems(d, i) { return React.createElement(Fragment, { key: i }, React.createElement("tr", { className: "".concat(prefixCls, "-row") }, d.map(function (_d, _i) { var colSpanProps = _d.span > 1 ? { colSpan: _d.span } : {}; return React.createElement("td", __assign({ key: "".concat(_d.key || _i, "_label"), className: "".concat(prefixCls, "-item-label") }, colSpanProps, { style: labelStyle }), _d.label, colon); })), React.createElement("tr", { className: "".concat(prefixCls, "-row") }, d.map(function (_d, _i) { var colSpanProps = _d.span > 1 ? { colSpan: _d.span } : {}; return React.createElement("td", __assign({ key: "".concat(_d.key || _i, "_value"), className: "".concat(prefixCls, "-item-value") }, colSpanProps, { style: valueStyle }), _d.value); }))); } function renderHorizontalItems(d, i) { return React.createElement("tr", { key: i, className: "".concat(prefixCls, "-row") }, d.map(function (_d, _i) { var colSpanProps = _d.span > 1 ? { colSpan: _d.span * 2 - 1 } : {}; return React.createElement(Fragment, { key: _d.key || _i }, React.createElement("td", { className: "".concat(prefixCls, "-item-label"), style: labelStyle }, _d.label, colon), React.createElement("td", __assign({ className: "".concat(prefixCls, "-item-value") }, colSpanProps, { style: valueStyle }), _d.value)); })); } function renderInlineItems(d, i) { return React.createElement("tr", { key: i, className: "".concat(prefixCls, "-row") }, d.map(function (_d, _i) { var colSpanProps = _d.span > 1 ? { colSpan: _d.span } : {}; return React.createElement("td", __assign({ key: _d.key || _i }, colSpanProps, { className: "".concat(prefixCls, "-item") }), React.createElement("div", { className: "".concat(prefixCls, "-item-label-inline"), style: labelStyle }, _d.label, colon), React.createElement("div", { className: "".concat(prefixCls, "-item-value-inline"), style: valueStyle }, _d.value)); })); } function renderItems(d, i) { if (layout === 'inline-vertical' || layout === 'inline-horizontal') { return renderInlineItems(d, i); } return layout === 'vertical' ? renderVerticalItems(d, i) : renderHorizontalItems(d, i); } var classNames = cs(prefixCls, (_a = {}, _a["".concat(prefixCls, "-border")] = border, _a["".concat(prefixCls, "-layout-").concat(layout)] = layout, _a["".concat(prefixCls, "-size-").concat(size)] = size, _a["".concat(prefixCls, "-table-layout-fixed")] = tableLayout === 'fixed', _a["".concat(prefixCls, "-rtl")] = rtl, _a), className); return React.createElement("div", { className: classNames, style: style }, title && React.createElement("div", { className: "".concat(prefixCls, "-title") }, title), React.createElement("div", { className: "".concat(prefixCls, "-body") }, React.createElement("table", { className: "".concat(prefixCls, "-table"), cellPadding: 0, cellSpacing: 0 }, React.createElement("tbody", null, renderData.map(function (d, i) { return renderItems(d, i); }))))); } Descriptions.displayName = 'Descriptions'; export default Descriptions;