UNPKG

choerodon-ui

Version:

An enterprise-class UI design language and React-based implementation

719 lines (630 loc) 24.9 kB
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray"; import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties"; import _extends from "@babel/runtime/helpers/extends"; import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator"; import _objectSpread from "@babel/runtime/helpers/objectSpread2"; import _slicedToArray from "@babel/runtime/helpers/slicedToArray"; var _excluded = ["afterClick"], _excluded2 = ["afterClick"]; import _regeneratorRuntime from "@babel/runtime/regenerator"; import React, { isValidElement, useCallback, useContext, cloneElement, useMemo, useEffect, useState } from 'react'; import classnames from 'classnames'; import { observer } from 'mobx-react-lite'; import { isArrayLike } from 'mobx'; import isString from 'lodash/isString'; import noop from 'lodash/noop'; import isObject from 'lodash/isObject'; import isFunction from 'lodash/isFunction'; import List from '../../../es/list'; import Icon from '../../../es/icon'; import Card from '../../../es/card'; import ReactResizeObserver from '../../../es/_util/resizeObserver'; import DataSet from '../data-set'; import BoardContext from './BoardContext'; import TableDynamicFilterBar from '../table/query-bar/TableDynamicFilterBar'; import { getEditorByField, getPlaceholderByField } from '../table/utils'; import Button from '../button/Button'; import { ButtonColor, ButtonType, FuncType } from '../button/enum'; import { useModal } from '../modal-provider/ModalProvider'; import { $l } from '../locale-context'; import KanbanCustomizationSettings from './kanban-customization-settings'; import { ViewField, ViewMode } from './enum'; import Output from '../output'; import CardCommand from './CardCommand'; import { TableButtonType } from '../table/interface'; import { DataSetStatus } from '../data-set/interface'; import Menu from '../menu'; import Dropdown from '../dropdown/Dropdown'; import Typography from '../typography'; var CardContent = function CardContent(props) { var tableBtns = props.tableBtns, buttonsLimit = props.buttonsLimit, buttons = props.buttons, _props$cardProps = props.cardProps, cardProps = _props$cardProps === void 0 ? {} : _props$cardProps, queryBarProps = props.queryBarProps; var _useContext = useContext(BoardContext), onChange = _useContext.onChange, displayFields = _useContext.displayFields, _useContext$renderBut = _useContext.renderButtons, renderButtons = _useContext$renderBut === void 0 ? noop : _useContext$renderBut, autoQuery = _useContext.autoQuery, getConfig = _useContext.getConfig, getProPrefixCls = _useContext.getProPrefixCls, _useContext$prefixCls = _useContext.prefixCls, prefixCls = _useContext$prefixCls === void 0 ? '' : _useContext$prefixCls, customizedDS = _useContext.customizedDS, dataSet = _useContext.dataSet, queryFields = _useContext.queryFields, command = _useContext.command, renderCommand = _useContext.renderCommand, commandsLimit = _useContext.commandsLimit; var viewProps = customizedDS.current.get(ViewField.viewProps); var _useState = useState(0), _useState2 = _slicedToArray(_useState, 2), cardHeight = _useState2[0], setCardHeight = _useState2[1]; var modal = useModal(); var openCustomizationModal = useCallback(function () { var modalProps = { drawer: true, okFirst: false, title: '卡片视图配置', children: /*#__PURE__*/React.createElement(KanbanCustomizationSettings, { viewMode: ViewMode.card }), bodyStyle: { overflow: 'hidden auto', padding: 0 } }; modalProps.okText = $l('Tabs', 'save'); modal.open(modalProps); }, [modal]); var cardDS = useMemo(function () { var defaultSortParams = dataSet.combineSort && viewProps ? viewProps[ViewField.combineSort] || [] : []; var orgFields = dataSet.props.fields ? dataSet.props.fields : []; var orderFields = orgFields.map(function (field) { var orderField = defaultSortParams.find(function (of) { return of.sortName === field.name; }); var newField = _objectSpread({}, field); if (orderField) { newField.order = orderField.order; } return newField; }); return new DataSet(_objectSpread(_objectSpread(_objectSpread({}, dataSet.props), {}, { fields: orderFields }, cardProps.dsProps), {}, { autoQuery: false })); }, [dataSet.props]); /** * 查询看板数据 */ var loadData = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() { var changed; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: dataSet.setState('__CURRENTVIEWDS__', cardDS); if (isFunction(onChange) && customizedDS) { changed = customizedDS.getState('__ISCHANGE__'); if (changed) { onChange({ dataSet: dataSet, currentViewDS: cardDS, record: customizedDS.current }); } } if (!autoQuery) { _context.next = 5; break; } _context.next = 5; return cardDS.query(); case 5: case "end": return _context.stop(); } } }, _callee); })), [dataSet, cardDS]); useEffect(function () { loadData(); }, [dataSet, cardDS]); var cls = classnames("".concat(prefixCls, "-card-wrapper"), {}); /** * 渲染查询条字段组件 */ var getQueryFields = useCallback(function () { var queryDataSet = cardDS.queryDataSet; var result = []; if (queryDataSet) { var fields = queryDataSet.fields, current = queryDataSet.current, _queryDataSet$props$f = queryDataSet.props.fields, propFields = _queryDataSet$props$f === void 0 ? [] : _queryDataSet$props$f; var cloneFields = fields.toJS(); var tlsKey = getConfig('tlsKey'); var processField = function processField(field, name) { if (!field.get('bind', current) && !name.includes(tlsKey)) { var element = queryFields[name]; var filterBarProps = {}; var inValidElement = getEditorByField(field, current, true); var placeholder = /*#__PURE__*/isValidElement(element) && element.props.placeholder ? element.props.placeholder : getPlaceholderByField(field, current); filterBarProps = { placeholder: placeholder, border: false, clearButton: true }; var elementType = inValidElement.type; if ((! /*#__PURE__*/isValidElement(element) || element.props.suffix === undefined) && ['Currency', 'ObserverNumberField', 'EmailField', 'UrlField', 'ObserverTextField'].indexOf(elementType.name) !== -1) { _extends(filterBarProps, { suffix: /*#__PURE__*/React.createElement(Icon, { type: "search" }) }); } var _props = _objectSpread({ key: name, name: name, dataSet: queryDataSet, isFlat: true }, filterBarProps); result.push( /*#__PURE__*/isValidElement(element) ? /*#__PURE__*/cloneElement(element, _props) : /*#__PURE__*/cloneElement(inValidElement, _objectSpread(_objectSpread({}, _props), isObject(element) ? element : {}))); } }; propFields.forEach(function (_ref2) { var name = _ref2.name; if (name) { var field = cloneFields.get(name); if (field) { cloneFields["delete"](name); processField(field, name); } } }); cloneFields.forEach(function (field, name) { processField(field, name); }); } return result; }, []); /** * buttons 大于 buttonsLimits 放入下拉 * @param buttonsLimits */ var getMoreButton = function getMoreButton(buttonsLimits) { var tableButtonProps = getConfig('tableButtonProps'); var children = []; if (tableBtns && tableBtns.length && buttonsLimits) { tableBtns.slice(buttonsLimits).forEach(function (button) { var props = {}; if (isArrayLike(button)) { props = button[1] || {}; button = button[0]; } if (isString(button) && button in TableButtonType) { var _props2 = props, afterClick = _props2.afterClick, buttonProps = _objectWithoutProperties(_props2, _excluded); var defaultButtonProps = getButtonProps(button); if (defaultButtonProps) { if (afterClick) { var onClick = defaultButtonProps.onClick; defaultButtonProps.onClick = /*#__PURE__*/function () { var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(e) { return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: e.persist(); _context2.prev = 1; _context2.next = 4; return onClick(e); case 4: _context2.prev = 4; afterClick(e); return _context2.finish(4); case 7: case "end": return _context2.stop(); } } }, _callee2, null, [[1,, 4, 7]]); })); return function (_x) { return _ref3.apply(this, arguments); }; }(); } children.push( /*#__PURE__*/React.createElement(Menu.Item, { hidden: tableButtonProps.hidden, key: button }, /*#__PURE__*/React.createElement(Button, _extends({ key: "".concat(button, "-btn") }, tableButtonProps, defaultButtonProps, buttonProps, { funcType: FuncType.link })))); } } else if ( /*#__PURE__*/isValidElement(button)) { children.push( /*#__PURE__*/React.createElement(Menu.Item, { hidden: button.props.hidden }, /*#__PURE__*/cloneElement(button, _objectSpread(_objectSpread(_objectSpread({}, tableButtonProps), button.props), {}, { funcType: FuncType.link })))); } else if (isObject(button)) { children.push( /*#__PURE__*/React.createElement(Menu.Item, { hidden: props.hidden }, /*#__PURE__*/React.createElement(Button, _extends({}, tableButtonProps, button, { funcType: FuncType.link })))); } }); } var menu = /*#__PURE__*/React.createElement(Menu, { prefixCls: "".concat(getProPrefixCls('table'), "-dropdown-menu") }, children); return /*#__PURE__*/React.createElement(Dropdown, { overlay: menu, key: "dropdown_button" }, /*#__PURE__*/React.createElement(Button, _extends({}, tableButtonProps, { key: "more_button" }), /*#__PURE__*/React.createElement("span", null, $l('Table', 'more')), /*#__PURE__*/React.createElement(Icon, { type: 'expand_more' }))); }; var getButtonProps = useCallback(function (type) { var disabled = cardDS.status !== DataSetStatus.ready; switch (type) { case TableButtonType.add: return { icon: 'playlist_add', onClick: function onClick() { return cardDS.create({}, 0); }, children: $l('Table', 'create_button'), disabled: disabled || (cardDS.parent ? !cardDS.parent.current : false) }; case TableButtonType.save: return { icon: 'save', onClick: function onClick() { return cardDS.submit(); }, children: $l('Table', 'save_button'), type: ButtonType.submit, disabled: disabled }; case TableButtonType["delete"]: return { icon: 'delete', onClick: function onClick() { return cardDS["delete"](cardDS.selected); }, children: $l('Table', 'delete_button'), disabled: disabled || cardDS.selected.length === 0 }; case TableButtonType.remove: return { icon: 'remove_circle', onClick: function onClick() { return cardDS.remove(cardDS.selected); }, children: $l('Table', 'remove_button'), disabled: disabled || cardDS.selected.length === 0 }; case TableButtonType.reset: return { icon: 'undo', onClick: function onClick() { return cardDS.reset(); }, children: $l('Table', 'reset_button'), type: ButtonType.reset }; case TableButtonType.query: return { icon: 'search', onClick: function () { var _onClick = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() { return _regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return cardDS.modifiedCheck(undefined, dataSet, 'query'); case 2: _context3.t2 = _context3.sent; if (!_context3.t2) { _context3.next = 5; break; } _context3.t2 = cardDS.queryDataSet; case 5: _context3.t1 = _context3.t2; if (!_context3.t1) { _context3.next = 8; break; } _context3.t1 = cardDS.queryDataSet.current; case 8: _context3.t0 = _context3.t1; if (!_context3.t0) { _context3.next = 13; break; } _context3.next = 12; return cardDS.queryDataSet.current.validate(); case 12: _context3.t0 = _context3.sent; case 13: if (!_context3.t0) { _context3.next = 15; break; } return _context3.abrupt("return", cardDS.query()); case 15: case "end": return _context3.stop(); } } }, _callee3); })); function onClick() { return _onClick.apply(this, arguments); } return onClick; }(), children: $l('Table', 'query_button') }; case TableButtonType["export"]: return undefined; case TableButtonType.expandAll: return undefined; case TableButtonType.collapseAll: return undefined; default: } }, []); var getButtons = useCallback(function (buttonsArr) { var children = []; var buttons = buttonsArr || tableBtns; if (buttons) { var tableButtonProps = getConfig('tableButtonProps'); var _buttonsArr = buttons.slice(0, buttonsLimit); _buttonsArr.forEach(function (button) { var props = {}; if (isArrayLike(button)) { props = button[1] || {}; button = button[0]; } if (isString(button) && button in TableButtonType) { var _props3 = props, afterClick = _props3.afterClick, buttonProps = _objectWithoutProperties(_props3, _excluded2); var defaultButtonProps = getButtonProps(button); if (defaultButtonProps) { if (afterClick) { var onClick = defaultButtonProps.onClick; defaultButtonProps.onClick = /*#__PURE__*/function () { var _ref4 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee4(e) { return _regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: e.persist(); _context4.prev = 1; _context4.next = 4; return onClick(e); case 4: _context4.prev = 4; afterClick(e); return _context4.finish(4); case 7: case "end": return _context4.stop(); } } }, _callee4, null, [[1,, 4, 7]]); })); return function (_x2) { return _ref4.apply(this, arguments); }; }(); } children.push( /*#__PURE__*/React.createElement(Button, _extends({ key: button }, tableButtonProps, defaultButtonProps, buttonProps))); } } else if ( /*#__PURE__*/isValidElement(button)) { children.push( /*#__PURE__*/cloneElement(button, _objectSpread(_objectSpread({}, tableButtonProps), button.props))); } else if (isObject(button)) { children.push( /*#__PURE__*/React.createElement(Button, _extends({}, tableButtonProps, button))); } }); if (buttonsLimit && buttons.length > buttonsLimit) { var moreButton = getMoreButton(buttonsLimit); children.push(moreButton); } } return children; }, [tableBtns, cardDS]); var getCustomizationIcon = function getCustomizationIcon() { var _customizedDS$current2; // 是否存在切换面板按钮 var hasButtons = buttons && buttons.length; // 是否存在视图按钮控制 var shouldRenderTableBtns = !isFunction(renderButtons); var tableButtons = getButtons(); var mergeButtons = buttons && buttons.length ? _toConsumableArray(buttons) : []; if (hasButtons) { var _customizedDS$current; if (shouldRenderTableBtns) { mergeButtons.push(tableButtons); } else { var getBtns = getButtons(renderButtons({ viewMode: ViewMode.card, dataSet: cardDS, buttons: tableButtons })); mergeButtons.push(getBtns); } mergeButtons.unshift( /*#__PURE__*/React.createElement(Button, { className: "".concat(prefixCls, "-hover-button"), funcType: FuncType.flat, color: ButtonColor.primary, hidden: ((_customizedDS$current = customizedDS.current) === null || _customizedDS$current === void 0 ? void 0 : _customizedDS$current.get(ViewField.id)) === '__DEFAULT__', icon: "settings-o", onClick: openCustomizationModal })); return mergeButtons; } var buttonRenderer = [/*#__PURE__*/React.createElement(Button, { key: "settings", className: "".concat(prefixCls, "-hover-button"), funcType: FuncType.flat, color: ButtonColor.primary, icon: "settings-o", hidden: ((_customizedDS$current2 = customizedDS.current) === null || _customizedDS$current2 === void 0 ? void 0 : _customizedDS$current2.get(ViewField.id)) === '__DEFAULT__', onClick: openCustomizationModal })]; if (shouldRenderTableBtns) { buttonRenderer.unshift(tableBtns); } else { buttonRenderer.unshift(renderButtons({ viewMode: ViewMode.card, dataSet: cardDS, buttons: tableBtns })); } return buttonRenderer; }; var handleResize = useCallback(function (_width, height) { if (height > cardHeight) { setCardHeight(height + 1); } }, [cardHeight]); useEffect(function () { setCardHeight(0); }, [customizedDS.current]); return /*#__PURE__*/React.createElement("div", { style: { height: '100%' } }, cardDS && cardDS.queryDataSet ? /*#__PURE__*/React.createElement(TableDynamicFilterBar, _extends({}, queryBarProps, { dataSet: cardDS, queryDataSet: cardDS.queryDataSet, queryFields: getQueryFields(), buttons: getCustomizationIcon() })) : getCustomizationIcon(), /*#__PURE__*/React.createElement("div", { className: cls }, /*#__PURE__*/React.createElement(List // @ts-ignore , { // @ts-ignore style: { height: viewProps && viewProps.viewHeight || 366, overflowX: 'hidden', overflowY: 'auto' }, grid: { gutter: 16, column: 24 / customizedDS.current.get(ViewField.cardWidth) || 4 }, dataSet: cardDS, pagination: !!cardDS.paging, renderItem: function renderItem(_ref5) { var record = _ref5.record; return /*#__PURE__*/React.createElement(List.Item, { key: "".concat(record.id, "-card"), className: "".concat(prefixCls, "-card-container") }, /*#__PURE__*/React.createElement(ReactResizeObserver, { resizeProp: "height", onResize: handleResize, immediately: true }, /*#__PURE__*/React.createElement(Card, _extends({ key: "".concat(record.id, "-card-content") }, cardProps, { selected: record.isSelected, style: _objectSpread(_objectSpread({}, cardProps.style), {}, { minHeight: cardHeight }), title: viewProps && viewProps.displayFields ? /*#__PURE__*/React.createElement(Typography.Paragraph, { ellipsis: { rows: 2, tooltip: /*#__PURE__*/React.createElement(Output, { name: viewProps.displayFields[0], record: record, renderer: displayFields.find(function (df) { return df.name === viewProps.displayFields[0]; }) ? displayFields.find(function (df) { return df.name === viewProps.displayFields[0]; }).renderer : noop }) }, name: viewProps.displayFields[0], record: record, renderer: displayFields.find(function (df) { return df.name === viewProps.displayFields[0]; }) ? displayFields.find(function (df) { return df.name === viewProps.displayFields[0]; }).renderer : noop }) : null, onClick: function onClick(e) { if (cardDS.selection) { if (record.isSelected) { cardDS.unSelect(record); } else { cardDS.select(record); } } if (isFunction(cardProps.onClick)) { cardProps.onClick(e, record); } }, onHeadClick: function onHeadClick(e) { if (isFunction(cardProps.onHeadClick)) { cardProps.onHeadClick(e, record); } }, extra: /*#__PURE__*/React.createElement(CardCommand, { command: command, dataSet: cardDS, record: record, renderCommand: renderCommand, prefixCls: prefixCls, viewMode: ViewMode.card, commandsLimit: commandsLimit }) }), viewProps && viewProps.displayFields ? viewProps.displayFields.map(function (fieldName) { return /*#__PURE__*/React.createElement("div", { key: "".concat(fieldName, "-card-label"), className: "".concat(prefixCls, "-quote-content-item") }, /*#__PURE__*/React.createElement("span", { className: "".concat(prefixCls, "-quote-content-label"), hidden: !viewProps.showLabel }, record.getField(fieldName).get('label')), /*#__PURE__*/React.createElement(Typography.Text, { ellipsis: { tooltip: true }, name: fieldName, record: record, renderer: displayFields.find(function (df) { return df.name === fieldName; }) ? displayFields.find(function (df) { return df.name === fieldName; }).renderer : noop })); }) : null))); } }))); }; CardContent.defaultProps = { animated: true }; CardContent.displayName = 'CardContent'; export default observer(CardContent); //# sourceMappingURL=CardContent.js.map