Commit b4c6a3c4 by zhaochengxiang

资产草稿增加未挂载资产

parent 4c592d32
import React from "react"
import { Space, Select, Button, Tooltip, Input, Typography, Modal, Pagination, Divider } from 'antd'
import LocalStorage from 'local-storage'
import { useDebounceEffect } from 'ahooks'
import { appId } from "../../../App"
import { dispatch } from '../../../model'
import Table from '../ResizeableTable'
import { highlightSearchContentByTerms, isSzseEnv, showMessage } from "../../../util"
import { AssetItem } from "../AssetManage/Component/AssetTable"
import UpdateAsset from "../AssetManage/Component/AssetDetailDrawer"
import { AssetDraftReference } from "../../../util/constant"
import StartProcess from "./start-process"
import ImportAsset from "./import"
// const specialCol = ['数据关键用户', '业务数据owner', 'it责任人', '创建人', '更新人']
const specialCol = ['创建人', '更新人']
const FC = (props) => {
const [loadingTemplates, setLoadingTemplates] = React.useState(false)
const [templates, setTemplates] = React.useState()
const [currentTemplateValue, setTemplateValue] = React.useState()
const [pagination, setPagination] = React.useState({ pageNum: 1, pageSize: 20 })
const [currentElementValue, setElementValue] = React.useState()
const [keyword, setKeyword] = React.useState()
const [selectedRows, setSelectedRows] = React.useState()
const [loadingElements, setLoadingElements] = React.useState()
const [elements, setElements] = React.useState()
const [loadingFilterElements, setLoadingFilterElements] = React.useState(false)
const [filterElements, setFilterElements] = React.useState()
const [loading, setLoading] = React.useState(false)
const [data, setData] = React.useState()
const [users, setUsers] = React.useState()
const [row, setRow] = React.useState()
const [isAdmin, setAdmin] = React.useState()
const [importAssetParams, setImportAssetParams] = React.useState({
visible: false
})
const [updateAssetParams, setUpdateAssetParams] = React.useState({
visible: false,
id: undefined,
dirId: undefined,
})
const [startProcessParams, setStartProcessParams] = React.useState({
visible: false,
items: undefined,
})
const [modal, contextHolder] = Modal.useModal();
React.useEffect(() => {
getAdmin()
getUsers()
getTemplates()
}, [])
React.useEffect(() => {
if (currentTemplateValue && isAdmin!==undefined) {
getElements()
getFilterElements()
}
}, [currentTemplateValue, isAdmin])
useDebounceEffect(() => {
if (currentTemplateValue && isAdmin!==undefined) {
getDrafts()
}
}, [currentTemplateValue, keyword, currentElementValue, pagination, isAdmin], { wait: 300 })
const canPublish = React.useMemo(() => {
let newSelectedRows = (selectedRows??[]).filter(item => item.draftState==='draft')
//非管理员不能操作停用状态的草稿
if (!isAdmin) {
newSelectedRows = (newSelectedRows??[]).filter(item => item.draftOperation!=='offline')
}
return (newSelectedRows??[]).length !== 0
}, [selectedRows, isAdmin])
const canDelete = React.useMemo(() => {
let newSelectedRows = (selectedRows??[]).filter(item => isAdmin || item.draftDeletable)
return (newSelectedRows??[]).length !== 0
}, [selectedRows, isAdmin])
const pathCol = {
title: '路径',
dataIndex: 'dirPath',
ellipsis: true,
width: 120,
render: (text, record) => {
return (
<Tooltip title={text}>
<Typography.Text ellipsis={true}>
{highlightSearchContentByTerms(text, [keyword??''], true)}
</Typography.Text>
</Tooltip>
);
}
}
const indexCol = {
title: '序号',
dataIndex: 'key',
fixed: 'left',
render: (text, record, index) => ((pagination.pageNum-1)*pagination.pageSize+index+1),
width: 60,
ellipsis: true,
filter: false,
}
const fixedCols = [
{
title: '修改类型',
dataIndex: 'draftOperation',
ellipsis: true,
width: 120,
fixed: 'right',
render: (text, record) => {
if (text === 'release') return '新增'
if (text === 'change') return '修改'
if (text === 'offline') return '停用'
return ''
}
},
{
title: '状态',
dataIndex: 'draftState',
ellipsis: true,
width: 120,
fixed: 'right',
render: (text, record) => {
if (text === 'draft') return '待提交'
if (text === 'auditing') return '审批中'
return ''
}
},
]
const [columns, tableData, total] = React.useMemo(() => {
let [newColumns, newTableData] = [[], []]
for (const element of filterElements??[]) {
for (const name of element.names??[]) {
const column = {
title: name,
dataIndex: name,
ellipsis: true,
width: 120,
render: (text, record) => {
return (
<Tooltip title={text}>
<Typography.Text ellipsis={true}>
{highlightSearchContentByTerms(text, [keyword??''], true)}
</Typography.Text>
</Tooltip>
);
}
}
if (name === '编号') {
column.width = 60
} else if (name === '中文名称'|| name === '岗位中文名') {
column.width = isSzseEnv ? 230 : 160
} else if (name === '英文名称' || name === '岗位英文名') {
column.width = isSzseEnv ? 224 : 160
} else if (name === '资产项') {
column.width = isSzseEnv ? 250 : 120
column.render = (text) => {
let metadata = null
try {
metadata = JSON.parse(text)
} catch(error) {
metadata = text;
}
return (
<AssetItem metadata={metadata} terms={[keyword??'']} />
);
}
}
newColumns.push(column)
}
}
if (!loadingFilterElements) {
for (const item of (data?.data??[])) {
let index = 0
let newItem = {}
for (const elementValue of (item.elementValues??[])) {
for (const value of elementValue.values) {
if ((newColumns??[]).length > index) {
const name = newColumns[index].dataIndex
newItem[name] = value
if (specialCol.indexOf((name??'').toLowerCase()) !== -1) {
const user = users?.filter((user)=>(user.pernr===value))
if ((user??[]).length > 0) {
newItem[name] = user[0].nachn?`${user[0].nachn}(${user[0].pernr})`:user[0].pernr;
}
}
}
index++
}
}
newTableData.push({...item, ...newItem})
}
}
return [[indexCol, pathCol, ...newColumns, ...fixedCols]
, newTableData, data?.total??0]
}, [filterElements, data, loadingFilterElements, users, fixedCols, keyword, pathCol, indexCol, pagination])
const getAdmin = () => {
dispatch({
type: 'assetmanage.checkAdmin',
callback: (data) => {
setAdmin((data==='true')?true:false)
}
})
}
const getUsers = () => {
dispatch({
type: 'pds.getOwners',
callback: (data) => {
setUsers(data)
}
})
}
const getTemplates = () => {
setLoadingTemplates(true)
dispatch({
type: 'assetmanage.getTemplates',
callback: data => {
setLoadingTemplates(false)
setTemplates(data)
if ((data??[]).length > 0) {
LocalStorage.set(`templateType-${appId}`, data[0].type)
setTemplateValue(data[0].type)
}
},
error: () => {
setLoadingTemplates(false)
}
})
}
const getElements = () => {
setLoadingElements(true)
dispatch({
type: 'assetmanage.listElements',
callback: data => {
setLoadingElements(false)
setElements(data)
},
error: () => {
setLoadingElements(false)
}
})
}
const getFilterElements = () => {
setLoadingFilterElements(true)
dispatch({
type: 'assetmanage.listDraftFilterElementsGroupByType',
callback: data => {
setLoadingFilterElements(false)
setFilterElements(data)
},
error: () => {
setLoadingFilterElements(false)
}
})
}
const getDrafts = () => {
setLoading(true)
dispatch({
type: 'assetmanage.getDrafts',
payload: {
isAdmin,
queryElementId: currentElementValue,
templateType: currentTemplateValue,
keyword: encodeURIComponent(keyword??''),
pageNum: pagination.pageNum,
pageSize: pagination.pageSize,
},
callback: data => {
setLoading(false)
setData(data)
},
error: () => {
setLoading(false)
}
})
}
const onTemplateChange = (value) => {
setData()
setSelectedRows()
LocalStorage.set(`templateType-${appId}`, value)
setTemplateValue(value)
setPagination({ ...pagination, pageNum: 1 })
}
const onBatchUpdateClick = () => {
setImportAssetParams({
visible: true,
})
}
const onExportClick = () => {
window.open(`/api/dataassetmanager/draftApi/exportByDraftIds?draftIds=${(selectedRows??[]).map(item => item.id).toString()}&templateType=${currentTemplateValue}`);
}
const onPublishClick = () => {
if (isAdmin) {
modal.confirm({
title: '是否确认发布选中的资产目录',
onOk: () => {
dispatch({
type: 'assetmanage.publishDrafts',
payload: {
params: {
draftIds: (selectedRows??[]).map(item => item.id).toString()
}
},
callback: () => {
showMessage("success","发布成功")
setSelectedRows()
getDrafts()
}
})
}
})
} else {
setStartProcessParams({
visible: true,
items: selectedRows
})
}
}
const onDeletesClick = () => {
modal.confirm({
title: '是否确认删除选中的资产目录',
onOk: () => {
dispatch({
type: 'assetmanage.deleteDrafts',
payload: {
params: {
isAdmin,
},
data: (selectedRows??[]).map(item => item.id)
},
callback: () => {
showMessage("success","删除成功")
setSelectedRows()
getDrafts()
}
})
}
})
}
return (
<div style={{ backgroundColor: '#fff', height: '100%' }}>
<div className='flex p-3' style={{
alignItems: 'center',
justifyContent: 'space-between',
borderBottom: '1px solid rgb(239, 239, 239)',
}}>
<Space>
<Select
loading={loadingTemplates}
value={currentTemplateValue}
onChange={onTemplateChange}
style={{ width: 100 }}
>
{
(templates??[]).map((item, index) => <Select.Option key={index} value={item.type}>{item.name}</Select.Option>)
}
</Select>
<Button onClick={onBatchUpdateClick}>批量修改</Button>
<Tooltip title={((selectedRows??[]).length === 0) ? '请先选择资产' : ''}>
<Button onClick={onExportClick} disabled={(selectedRows??[]).length === 0}>导出</Button>
</Tooltip>
<Tooltip title={canPublish?'':(isAdmin?'请先选择待提交的资产':'请先选择待提交并且不是停用类型的资产')}>
<Button onClick={onPublishClick} disabled={!canPublish}>发布</Button>
</Tooltip>
<Tooltip title={canDelete ? '':(isAdmin?'请先选择资产':'请选择自己创建的资产')}>
<Button onClick={onDeletesClick} disabled={!canDelete}>删除</Button>
</Tooltip>
</Space>
<Space>
<Select allowClear
loading={loadingElements}
value={currentElementValue}
placeholder='请选择搜索属性'
onChange={(val) => {
setElementValue(val)
}}
style={{ width: 160 }}
>
{
(elements??[]).map((item, index) => (
<Select.Option key={item.id} value={item.id}>{item.name}</Select.Option>
))
}
</Select>
<Input size="middle"
placeholder="请输入关键字"
value={keyword}
bordered={true} allowClear
onChange={(e) => {
setKeyword(e.target.value)
}} />
</Space>
</div>
<div className='p-3'>
<Table
extraColWidth={32}
loading={loadingFilterElements||loading}
columns={columns}
dataSource={tableData}
rowKey='id'
pagination={false}
rowSelection={{
selectedRowKeys: (selectedRows??[]).map(item => item.id),
onChange: (selectedRowKeys, selectedRows) => {
setSelectedRows(selectedRows)
}
}}
onRow={(record) => {
return {
onClick: (e) => {
setRow(record)
setUpdateAssetParams({
visible: true,
id: record?.id,
dirId: record?.dirId,
})
}
}
}}
rowClassName={(record, index) => {
return (record?.id === row?.id) ? 'yy-table-select-row' : ''
}}
scroll={{ y: 'calc(100vh - 209px - 72px - 57px)' }}
/>
<Pagination
className="text-center mt-3"
showSizeChanger
onChange={(page, size) => {
setSelectedRows()
setPagination({ pageNum: page, pageSize: size })
}}
onShowSizeChange={(page,size) => {
setSelectedRows()
setPagination({ pageNum: page, pageSize: size })
}}
current={pagination.pageNum}
pageSize={pagination.pageSize}
defaultCurrent={1}
total={total}
showTotal={total => ` ${total} `}
/>
</div>
<ImportAsset
{...importAssetParams}
onCancel={() => {
setImportAssetParams({
visible: false,
})
}}
onSuccess={() => {
getDrafts()
}}
/>
<UpdateAsset
{...updateAssetParams}
reference={AssetDraftReference}
onCancel={(refresh) => {
setUpdateAssetParams({
visible: false,
id: undefined,
dirId: undefined,
})
refresh && getDrafts()
}}
/>
<StartProcess
{...startProcessParams}
onCancel={(refresh) => {
setStartProcessParams({
visible: false,
items: undefined
})
refresh && getDrafts()
}}
/>
{contextHolder}
</div>
)
}
export default FC
\ No newline at end of file
import React from "react"
import { Space, Select, Button, Tooltip, Input, Typography, Modal, Pagination, Divider } from 'antd'
import LocalStorage from 'local-storage'
import { useDebounceEffect } from 'ahooks'
import React, { useState } from 'react';
import { Tabs } from 'antd';
import { appId } from "../../../App"
import { dispatch } from '../../../model'
import Table from '../ResizeableTable'
import { highlightSearchContentByTerms, isSzseEnv, showMessage } from "../../../util"
import { AssetItem } from "../AssetManage/Component/AssetTable"
import UpdateAsset from "../AssetManage/Component/AssetDetailDrawer"
import { AssetDraftReference } from "../../../util/constant"
import StartProcess from "./start-process"
import ImportAsset from "./import"
import Draft from './draft'
import Recycle from './recycle'
import './index.less'
// const specialCol = ['数据关键用户', '业务数据owner', 'it责任人', '创建人', '更新人']
const specialCol = ['创建人', '更新人']
const { TabPane } = Tabs;
const FC = (props) => {
const [loadingTemplates, setLoadingTemplates] = React.useState(false)
const [templates, setTemplates] = React.useState()
const [currentTemplateValue, setTemplateValue] = React.useState()
const [pagination, setPagination] = React.useState({ pageNum: 1, pageSize: 20 })
const [currentElementValue, setElementValue] = React.useState()
const [keyword, setKeyword] = React.useState()
const [selectedRows, setSelectedRows] = React.useState()
const [loadingElements, setLoadingElements] = React.useState()
const [elements, setElements] = React.useState()
const [loadingFilterElements, setLoadingFilterElements] = React.useState(false)
const [filterElements, setFilterElements] = React.useState()
const [loading, setLoading] = React.useState(false)
const [data, setData] = React.useState()
const [users, setUsers] = React.useState()
const [row, setRow] = React.useState()
const [isAdmin, setAdmin] = React.useState()
const [importAssetParams, setImportAssetParams] = React.useState({
visible: false
})
const [updateAssetParams, setUpdateAssetParams] = React.useState({
visible: false,
id: undefined,
dirId: undefined,
})
const [startProcessParams, setStartProcessParams] = React.useState({
visible: false,
items: undefined,
})
const [modal, contextHolder] = Modal.useModal();
const FC = () => {
const [tabKey, setTabKey] = useState('1');
React.useEffect(() => {
getAdmin()
getUsers()
getTemplates()
}, [])
React.useEffect(() => {
if (currentTemplateValue && isAdmin!==undefined) {
getElements()
getFilterElements()
}
}, [currentTemplateValue, isAdmin])
useDebounceEffect(() => {
if (currentTemplateValue && isAdmin!==undefined) {
getDrafts()
}
}, [currentTemplateValue, keyword, currentElementValue, pagination, isAdmin], { wait: 300 })
const canPublish = React.useMemo(() => {
let newSelectedRows = (selectedRows??[]).filter(item => item.draftState==='draft')
//非管理员不能操作停用状态的草稿
if (!isAdmin) {
newSelectedRows = (newSelectedRows??[]).filter(item => item.draftOperation!=='offline')
}
return (newSelectedRows??[]).length !== 0
}, [selectedRows, isAdmin])
const canDelete = React.useMemo(() => {
let newSelectedRows = (selectedRows??[]).filter(item => isAdmin || item.draftDeletable)
return (newSelectedRows??[]).length !== 0
}, [selectedRows, isAdmin])
const pathCol = {
title: '路径',
dataIndex: 'dirPath',
ellipsis: true,
width: 120,
render: (text, record) => {
return (
<Tooltip title={text}>
<Typography.Text ellipsis={true}>
{highlightSearchContentByTerms(text, [keyword??''], true)}
</Typography.Text>
</Tooltip>
);
}
}
const indexCol = {
title: '序号',
dataIndex: 'key',
fixed: 'left',
render: (text, record, index) => ((pagination.pageNum-1)*pagination.pageSize+index+1),
width: 60,
ellipsis: true,
filter: false,
}
const fixedCols = [
{
title: '修改类型',
dataIndex: 'draftOperation',
ellipsis: true,
width: 120,
fixed: 'right',
render: (text, record) => {
if (text === 'release') return '新增'
if (text === 'change') return '修改'
if (text === 'offline') return '停用'
return ''
}
},
{
title: '状态',
dataIndex: 'draftState',
ellipsis: true,
width: 120,
fixed: 'right',
render: (text, record) => {
if (text === 'draft') return '待提交'
if (text === 'auditing') return '审批中'
return ''
}
},
]
const [columns, tableData, total] = React.useMemo(() => {
let [newColumns, newTableData] = [[], []]
for (const element of filterElements??[]) {
for (const name of element.names??[]) {
const column = {
title: name,
dataIndex: name,
ellipsis: true,
width: 120,
render: (text, record) => {
return (
<Tooltip title={text}>
<Typography.Text ellipsis={true}>
{highlightSearchContentByTerms(text, [keyword??''], true)}
</Typography.Text>
</Tooltip>
);
}
}
if (name === '编号') {
column.width = 60
} else if (name === '中文名称'|| name === '岗位中文名') {
column.width = isSzseEnv ? 230 : 160
} else if (name === '英文名称' || name === '岗位英文名') {
column.width = isSzseEnv ? 224 : 160
} else if (name === '资产项') {
column.width = isSzseEnv ? 250 : 120
column.render = (text) => {
let metadata = null
try {
metadata = JSON.parse(text)
} catch(error) {
metadata = text;
}
return (
<AssetItem metadata={metadata} terms={[keyword??'']} />
);
}
}
newColumns.push(column)
}
}
if (!loadingFilterElements) {
for (const item of (data?.data??[])) {
let index = 0
let newItem = {}
for (const elementValue of (item.elementValues??[])) {
for (const value of elementValue.values) {
if ((newColumns??[]).length > index) {
const name = newColumns[index].dataIndex
newItem[name] = value
if (specialCol.indexOf((name??'').toLowerCase()) !== -1) {
const user = users?.filter((user)=>(user.pernr===value))
if ((user??[]).length > 0) {
newItem[name] = user[0].nachn?`${user[0].nachn}(${user[0].pernr})`:user[0].pernr;
}
}
}
index++
}
}
newTableData.push({...item, ...newItem})
}
}
return [[indexCol, pathCol, ...newColumns, ...fixedCols]
, newTableData, data?.total??0]
}, [filterElements, data, loadingFilterElements, users, fixedCols, keyword, pathCol, indexCol, pagination])
const getAdmin = () => {
dispatch({
type: 'assetmanage.checkAdmin',
callback: (data) => {
setAdmin((data==='true')?true:false)
}
})
}
const getUsers = () => {
dispatch({
type: 'pds.getOwners',
callback: (data) => {
setUsers(data)
}
})
}
const getTemplates = () => {
setLoadingTemplates(true)
dispatch({
type: 'assetmanage.getTemplates',
callback: data => {
setLoadingTemplates(false)
setTemplates(data)
if ((data??[]).length > 0) {
LocalStorage.set(`templateType-${appId}`, data[0].type)
setTemplateValue(data[0].type)
}
},
error: () => {
setLoadingTemplates(false)
}
})
}
const getElements = () => {
setLoadingElements(true)
dispatch({
type: 'assetmanage.listElements',
callback: data => {
setLoadingElements(false)
setElements(data)
},
error: () => {
setLoadingElements(false)
}
})
}
const getFilterElements = () => {
setLoadingFilterElements(true)
dispatch({
type: 'assetmanage.listDraftFilterElementsGroupByType',
callback: data => {
setLoadingFilterElements(false)
setFilterElements(data)
},
error: () => {
setLoadingFilterElements(false)
}
})
}
const getDrafts = () => {
setLoading(true)
dispatch({
type: 'assetmanage.getDrafts',
payload: {
isAdmin,
queryElementId: currentElementValue,
templateType: currentTemplateValue,
keyword: encodeURIComponent(keyword??''),
pageNum: pagination.pageNum,
pageSize: pagination.pageSize,
},
callback: data => {
setLoading(false)
setData(data)
},
error: () => {
setLoading(false)
}
})
}
const onTemplateChange = (value) => {
setData()
setSelectedRows()
LocalStorage.set(`templateType-${appId}`, value)
setTemplateValue(value)
setPagination({ ...pagination, pageNum: 1 })
}
const onBatchUpdateClick = () => {
setImportAssetParams({
visible: true,
})
}
const onExportClick = () => {
window.open(`/api/dataassetmanager/draftApi/exportByDraftIds?draftIds=${(selectedRows??[]).map(item => item.id).toString()}&templateType=${currentTemplateValue}`);
}
const onPublishClick = () => {
if (isAdmin) {
modal.confirm({
title: '是否确认发布选中的资产目录',
onOk: () => {
dispatch({
type: 'assetmanage.publishDrafts',
payload: {
params: {
draftIds: (selectedRows??[]).map(item => item.id).toString()
}
},
callback: () => {
showMessage("success","发布成功")
setSelectedRows()
getDrafts()
}
})
}
})
} else {
setStartProcessParams({
visible: true,
items: selectedRows
})
}
}
const onDeletesClick = () => {
modal.confirm({
title: '是否确认删除选中的资产目录',
onOk: () => {
dispatch({
type: 'assetmanage.deleteDrafts',
payload: {
params: {
isAdmin,
},
data: (selectedRows??[]).map(item => item.id)
},
callback: () => {
showMessage("success","删除成功")
setSelectedRows()
getDrafts()
}
})
}
})
const onTabChange = (key) => {
setTabKey(key);
}
return (
<div style={{ backgroundColor: '#fff', height: '100%' }}>
<div className='flex p-3' style={{
alignItems: 'center',
justifyContent: 'space-between',
borderBottom: '1px solid rgb(239, 239, 239)',
}}>
<Space>
<Select
loading={loadingTemplates}
value={currentTemplateValue}
onChange={onTemplateChange}
style={{ width: 100 }}
>
{
(templates??[]).map((item, index) => <Select.Option key={index} value={item.type}>{item.name}</Select.Option>)
}
</Select>
<Button onClick={onBatchUpdateClick}>批量修改</Button>
<Tooltip title={((selectedRows??[]).length === 0) ? '请先选择资产' : ''}>
<Button onClick={onExportClick} disabled={(selectedRows??[]).length === 0}>导出</Button>
</Tooltip>
<Tooltip title={canPublish?'':(isAdmin?'请先选择待提交的资产':'请先选择待提交并且不是停用类型的资产')}>
<Button onClick={onPublishClick} disabled={!canPublish}>发布</Button>
</Tooltip>
<Tooltip title={canDelete ? '':(isAdmin?'请先选择资产':'请选择自己创建的资产')}>
<Button onClick={onDeletesClick} disabled={!canDelete}>删除</Button>
</Tooltip>
</Space>
<Space>
<Select allowClear
loading={loadingElements}
value={currentElementValue}
placeholder='请选择搜索属性'
onChange={(val) => {
setElementValue(val)
}}
style={{ width: 160 }}
>
{
(elements??[]).map((item, index) => (
<Select.Option key={item.id} value={item.id}>{item.name}</Select.Option>
))
}
</Select>
<Input size="middle"
placeholder="请输入关键字"
value={keyword}
bordered={true} allowClear
onChange={(e) => {
setKeyword(e.target.value)
}} />
</Space>
</div>
<div className='p-3'>
<Table
extraColWidth={32}
loading={loadingFilterElements||loading}
columns={columns}
dataSource={tableData}
rowKey='id'
pagination={false}
rowSelection={{
selectedRowKeys: (selectedRows??[]).map(item => item.id),
onChange: (selectedRowKeys, selectedRows) => {
setSelectedRows(selectedRows)
}
}}
onRow={(record) => {
return {
onClick: (e) => {
setRow(record)
setUpdateAssetParams({
visible: true,
id: record?.id,
dirId: record?.dirId,
})
}
}
}}
rowClassName={(record, index) => {
return (record?.id === row?.id) ? 'yy-table-select-row' : ''
}}
scroll={{ y: 'calc(100vh - 209px - 72px)' }}
/>
<Pagination
className="text-center mt-3"
showSizeChanger
onChange={(page, size) => {
setSelectedRows()
setPagination({ pageNum: page, pageSize: size })
}}
onShowSizeChange={(page,size) => {
setSelectedRows()
setPagination({ pageNum: page, pageSize: size })
}}
current={pagination.pageNum}
pageSize={pagination.pageSize}
defaultCurrent={1}
total={total}
showTotal={total => ` ${total} `}
/>
</div>
<ImportAsset
{...importAssetParams}
onCancel={() => {
setImportAssetParams({
visible: false,
})
}}
onSuccess={() => {
getDrafts()
}}
/>
<UpdateAsset
{...updateAssetParams}
reference={AssetDraftReference}
onCancel={(refresh) => {
setUpdateAssetParams({
visible: false,
id: undefined,
dirId: undefined,
})
refresh && getDrafts()
}}
/>
<StartProcess
{...startProcessParams}
onCancel={(refresh) => {
setStartProcessParams({
visible: false,
items: undefined
})
refresh && getDrafts()
<div className='asset-draft'>
<Tabs
tabBarExtraContent={{
left:<div style={{ marginLeft:10 }}></div>
}}
/>
{contextHolder}
size="large"
activeKey={tabKey}
onChange={onTabChange}
>
<TabPane tab='草稿' key='1'>
<Draft />
</TabPane>
<TabPane tab='未挂载' key='2'>
<Recycle />
</TabPane>
</Tabs>
</div>
)
}
......
.asset-draft {
height: calc(100vh - 64px - 30px);
// padding: 20px;
background: #fff;
overflow: auto;
.yy-tabs-nav {
margin: 0;
}
}
\ No newline at end of file
import React from "react"
import { useDebounceEffect } from 'ahooks'
import LocalStorage from 'local-storage'
import { Space, Select, Button, Tooltip, Input, Typography, Modal, Pagination, Divider } from 'antd'
import { appId } from "../../../App"
import Table from '../ResizeableTable'
import { highlightSearchContentByTerms, isSzseEnv, showMessage } from "../../../util"
import { AssetItem } from "../AssetManage/Component/AssetTable"
import UpdateAsset from "../AssetManage/Component/AssetDetailDrawer"
import { dispatch } from '../../../model'
import { AssetManageReference, AssetRecycleReference } from "../../../util/constant"
import { getTemplateType } from "../../../util/axios"
import FilterElementModal from '../AssetManage/Component/FilterElementModal'
const FC = (props) => {
const [loadingTemplates, setLoadingTemplates] = React.useState(false)
const [templates, setTemplates] = React.useState()
const [currentTemplateValue, setTemplateValue] = React.useState()
const [pagination, setPagination] = React.useState({ pageNum: 1, pageSize: 20 })
const [keyword, setKeyword] = React.useState()
const [selectedRows, setSelectedRows] = React.useState()
const [loadingFilterElements, setLoadingFilterElements] = React.useState(false)
const [filterElements, setFilterElements] = React.useState()
const [loading, setLoading] = React.useState(false)
const [data, setData] = React.useState()
const [row, setRow] = React.useState()
const [updateAssetParams, setUpdateAssetParams] = React.useState({
visible: false,
id: undefined,
dirId: undefined,
})
const [filterElementParams, setFilterElementParams] = React.useState({
visible: false,
})
React.useEffect(() => {
getTemplates()
}, [])
React.useEffect(() => {
if (currentTemplateValue) {
getFilterElements()
}
}, [currentTemplateValue])
useDebounceEffect(() => {
if (currentTemplateValue) {
getRecycles()
}
}, [currentTemplateValue, keyword, pagination], { wait: 300 })
const indexCol = {
title: '序号',
dataIndex: 'key',
fixed: 'left',
render: (text, record, index) => ((pagination.pageNum-1)*pagination.pageSize+index+1),
width: 60,
ellipsis: true,
filter: false,
}
const [columns, tableData, total] = React.useMemo(() => {
let [newColumns, newTableData] = [[], []]
for (const element of filterElements??[]) {
for (const name of element.names??[]) {
const column = {
title: name,
dataIndex: name,
ellipsis: true,
width: 120,
render: (text, record) => {
return (
<Tooltip title={text}>
<Typography.Text ellipsis={true}>
{highlightSearchContentByTerms(text, [keyword??''], true)}
</Typography.Text>
</Tooltip>
);
}
}
if (name === '编号') {
column.width = 60
} else if (name === '中文名称'|| name === '岗位中文名') {
column.width = isSzseEnv ? 230 : 160
} else if (name === '英文名称' || name === '岗位英文名') {
column.width = isSzseEnv ? 224 : 160
} else if (name === '资产项') {
column.width = isSzseEnv ? 250 : 120
column.render = (text) => {
let metadata = null
try {
metadata = JSON.parse(text)
} catch(error) {
metadata = text;
}
return (
<AssetItem metadata={metadata} terms={[keyword??'']} />
);
}
}
newColumns.push(column)
}
}
if (!loadingFilterElements) {
for (const item of (data?.data??[])) {
let index = 0
let newItem = {}
for (const elementValue of (item.elementValues??[])) {
for (const value of elementValue.values) {
if ((newColumns??[]).length > index) {
const name = newColumns[index].dataIndex
newItem[name] = value
}
index++
}
}
newTableData.push({...item, ...newItem})
}
}
return [[indexCol, ...newColumns]
, newTableData, data?.total??0]
}, [filterElements, data, loadingFilterElements, keyword, indexCol, pagination])
const getTemplates = () => {
setLoadingTemplates(true)
dispatch({
type: 'assetmanage.getTemplates',
callback: data => {
setLoadingTemplates(false)
setTemplates(data)
if ((data??[]).length > 0) {
LocalStorage.set(`templateType-${appId}`, data[0].type)
setTemplateValue(data[0].type)
}
},
error: () => {
setLoadingTemplates(false)
}
})
}
const getFilterElements = () => {
setLoadingFilterElements(true)
dispatch({
type: 'assetmanage.listFilterElementsGroupByType',
payload: {
isAdmin: true,
},
callback: data => {
setLoadingFilterElements(false)
setFilterElements(data)
},
error: () => {
setLoadingFilterElements(false)
}
})
}
const getRecycles = () => {
setLoading(true)
dispatch({
type: 'assetmanage.listRecycleBinDataAssetsByPage',
payload: {
templateType: currentTemplateValue,
keyword: encodeURIComponent(keyword??''),
pageNum: pagination.pageNum,
pageSize: pagination.pageSize,
},
callback: data => {
setLoading(false)
setData(data)
},
error: () => {
setLoading(false)
}
})
}
const onTemplateChange = (value) => {
setData()
setSelectedRows()
LocalStorage.set(`templateType-${appId}`, value)
setTemplateValue(value)
setPagination({ ...pagination, pageNum: 1 })
}
const onExportClick = () => {
window.open(`/api/dataassetmanager/dataAssetApi/exportByDataAssetIds?dataAssetIds=${(selectedRows??[]).map(item=>item.id).toString()}&templateType=${getTemplateType()}`);
}
return (
<div style={{ backgroundColor: '#fff', height: '100%' }}>
<div className='flex p-3' style={{
alignItems: 'center',
justifyContent: 'space-between',
borderBottom: '1px solid rgb(239, 239, 239)',
}}>
<Space>
<Select
loading={loadingTemplates}
value={currentTemplateValue}
onChange={onTemplateChange}
style={{ width: 100 }}
>
{
(templates??[]).map((item, index) => <Select.Option key={index} value={item.type}>{item.name}</Select.Option>)
}
</Select>
<Tooltip title={((selectedRows??[]).length === 0) ? '请先选择资产' : ''}>
<Button onClick={onExportClick} disabled={(selectedRows??[]).length === 0}>导出</Button>
</Tooltip>
<Button onClick={() => {
setFilterElementParams({ visible: true })
}}>可见列设置</Button>
</Space>
<Space>
<Input size="middle"
placeholder="请输入关键字"
value={keyword}
bordered={true} allowClear
onChange={(e) => {
setKeyword(e.target.value)
}} />
</Space>
</div>
<div className='p-3'>
<Table
extraColWidth={32}
loading={loadingFilterElements||loading}
columns={columns}
dataSource={tableData}
rowKey='id'
pagination={false}
rowSelection={{
selectedRowKeys: (selectedRows??[]).map(item => item.id),
onChange: (selectedRowKeys, selectedRows) => {
setSelectedRows(selectedRows)
}
}}
onRow={(record) => {
return {
onClick: (e) => {
setRow(record)
setUpdateAssetParams({
visible: true,
id: record?.id,
dirId: record?.dirId,
})
}
}
}}
rowClassName={(record, index) => {
return (record?.id === row?.id) ? 'yy-table-select-row' : ''
}}
scroll={{ y: 'calc(100vh - 209px - 72px - 57px)' }}
/>
<Pagination
className="text-center mt-3"
showSizeChanger
onChange={(page, size) => {
setSelectedRows()
setPagination({ pageNum: page, pageSize: size })
}}
onShowSizeChange={(page,size) => {
setSelectedRows()
setPagination({ pageNum: page, pageSize: size })
}}
current={pagination.pageNum}
pageSize={pagination.pageSize}
defaultCurrent={1}
total={total}
showTotal={total => ` ${total} `}
/>
</div>
<UpdateAsset
{...updateAssetParams}
reference={AssetRecycleReference}
readonly
onCancel={(refresh) => {
setUpdateAssetParams({
visible: false,
id: undefined,
dirId: undefined,
})
refresh && getRecycles()
}}
/>
<FilterElementModal
type='admin'
reference={AssetManageReference}
{...filterElementParams}
onCancel={(refresh) => {
setFilterElementParams({ visible: false })
if (refresh) {
getFilterElements()
getRecycles()
}
}}
/>
</div>
)
}
export default FC
\ No newline at end of file
......@@ -1221,14 +1221,17 @@ const AssetAction = (props) => {
const index1 = (users||[]).findIndex(item => item.pernr === changedValues[name]);
if (index1 !== -1) {
const index2 = (elements??[]).findIndex(item => item.enName === 'dataKeyUserName')
let newFieldsValue = {}
if (index2 !== -1) {
form.setFieldsValue({[elements[index2].name]: users[index].nachn})
newFieldsValue[elements[index2].name] = users[index1].nachn
}
const index3 = (elements??[]).findIndex(item => item.enName === 'dataKeyUserDepartment')
if (index3 !== -1) {
form.setFieldsValue({[elements[index3].name]: users[index].org3TXT})
newFieldsValue[elements[index3].name] = users[index1].org3TXT
}
form.setFieldsValue(newFieldsValue)
}
}
......@@ -1236,14 +1239,17 @@ const AssetAction = (props) => {
const index1 = (users||[]).findIndex(item => item.pernr === changedValues[name]);
if (index1 !== -1) {
const index2 = (elements??[]).findIndex(item => item.enName === 'businessDepartmentOwnerName')
let newFieldsValue = {}
if (index2 !== -1) {
form.setFieldsValue({[elements[index2].name]: users[index].nachn})
newFieldsValue[elements[index2].name] = users[index1].nachn
}
const index3 = (elements??[]).findIndex(item => item.enName === 'businessResponsibleDepartment')
if (index3 !== -1) {
form.setFieldsValue({[elements[index3].name]: users[index].org3TXT})
newFieldsValue[elements[index3].name] = users[index1].org3TXT
}
form.setFieldsValue(newFieldsValue)
}
}
......@@ -1251,14 +1257,17 @@ const AssetAction = (props) => {
const index1 = (users||[]).findIndex(item => item.pernr === changedValues[name]);
if (index1 !== -1) {
const index2 = (elements??[]).findIndex(item => item.enName === 'itResponsiblePersonName')
let newFieldsValue = {}
if (index2 !== -1) {
form.setFieldsValue({[elements[index2].name]: users[index].nachn})
newFieldsValue[elements[index2].name] = users[index1].nachn
}
const index3 = (elements??[]).findIndex(item => item.enName === 'itResponsibleDepartment')
if (index3 !== -1) {
form.setFieldsValue({[elements[index3].name]: users[index].org3TXT})
newFieldsValue[elements[index3].name] = users[index1].org3TXT
}
form.setFieldsValue(newFieldsValue)
}
}
}
......@@ -1328,9 +1337,11 @@ const AssetAction = (props) => {
</React.Fragment>
}
<Button onClick={shareAsset}>分享</Button>
{
reference !== AssetDraftReference && <SubsribeButton id={assets?.id} appType='dataAssetManager' subType={assets?.templateType} env={app?.env?.domainId||catalog||LocalStorage.get('assetsEnv')} />
reference !== AssetRecycleReference && <Button onClick={shareAsset}>分享</Button>
}
{
reference !== AssetDraftReference && reference !== AssetRecycleReference && <SubsribeButton id={assets?.id} appType='dataAssetManager' subType={assets?.templateType} env={app?.env?.domainId||catalog||LocalStorage.get('assetsEnv')} />
}
{
!isPostAsset(assets?.templateType) && <Dropdown overlay={
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment