UNPKG

choerodon-ui

Version:

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

459 lines (401 loc) 16.7 kB
import _extends from "@babel/runtime/helpers/extends"; import _objectSpread from "@babel/runtime/helpers/objectSpread2"; import _classCallCheck from "@babel/runtime/helpers/classCallCheck"; import _createClass from "@babel/runtime/helpers/createClass"; import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized"; import _inherits from "@babel/runtime/helpers/inherits"; import _createSuper from "@babel/runtime/helpers/createSuper"; import { __decorate } from "tslib"; import React, { Component } from 'react'; import classNames from 'classnames'; import { action, toJS } from 'mobx'; import isPromise from 'is-promise'; import noop from 'lodash/noop'; import debounce from 'lodash/debounce'; import KeyCode from '../../../es/_util/KeyCode'; import { math } from 'choerodon-ui/dataset'; import ConfigContext from '../../../es/config-provider/ConfigContext'; import Table from '../table/Table'; import TableProfessionalBar from '../table/query-bar/TableProfessionalBar'; import { SelectionMode, TableMode, TableQueryBarType } from '../table/enum'; import { DataSetEvents, DataSetSelection } from '../data-set/enum'; import autobind from '../_util/autobind'; import { getColumnKey } from '../table/utils'; import SelectionList, { SelectionsPosition } from './SelectionList'; import { TriggerViewMode } from '../trigger-field/TriggerField'; import Picture from '../picture'; import ObserverNumberField from '../number-field'; var LovView = /*#__PURE__*/function (_Component) { _inherits(LovView, _Component); var _super = _createSuper(LovView); function LovView() { var _this; _classCallCheck(this, LovView); _this = _super.apply(this, arguments); _this.resizedColumns = new Map(); _this.handleSelect = debounce(function (event) { var _assertThisInitialize = _assertThisInitialized(_this), selectionMode = _assertThisInitialize.selectionMode; var _this$props = _this.props, _this$props$onBeforeS = _this$props.onBeforeSelect, onBeforeSelect = _this$props$onBeforeS === void 0 ? noop : _this$props$onBeforeS, multiple = _this$props.multiple, dataSet = _this$props.dataSet, tableProps = _this$props.tableProps; var records = selectionMode === SelectionMode.treebox ? dataSet.treeSelected : selectionMode === SelectionMode.rowbox || multiple ? dataSet.selected : dataSet.current ? [dataSet.current] : []; // 满足单选模式下,双击和勾选框选中均支持 if (tableProps && tableProps.alwaysShowRowBox && !event) { records = dataSet.selected; } var record = multiple ? records : records[0]; var beforeSelect = onBeforeSelect(record); if (isPromise(beforeSelect)) { return beforeSelect.then(function (result) { if (result !== false) { _this.closeModal(record); } }); } if (beforeSelect !== false) { _this.closeModal(record); } return false; }, 300); return _this; } _createClass(LovView, [{ key: "componentWillMount", value: function componentWillMount() { var _this$props2 = this.props, dataSet = _this$props2.dataSet, selection = _this$props2.dataSet.selection, multiple = _this$props2.multiple, viewMode = _this$props2.viewMode; this.selection = selection; dataSet.selection = multiple ? DataSetSelection.multiple : DataSetSelection.single; if (viewMode === TriggerViewMode.popup && multiple) { dataSet.addEventListener(DataSetEvents.batchSelect, this.handleSelect); dataSet.addEventListener(DataSetEvents.batchUnSelect, this.handleSelect); } } }, { key: "componentWillUnmount", value: function componentWillUnmount() { var _this$props3 = this.props, dataSet = _this$props3.dataSet, multiple = _this$props3.multiple, viewMode = _this$props3.viewMode; dataSet.selection = this.selection; if (viewMode === TriggerViewMode.popup && multiple) { dataSet.removeEventListener(DataSetEvents.batchSelect, this.handleSelect); dataSet.removeEventListener(DataSetEvents.batchUnSelect, this.handleSelect); } } }, { key: "shouldComponentUpdate", value: function shouldComponentUpdate(nextProps) { var viewMode = this.props.viewMode; if (viewMode === TriggerViewMode.popup && nextProps.popupHidden) { return false; } return true; } /* istanbul ignore next */ }, { key: "getColumns", value: function getColumns() { var _this2 = this; var _this$props4 = this.props, lovItems = _this$props4.config.lovItems, tableProps = _this$props4.tableProps, viewMode = _this$props4.viewMode; return lovItems ? lovItems.filter(function (_ref) { var gridField = _ref.gridField; return gridField === 'Y'; }).sort(function (_ref2, _ref3) { var seq1 = _ref2.gridFieldSequence; var seq2 = _ref3.gridFieldSequence; return seq1 - seq2; }).map(function (_ref4) { var display = _ref4.display, gridFieldName = _ref4.gridFieldName, gridFieldWidth = _ref4.gridFieldWidth, gridFieldAlign = _ref4.gridFieldAlign, gridFieldType = _ref4.gridFieldType; var column = {}; if (tableProps && tableProps.columns) { column = tableProps.columns.find(function (c) { return c.name === gridFieldName; }); } // 渲染 lov 中的 超链接 和 图片类型字段 column = column || {}; if (gridFieldType && gridFieldType.toLowerCase() === 'href') { column.renderer = function (_ref5) { var value = _ref5.value; return value ? /*#__PURE__*/React.createElement("a", { href: value, title: value, target: "_blank", rel: "noopener noreferrer" }, value) : undefined; }; } else if (gridFieldType && gridFieldType.toLowerCase() === 'picture') { column.renderer = function (_ref6) { var value = _ref6.value; return value ? /*#__PURE__*/React.createElement(Picture, { src: value, objectFit: "contain", height: "inherit", block: false }) : undefined; }; } else if (gridFieldType && gridFieldType.toLowerCase() === 'percent') { column.renderer = function (_ref7) { var value = _ref7.value; return value ? "".concat(math.multipliedBy(value, 100), "%") : value; }; } return _objectSpread(_objectSpread({}, column), {}, { key: gridFieldName, header: display, name: gridFieldName, width: viewMode === TriggerViewMode.popup ? gridFieldName ? _this2.resizedColumns.get(gridFieldName) : undefined : gridFieldWidth, align: gridFieldAlign, editor: false }); }) : undefined; } }, { key: "closeModal", value: function closeModal(record) { if (record) { var _this$props5 = this.props, onSelect = _this$props5.onSelect, modal = _this$props5.modal; if (modal) { modal.close(); } onSelect(record); } } /* istanbul ignore next */ }, { key: "handleKeyDown", value: function handleKeyDown(e) { if (e.keyCode === KeyCode.ENTER) { this.handleSelect(); } } /** * 单选 onRow 处理 * @param props */ }, { key: "handleRow", value: function handleRow(props) { var tableProps = this.props.tableProps; if (tableProps) { var onRow = tableProps.onRow; if (onRow) { return _objectSpread({ onDoubleClick: this.handleSelect }, onRow(props)); } } return { onDoubleClick: this.handleSelect }; } }, { key: "handleSingleRow", value: function handleSingleRow(props) { var tableProps = this.props.tableProps; if (tableProps) { var onRow = tableProps.onRow; if (onRow) { return _objectSpread({ onClick: this.handleSelect }, onRow(props)); } } return { onClick: this.handleSelect }; } }, { key: "handleColumnResize", value: function handleColumnResize(props) { var width = props.width, column = props.column; this.resizedColumns.set(getColumnKey(column), width); } }, { key: "renderTable", value: function renderTable() { var _this$props6 = this.props, dataSet = _this$props6.dataSet, _this$props6$config = _this$props6.config, queryBar = _this$props6$config.queryBar, height = _this$props6$config.height, treeFlag = _this$props6$config.treeFlag, queryColumns = _this$props6$config.queryColumns, _this$props6$config$t = _this$props6$config.tableProps, configTableProps = _this$props6$config$t === void 0 ? {} : _this$props6$config$t, lovItems = _this$props6$config.lovItems, multiple = _this$props6.multiple, tableProps = _this$props6.tableProps, viewMode = _this$props6.viewMode, context = _this$props6.context, showSelectedInView = _this$props6.showSelectedInView; var getConfig = context.getConfig; var columns = this.getColumns(); var popup = viewMode === TriggerViewMode.popup; var modal = viewMode === TriggerViewMode.modal; var drawer = viewMode === TriggerViewMode.drawer; var percentItems = {}; if (lovItems) { lovItems.filter(function (x) { return x.gridFieldType && x.gridFieldType.toLowerCase() === 'percent' && x.conditionField === 'Y'; }).forEach(function (x) { percentItems[x.gridFieldName] = /*#__PURE__*/React.createElement(ObserverNumberField, { suffix: /*#__PURE__*/React.createElement("span", null, "%") }); }); } var lovTableProps = _objectSpread(_objectSpread(_objectSpread({ autoFocus: true, mode: treeFlag === 'Y' ? TableMode.tree : TableMode.list, onKeyDown: this.handleKeyDown, dataSet: dataSet, columns: columns, queryFieldsLimit: queryColumns, queryBar: queryBar || getConfig('lovQueryBar') || getConfig('queryBar'), selectionMode: SelectionMode.none }, configTableProps), tableProps), {}, { queryFields: _objectSpread(_objectSpread({}, tableProps && tableProps.queryFields), percentItems), className: classNames(configTableProps && configTableProps.className, tableProps && tableProps.className), style: _objectSpread(_objectSpread({}, configTableProps && configTableProps.style), {}, { height: height }, tableProps && tableProps.style), queryBarProps: _objectSpread(_objectSpread(_objectSpread({}, tableProps && tableProps.queryBarProps), configTableProps && configTableProps.queryBarProps), getConfig('lovQueryBarProps')) }); if (multiple) { if (popup || !tableProps || !tableProps.selectionMode) { if (lovTableProps.mode === TableMode.tree) { lovTableProps.selectionMode = SelectionMode.treebox; } else { lovTableProps.selectionMode = SelectionMode.rowbox; } } if (lovTableProps.selectionMode !== SelectionMode.rowbox && lovTableProps.selectionMode !== SelectionMode.treebox) { lovTableProps.highLightRow = false; lovTableProps.selectedHighLightRow = true; } } else if (popup) { lovTableProps.onRow = this.handleSingleRow; } else if (lovTableProps.selectionMode !== SelectionMode.rowbox) { lovTableProps.onRow = this.handleRow; } else { lovTableProps.highLightRow = false; lovTableProps.selectedHighLightRow = true; } if (popup) { if (lovTableProps.showSelectionCachedButton === undefined) { lovTableProps.showSelectionCachedButton = false; lovTableProps.showCachedSelection = true; } lovTableProps.autoFocus = false; lovTableProps.autoWidth = 'autoWidth' in lovTableProps ? lovTableProps.autoWidth : true; lovTableProps.onColumnResize = this.handleColumnResize; } var isProfessionalBar = lovTableProps.queryBar === TableQueryBarType.professionalBar; if (!popup && !lovTableProps.queryBar && isProfessionalBar) { lovTableProps.queryBar = function (props) { return /*#__PURE__*/React.createElement(TableProfessionalBar, _extends({}, props)); }; } if ((modal || drawer) && showSelectedInView) { lovTableProps.showSelectionTips = false; } this.selectionMode = lovTableProps.selectionMode; return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Table, _extends({}, lovTableProps)), modal && this.renderSelectionList()); } }, { key: "renderSelectionList", value: function renderSelectionList() { var _this$props7 = this.props, dataSet = _this$props7.dataSet, _this$props7$valueFie = _this$props7.valueField, valueField = _this$props7$valueFie === void 0 ? '' : _this$props7$valueFie, _this$props7$textFiel = _this$props7.textField, textField = _this$props7$textFiel === void 0 ? '' : _this$props7$textFiel, _this$props7$config = _this$props7.config, treeFlag = _this$props7$config.treeFlag, configTableProps = _this$props7$config.tableProps, tableProps = _this$props7.tableProps, multiple = _this$props7.multiple, viewMode = _this$props7.viewMode, showSelectedInView = _this$props7.showSelectedInView, getSelectionProps = _this$props7.getSelectionProps, context = _this$props7.context; if (!showSelectedInView || !multiple) { return null; } if (!this.selectionMode) { var selectionMode = tableProps && tableProps.selectionMode || configTableProps && configTableProps.selectionMode; if (!selectionMode) { this.selectionMode = treeFlag === 'Y' ? SelectionMode.treebox : SelectionMode.rowbox; } else { this.selectionMode = selectionMode; } } var selectionsPosition = viewMode === TriggerViewMode.drawer ? SelectionsPosition.side : viewMode === TriggerViewMode.modal ? SelectionsPosition.below : undefined; return /*#__PURE__*/React.createElement(SelectionList, { dataSet: dataSet, treeFlag: treeFlag, valueField: valueField, textField: textField, selectionsPosition: selectionsPosition, selectionProps: getSelectionProps && getSelectionProps(), context: context }); } }, { key: "render", value: function render() { var _this$props8 = this.props, modal = _this$props8.modal, viewRenderer = _this$props8.viewRenderer, dataSet = _this$props8.dataSet, viewMode = _this$props8.viewMode, lovConfig = _this$props8.config, textField = _this$props8.textField, valueField = _this$props8.valueField, multiple = _this$props8.multiple; if (modal) { modal.handleOk(this.handleSelect); } return /*#__PURE__*/React.createElement(React.Fragment, null, viewMode === TriggerViewMode.drawer && this.renderSelectionList(), /*#__PURE__*/React.createElement("div", null, viewRenderer ? toJS(viewRenderer({ dataSet: dataSet, lovConfig: lovConfig, textField: textField, valueField: valueField, multiple: multiple, modal: modal })) : this.renderTable())); } }], [{ key: "contextType", get: function get() { return ConfigContext; } }]); return LovView; }(Component); export { LovView as default }; __decorate([action], LovView.prototype, "componentWillMount", null); __decorate([action], LovView.prototype, "componentWillUnmount", null); __decorate([autobind], LovView.prototype, "handleKeyDown", null); __decorate([autobind], LovView.prototype, "handleRow", null); __decorate([autobind], LovView.prototype, "handleSingleRow", null); __decorate([autobind], LovView.prototype, "handleColumnResize", null); //# sourceMappingURL=LovView.js.map