diff --git a/components/DataView/_selfColumn.js b/components/DataView/_selfColumn.js new file mode 100644 index 0000000000000000000000000000000000000000..587380ac4c16eee8894bcc25ffc0288686b02f80 --- /dev/null +++ b/components/DataView/_selfColumn.js @@ -0,0 +1,365 @@ +/* eslint-disable */ +import styles from './index.less'; +import { contractCategory } from '@/utils/enumNo2'; +import { FEE_APPLY_TYPE_LIST, CONTRACT_ARCHIVE_STATUS, PROJECT_TYPE } from '@/utils/enum'; +import { getOptionName, thousandSeparatorFixed } from '@/utils/utils'; +import { renderTxt, renderPopTable } from '@/utils/hoverPopover'; +import AuthButton from '@/components/AuthButton'; +import BIButton from '@/ant_components/BIButton'; + +function getColor(id) { + // 1:待审批 2:审批中 3:审批通过 4:审批未通过 5:审批撤销 6 审批流程启动失败 + switch (id) { + case 1: + case 2: + return '#FFB63E'; + case 3: + return '#04B4AD'; + case 4: + return '#EC6D68'; + case 5: + return '#8C97A3'; + default: + return '#848F9B'; + } +} + +// 获取table列表头 +export function columnsFn(props) { + const columns = [ + { + title: '序列', + dataIndex: 'index', + align: 'center', + render: (...argu) => { + return argu[2] + 1; + }, + width: 50, + }, + { + title: '项目名称', + dataIndex: 'contractProjectName', + render: (text) => { + return text && renderTxt(text); + }, + width: 110, + }, + { + title: '项目类型', + dataIndex: 'contractProjectType', + render: (text) => { + return text && getOptionName(PROJECT_TYPE, text); + }, + width: 60, + }, + { + title: '客户名称', + dataIndex: 'customers', + width: 110, + render: (text) => { + return text && renderTxt(text); + }, + }, + { + title: '合同名称', + dataIndex: 'contractName', + width: 110, + render: (text) => { + return text && renderTxt(text); + }, + }, + { + title: '艺人/博主', + dataIndex: 'talents', + render: (text) => { + return text && renderTxt(text); + }, + width: 110, + }, + { + title: '合同总金额', + dataIndex: 'contractMoneyTotal', + render: (text) => { + return `${thousandSeparatorFixed(text)}元`; + }, + width: 110, + }, + { + title: '执行进度', + dataIndex: 'contractProgress', + width: 90, + render: (text, record) => { + const content = (text && `${(text * 100).toFixed(2)}%`) || '0.00%'; + const contractAppointmentList = (record.contractAppointmentList || []).map((item, index) => { + return { + ...item, + index, + }; + }); + const column = [ + { + title: '艺人/博主', + dataIndex: 'contractAppointmentTalentName', + render: (text) => { + return text && renderTxt(text); + }, + width: 100, + className: styles.columnHeader, + }, + { + title: '执行进度', + className: styles.columnHeader, + dataIndex: 'contractAppointmentProgress', + render: (word) => { + return (word && `${(word * 100).toFixed(2)}%`) || '0.00%'; + }, + width: 80, + }, + { + title: '进度更新时间', + className: styles.columnHeader, + dataIndex: 'contractAppointmentCreatedAt', + render: (text) => { + return text && text.slice(0, 10); + }, + width: 100, + }, + ]; + return renderPopTable(content, column, contractAppointmentList, styles.tableClass); + }, + }, + { + title: '开票进度', + dataIndex: 'invoiceMoney', + width: 110, + render: (text, record) => { + const result = text ? text.split('/') : [0, 0]; + const left = Number(result[0]) === 0 ? 0 : thousandSeparatorFixed(result[0]); + const right = Number(result[1]) === 0 ? 0 : thousandSeparatorFixed(result[1]); + const content = `${left === 'null' ? 0 : left}/${right === 'null' ? 0 : right}`; + const contractInvoiceList = (record.contractInvoiceList || []).map((item, index) => { + return { + ...item, + index, + }; + }); + const column = [ + { + title: '开票金额', + dataIndex: 'contractInvoiceMoney', + render: (word) => { + return word && thousandSeparatorFixed(word); + }, + className: styles.columnHeader, + width: 120, + }, + { + title: '开票时间', + className: styles.columnHeader, + dataIndex: 'contractInvoiceDate', + render: (text) => { + return text && text.slice(0, 10); + }, + width: 100, + }, + ]; + return renderPopTable(content, column, contractInvoiceList, styles.tableClass); + }, + }, + { + title: '回款进度', + dataIndex: 'returnMoney', + width: 110, + render: (text, record) => { + const result = text ? text.split('/') : [0, 0]; + const left = Number(result[0]) === 0 ? 0 : thousandSeparatorFixed(result[0]); + const right = Number(result[1]) === 0 ? 0 : thousandSeparatorFixed(result[1]); + const content = `${left === 'null' ? 0 : left}/${right === 'null' ? 0 : right}`; + const contractReturnList = (record.contractReturnList || []).map((item, index) => { + return { ...item, index }; + }); + const column = [ + { + title: '回款金额', + className: styles.columnHeader, + dataIndex: 'contractReturnMoney', + render: (word) => { + return word && thousandSeparatorFixed(word); + }, + width: 120, + }, + { + title: '回款时间', + className: styles.columnHeader, + dataIndex: 'contractReturnDate', + render: (text) => { + return text && text.slice(0, 10); + }, + width: 100, + }, + ]; + return renderPopTable(content, column, contractReturnList, styles.tableClass); + }, + }, + { + title: '费用确认进度', + dataIndex: 'feeConfirmProgress', + width: 110, + render: (text, record) => { + const result = text ? text.split('/') : [0, 0]; + const left = result[0]; + const right = result[1]; + const content = `${left === 'null' ? 0 : left}/${right === 'null' ? 0 : right}`; + const disabled = content === '0/0' || Number(result[1]) === 0; // textDecoration: 'underline' + const style = disabled ? {} : { textDecoration: 'underline' }; + return ( + { + return props.goProgress(record.contractId); + }} + > + {content} + + ); + }, + }, + { + title: '累计报销金额', + dataIndex: 'accumulatedReimbursementMoney', + width: 110, + render: (text, record) => { + const disabled = !( + AuthButton.checkPathname('/foreEnd/business/project/contract/detail/cost') && + record.contractApprovalStatus === 3 + ); + const style = disabled ? {} : { textDecoration: 'underline' }; + return ( + { + return props.checkFeeData(record.contractId); + }} + > + {(text && thousandSeparatorFixed(text)) || 0} + + ); + }, + }, + { + title: '结算进度', + dataIndex: 'settlementProgress', + width: 100, + render: (text, record) => { + const result = text ? text.split('/') : [0, 0]; + const left = Number(result[0]) === 0 ? 0 : thousandSeparatorFixed(result[0]); + const right = Number(result[1]) === 0 ? 0 : thousandSeparatorFixed(result[1]); + const content = `${left === 'null' ? 0 : left}/${right === 'null' ? 0 : right}`; + const disabled = !( + AuthButton.checkPathname('/foreEnd/business/project/contract/detail/settle') && + record.contractApprovalStatus === 3 + ); + const style = disabled ? {} : { textDecoration: 'underline' }; + return ( + { + return props.checkAccountData(record.contractId); + }} + > + {content} + + ); + }, + }, + { + title: '签约日期', + dataIndex: 'contractSigningDate', + render: (text) => { + return text && text.slice(0, 10); + }, + width: 90, + }, + { + title: '主子合同', + dataIndex: 'contractCategory', + render: (text) => { + return getOptionName(contractCategory, text); + }, + width: 70, + }, + { + title: '审批状态', + dataIndex: 'contractApprovalStatus', + render: (text) => { + return {getOptionName(FEE_APPLY_TYPE_LIST, text)}; + }, + width: 70, + }, + { + title: '归档状态', + dataIndex: 'contractArchiveStatus', + render: (text) => { + return ( + + {getOptionName(CONTRACT_ARCHIVE_STATUS, text)} + + ); + }, + width: 70, + }, + { + title: '操作', + dataIndex: 'operate', + width: 90, + render: (text, record) => { + const { contractCategory, contractApprovalStatus, contractIsVirtual } = record; + return ( +
+ + {Number(contractCategory) === 0 && + Number(contractApprovalStatus) === 3 && + Number(contractIsVirtual) !== 1 ? ( + { + return props.addChildContract(record.contractId); + }} + > + {' '} + 创建子合同 + + ) : null} + + + { + return props.editData(record.contractId, 1); + }} + > + {' '} + 编辑 + + + + { + return props.checkData(record.contractId); + }} + > + {' '} + 查看 + + +
+ ); + }, + }, + ]; + return columns || []; +} diff --git a/components/DataView/index.js b/components/DataView/index.js index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..f76066a3566ea35949b6138d5bd70f3d59d71776 100644 --- a/components/DataView/index.js +++ b/components/DataView/index.js @@ -0,0 +1,804 @@ +/* eslint-disable */ +// 库/框架 +import React, { Component } from 'react'; +// 组件 +import { Modal, message } from 'antd'; +import _ from 'lodash'; +import moment from 'moment'; +import SearchView from '@/components/SearchView'; +import FormFilterBtn from '@/components/form-FilterButton2'; +import SelfPagination from '@/components/SelfPagination'; +import BITable from '@/ant_components/BITable'; +import BIButton from '@/ant_components/BIButton'; +import ButtonAuth from '@/components/AuthButton'; +import IconFont from '@/components/CustomIcon/IconFont'; + +// 样式 +import s from './index.less'; +// 工具 +import antiAssign from '@/utils/anti-assign'; +import { DATE_FORMAT, PAGINATION } from '@/utils/constants'; +import BISpin from '@/ant_components/BISpin'; +import { getSift } from '@/services/comment'; +import { getOptionName, replacePageNum } from '@/utils/utils'; +import { SIFT_TYPE } from '@/utils/enum'; +import storage from '@/utils/storage'; /* eslint-disable react/sort-comp */ // 关闭下划线变量检测 // 关闭方法排序检测 // 多维数组降维成一维数组 + +/* eslint-disable no-underscore-dangle */ +function reduceDimension(arr) { + return Array.prototype.concat.apply([], arr); +} + +// userTree/orgTree数据转成{id,name} +function formatUser(obj) { + let name = obj.label; + if (typeof name !== 'string') { + name = obj.label.props.children; + } + return { id: obj.value, name }; +} + +// associationSearch数据转成{id,name} +function formatAssociationSearch(obj) { + if (Array.isArray(obj) && obj.length > 0) { + return obj.map((item) => { + return { id: item.value, name: item.label }; + }); + } + return { id: obj.value, name: obj.label }; +} + +// id数组转成{id,name} +function formatArr(arr, options) { + const temp = []; + arr.map((key) => { + temp.push({ + id: key, + name: ( + options.find((item) => { + return String(item.id) === String(key); + }) || {} + ).name, + }); + }); + return temp; +} + +// radio转换 +function formatRadioArr(key, options) { + const temp = []; + options.map((item) => { + if (Number(item.id) === Number(key)) { + temp.push({ + id: Number(item.id), + name: item.name, + }); + } + }); + return temp; +} + +// 日期数组转成{id,name} +function formatDateRange(arr) { + const temp = []; + arr.map((date, index) => { + temp.push({ id: index, name: moment(date).format(DATE_FORMAT) }); + }); + return temp; +} + +// 日期数组转成{id,name} +function formatDateTimeRange(arr) { + const temp = []; + arr.map((date, index) => { + temp.push({ id: index, name: moment(date).format('YYYY-MM-DD hh:mm:ss') }); + }); + return temp; +} + +// 日期转成{id,name} +function formatDate(date) { + return { id: undefined, name: moment(date).format('YYYY-MM-DD') }; +} + +// 转换成区间 +function formarRange(data) { + return Object.keys(data) + .map((item) => { + return { + id: item, + name: data[item], + }; + }) + .filter((item) => { + return item.name && item.name !== data.type; + }); +} + +// 日期区间格式化(时间部分为00:00:00-23:59:59) +function changeDateRange(props, changedValues, allValues) { + const key = Object.keys(changedValues)[0]; + const cols = reduceDimension(props.searchCols); + const col = cols.find((item) => { + return item.key === key; + }); + if (col && col.type === 'daterange' && Array.isArray(changedValues[key]) && changedValues[key].length > 0) { + if (changedValues[key].length === 1) { + allValues[key] = [moment(moment(changedValues[key][0]).format('YYYY-MM-DD 00:00:00'))]; + } else { + allValues[key] = [ + moment(moment(changedValues[key][0]).format('YYYY-MM-DD 00:00:00')), + moment(moment(changedValues[key][1]).format('YYYY-MM-DD 23:59:59')), + ]; + } + } + return allValues; +} + +function formatSelect(val, options) { + if (Array.isArray(val) && val.length > 0) { + return val.map((item) => { + return { + id: item, + name: options.find((cItem) => { + return cItem.id === item; + }).name, + }; + }); + } + if (Array.isArray(val) && val.length === 0) { + return []; + } + return { + id: val, + name: options.find((item) => { + return item.id === val; + }).name, + }; +} + +function formatForm(formData, searchCols) { + const cols = reduceDimension(searchCols); + const result = []; + Object.keys(formData).map((key) => { + if (!formData[key]) { + return; + } + const col = cols.find((item) => { + return item.key === key; + }); + if (col === undefined) return; + let value; + switch (col.type) { + case 'radio': + value = formatRadioArr(formData[key], col.options); + break; + case 'checkbox': + value = formatArr(formData[key], col.options); + break; + case 'usertree': + break; + case 'orgtree': + value = formatUser(formData[key]); + break; + case 'associationSearch': + value = formatAssociationSearch(formData[key]); + break; + case 'daterange': + value = formatDateRange(formData[key]); + break; + case 'daterangetime': + value = formatDateTimeRange(formData[key]); + break; + case 'date': + value = formatDate(formData[key]); + break; + case 'associationSearchFilter': + value = formatAssociationSearch(formData[key]); + break; + case 'numberRange': + value = formarRange(formData[key]); + break; + case 'select': + value = formatSelect(formData[key], col.options); + break; + case 'tag': + let tagVal = {}; + const tagTreeSelect = (val, options) => { + options.forEach((item) => { + if (item.value === val) { + tagVal = { id: item.id, name: item.title }; + } else if (item.children && item.children.length) { + tagTreeSelect(val, item.children); + } + }); + return tagVal; + }; + value = tagTreeSelect(formData[key], col.componentAttr.treeData, tagVal); + break; + default: + value = formData[key]; + break; + } + result.push({ key, value }); + }); + return result; +} + +function removeItem(formData, removedItem) { + const data = _.assign({}, formData); + const item = data[removedItem.key]; + if (item.type === 'numberRange') { + const clearObj = {}; + clearObj[removedItem.id] = undefined; + const newObj = { ...data[removedItem.key], ...clearObj }; + data[removedItem.key] = newObj; + } else if (Array.isArray(item)) { + if (moment.isMoment(item[0])) { + data[removedItem.key] = undefined; + // item.splice(removeItem.id, 1); + } else { + const index = item.findIndex((t) => { + return t.key || t.value + ? String(t.key) === String(removedItem.id) || String(t.value) === String(removedItem.id) + : String(t) === String(removedItem.id); + }); + if (index > -1) { + item.splice(index, 1); + } + } + } else { + data[removedItem.key] = undefined; + } + return data; +} + +// 基础数据视图 +export default class DataView extends Component { + constructor(props) { + super(props); + const { + pageData: { list, page }, + pagination, + } = props; + this.state = { + searchForm: this.getDefaultSift(), + pagination: { + showTotal: (total) => { + return `共${total}条`; + }, + pageSize: (pagination && pagination.pageSize) || PAGINATION.pageSize, + total: (page && page.total) || PAGINATION.total, + current: (page && page.current) || PAGINATION.current, + onChange: (nextPage) => { + this.fetchPage(nextPage); + this.fetch(); + window.history.replaceState({ pageNum: nextPage }, '', `?pageNum=${nextPage}`); + }, + onShowSizeChange: this.fetchPageSize, + showQuickJumper: true, + }, + data: { + origin: list || [], + view: { + selectedData: [], + selectedDataKeys: [], + }, + }, + loading: false, + siftDataArr: [], // 快捷筛选数据列表 + currentSiftNum: 0, + }; + } + + componentWillMount() { + // this.getDefaultSift(); + } + + componentDidMount() { + this.getSiftData(); + replacePageNum('pageNum', this.state.current, this.fetchPage); // 当url里面有pageNum参数时,获取url里面的参数进行请求 + } + + componentWillReceiveProps(nextProps) { + if (JSON.stringify(this.props.pageData) !== JSON.stringify(nextProps.pageData)) { + const { pagination, data } = this.state; + const { + pageData: { list, page }, + } = nextProps; + const newPage = + page.total > 0 + ? { + current: page.pageNum, + total: page.total, + } + : { + current: PAGINATION.current, + total: PAGINATION.total, + }; + const newData = _.assign({}, data, { origin: list }); + this.setState({ + pagination: _.assign({}, pagination, newPage), + data: newData, + }); + } + const { loading } = nextProps; + this.setState({ + loading: loading || false, + }); + } + + getDefaultSetSift() { + if (Array.isArray(this.props.searchCols)) { + const newData = {}; + this.props.searchCols.map((item) => { + item.map((col) => { + if (col.defaultValue) newData[col.key] = col.defaultValue; + }); + }); + return newData; + } + } + + getDefaultSift() { + const storageItem = storage.getItem(`businessType-${getOptionName(SIFT_TYPE, window.location.pathname)}`); + const siftStorage = this.rebackDate(storageItem) || {}; + let result = {}; + let status = false; + if (JSON.stringify(siftStorage) === '{}') { + result = this.getDefaultSetSift(); + } else { + // eslint-disable-next-line no-restricted-syntax + for (const key in siftStorage) { + // eslint-disable-next-line no-prototype-builtins + if (siftStorage.hasOwnProperty(key)) { + const element = siftStorage[key]; + if (Array.isArray(element) && element.length === 0) { + result = this.getDefaultSetSift(); + } else { + status = true; + } + } + } + } + if (status) { + result = siftStorage; + } + return result; + } + + async getSiftData() { + const res = await getSift({ + businessType: getOptionName(SIFT_TYPE, window.location.pathname), + }); + if (res && res.success === true) { + const data = res.data || {}; + const siftData = data.queryLabelList || []; + this.setState({ + siftDataArr: siftData, + }); + } else { + message.error(res && res.message); + } + } + + // eslint-disable-next-line react/sort-comp + _beforeFetch() { + const { searchForm, pagination } = this.state; + + return _.assign({}, searchForm, { + pageSize: pagination.pageSize, + pageNum: pagination.current, + }); + } + + _afterFetch(data, selectedData, selectedDataKeys) { + const { pagination } = this.state; + const newPagination = _.assign({}, pagination, data.page); + this.setState({ + pagination: newPagination, + data: { + origin: data.list, + view: { + selectedData: selectedData || [], + selectedDataKeys: selectedDataKeys || [], + }, + }, + }); + } + + _afterDel() { + this.fetch(); + message.success('操作成功'); + } + + fetch() { + const { beforeFetch, fetch, afterFetch } = this.props; + let onBeforeFetch = beforeFetch; + if (typeof onBeforeFetch !== 'function') { + onBeforeFetch = this._beforeFetch.bind(this); + } + let onAfterFetch = afterFetch; + if (typeof onAfterFetch !== 'function') { + onAfterFetch = this._afterFetch.bind(this); + } + storage.setItem( + `businessType-${getOptionName(SIFT_TYPE, window.location.pathname)}`, + this.changeData(this.state.searchForm), + ); + if (typeof fetch === 'function') { + fetch(onBeforeFetch, onAfterFetch); + } + } + + search() { + const { beforeSearch } = this.props; + window.history.replaceState({ pageNum: 1 }, '', `?pageNum=${1}`); + if (typeof beforeSearch === 'function') { + beforeSearch(); + } + this.state.pagination.current = 1; + this.fetch(); + } + + // 翻页功能 + fetchPage = (current) => { + this.state.pagination.current = current; + // this.fetch(); + }; + + // 改变页码功能 + fetchPageSize = (current, pageSize) => { + this.state.pagination.current = 1; + this.state.pagination.pageSize = pageSize; + this.fetch(); + }; + + del(label, onClick, type) { + label = typeof label === 'string' ? label : '删除'; + onClick = typeof onClick === 'function' ? onClick : null; + if (type === 'download') { + // onClick(); + return; + } + + const { + data: { + view: { selectedData }, + }, + } = this.state; + if (selectedData.length <= 0) { + message.error(`请选择要${label}的记录`); + return; + } + Modal.confirm({ + title: `确认${label}`, + content: `确认${label}选中的${selectedData.length}条记录`, + okText: '确认', + cancelText: '取消', + onOk: () => { + const { del, afterDel } = this.props; + let onAfterDel = afterDel; + if (typeof onAfterDel !== 'function') { + onAfterDel = this._afterDel.bind(this); + } + if (del === true && onClick) { + onClick(selectedData, onAfterDel); + } else if (typeof del === 'function') { + del(selectedData, onAfterDel); + } + }, + }); + } + + rebackDate = (data) => { + const reg = /^(\d{4})-(\d{2})-(\d{2})$/; + // eslint-disable-next-line no-restricted-syntax + for (const key in data) { + // eslint-disable-next-line no-prototype-builtins + if (data.hasOwnProperty(key)) { + if (Array.isArray(data[key])) { + data[key].map((item) => { + if (reg.test(item)) { + data[key][0] = moment(moment(data[key][0]).format('YYYY-MM-DD 00:00:00')); + data[key][1] = moment(moment(data[key][1]).format('YYYY-MM-DD 23:59:59')); + } + }); + } + } + } + return data; + }; + + changeSearchForm(index) { + // 点击筛选更新选中条件 + let result = {}; + if (index === 0) { + result = {}; + } else { + const siftDataArr = Array.isArray(this.state.siftDataArr) ? this.state.siftDataArr : []; + const obj = + siftDataArr.find((item) => { + return item.queryLabelId === index; + }) || {}; + try { + result = JSON.parse(obj.queryLabelValue); + result = this.rebackDate(result); + } catch (e) { + console.warn(e); + } + } + this.setState( + { + searchForm: result, + currentSiftNum: index, + }, + () => { + this.search(); + }, + ); + } + + changeData = (changeData) => { + const data = _.cloneDeep(changeData); + // eslint-disable-next-line no-restricted-syntax + for (const key in data) { + // eslint-disable-next-line no-prototype-builtins + if (data.hasOwnProperty(key)) { + if (Array.isArray(data[key])) { + data[key].map((item) => { + if (item instanceof moment) { + data[key][0] = moment(data[key][0]).format('YYYY-MM-DD'); + data[key][1] = moment(data[key][1]).format('YYYY-MM-DD'); + } + }); + } + } + } + return data; + }; + + // 更改查询条件 + _changeSearchForm = (props, changedValues, allValues) => { + const newData = changeDateRange(props, changedValues, allValues); + this.setState({ + searchForm: newData, + currentSiftNum: 0, + }); + }; + + // 渲染搜索栏 + _renderSearchForm = () => { + const { searchCols } = this.props; + const { searchForm } = this.state; + if (searchCols === null || searchCols.length <= 0) return null; + return ( + + ); + }; + + // 清空搜索条件 + _onReset = () => { + this.setState( + { + searchForm: {}, + }, + () => { + this.fetch(); + }, + ); + }; + + // 删除指定搜索条件 + _onRemoveItem = (values) => { + const { searchForm } = this.state; + const formData = removeItem(searchForm, values); + this.setState( + { + searchForm: formData, + currentSiftNum: 0, + }, + () => { + this.fetch(); + }, + ); + }; + + siftCallBack() { + // 更新自定义筛选标签 + this.getSiftData(); + } + + // 渲染查询条件按钮组件 + _renderFilterBtn = () => { + const { searchCols } = this.props; + const { searchForm, siftDataArr, currentSiftNum } = this.state; + if (searchCols === null || searchCols.length <= 0) return null; + const chooseItems = formatForm(searchForm, searchCols); + return ( + + ); + }; + + // 渲染顶部tips + _renderTips() { + const { tips } = this.props; + if (tips) { + return ( +
+ {tips} + {this._renderBtns()} +
+ ); + } + return this._renderBtns(); + } + + // 渲染操作按钮栏 + _renderBtns() { + const { del } = this.props; + let { btns } = this.props; + if (btns == null || btns.length <= 0) return null; + if (typeof del === 'function') { + btns = btns.concat([{ label: '删除', onClick: this.del.bind(this) }]); + } + return ( +
+ {btns.map((item, i) => { + const { label, onClick, authority, download, iconBtnSrc, type } = item; + const style = { + marginLeft: '10px', + }; + if (i === 0) { + style.marginRight = '0'; + } + return ( + + {type === 'download' ? ( + download() + ) : ( + + {iconBtnSrc && iconBtnSrc !== '' ? ( + + ) : ( + + )} + {label} + + )} + + ); + })} +
+ ); + } + + // 渲染表格组件 + _renderData() { + const { + del, + cols, + rowKey, + rowSelectionConfig, + expandedRowRender, + expandIcon, + scroll, + expandedRowKeys, + onExpandedRowsChange, + } = this.props; + const { data } = this.state; + let rowSelection = null; + if (del === true || typeof del === 'function') { + rowSelection = { + selectedRowKeys: data.view.selectedDataKeys, + onChange: (selectedRowKeys, selectedRows) => { + this.state.data.view.selectedDataKeys = selectedRowKeys; + this.state.data.view.selectedData = selectedRows; + this.forceUpdate(); + }, + }; + } + if (rowSelectionConfig) { + rowSelection = rowSelectionConfig; + } + const commonProps = { + className: s.table, + rowKey, + rowSelection, + columns: cols, + dataSource: data.origin, + expandIcon, + onExpandedRowsChange, + expandedRowRender, + pagination: false, + bordered: false, + }; + const _props = expandedRowKeys ? { ...commonProps, expandedRowKeys } : commonProps; + return scroll ? : ; + } + + // 渲染分页组件 + _renderPagination = () => { + const { pagination } = this.state; + return pagination.total > 20 ? : null; + }; + + formSiftData = (data) => { + // 格式化快捷筛选数据 + const result = []; + data.map((item) => { + const queryLabelConditions = []; + item.queryLabelConditions.map((cItem) => { + queryLabelConditions.push({ + queryLabelKey: cItem.queryLabelKey, + queryLabelValue: cItem.queryLabelValue, + queryLabelControlType: cItem.queryLabelControlType, + }); + }); + result.push({ + queryLabelName: item.queryLabelName, + queryLabelConditions, + queryLabelControlType: item.queryLabelControlType, + }); + }); + return result; + }; + + // 高级搜索 + // renderAdvanced = () => { + // const {} = this.props; + // return null; + // // return ; + // }; + + render() { + const { style, hideForm, tips } = this.props; + const { loading } = this.state; + return ( +
+ + {hideForm ? null : ( + <> +
+ {/* 筛选条件 */} + {this._renderSearchForm()} + {/* 高级搜索 */} + {/* {advancedStatus ? this.renderAdvanced() : null} */} + {/* 已选条件、搜索按钮 */} + {this._renderFilterBtn()} +
+
+ + )} +
+ {tips ? this._renderTips() : this._renderBtns()} + {this._renderData()} + {this._renderPagination()} + {this.props.children} +
+ +
+ ); + } +} diff --git a/components/DataView/index.less b/components/DataView/index.less new file mode 100644 index 0000000000000000000000000000000000000000..20e86a1417a0b560d558cb05fb5cb1fece56d231 --- /dev/null +++ b/components/DataView/index.less @@ -0,0 +1,77 @@ +@import '~@/theme/common'; + +@smallSpace: 4px; +@normalSpace: 16px; +.view { + .tableWrap { + background: #fff; + padding: 10px 20px; + border-radius: 6px; + } + + .formWrap { + background: #fff; + padding: 25px 20px; + border-radius: 6px; + } + + .row { + text-align: right; + // display: flex; + // margin-bottom: 6px; + + .col { + display: inline-block; + vertical-align: middle; + width: 30%; + margin: @smallSpace; + } + + .btn { + color: @primaryColor; + border-color: @primaryColor; + line-height: 32px; + + .iconCls { + font-size: @textFontGen; + } + .titleCls { + font-size: @textFontGen; + } + } + } + + .table { + margin: @smallSpace 0; + + td { + word-break: break-word; + } + + :global(.ant-table-placeholder) { + border-bottom: none; + } + + :global(.ant-table-thead > tr > th) { + border-right: none; + border-bottom: 1px solid #f6f6f8; + } + + :global(.ant-table-tbody > tr > td) { + border-right: none; + border-bottom: 1px solid #f6f6f8; + } + } +} + +.split { + height: 16px; + background: #f9f9f9; +} + +.tips { + display: flex; + justify-content: space-between; + margin-bottom: 10px; + align-items: center; +}