Commit da4a5a83 by fanyj

资产打标签

parent 60b94136
const outUrl:string = '/center-home';
const appUrl:string = '/center-home';
const Api:string = '/api';
const inapp:boolean = false;//内网true;外网false
const baseUrl = inapp?appUrl:outUrl;
export default {
baseUrl:baseUrl,
BaseURL: baseUrl,
inapp:inapp,
headerstring:'Basic ZGVtb3Rlc3Q6ZGVtb3Rlc3Q=',
page:{
index:`${baseUrl}/menu/index`,
indexpage:'/menu/index',
loginpage: inapp?'/api/auth/login':`${baseUrl}/view/login`,
workpage:'/view/task',
jdbc:'/view/jdbcmanage',
homeIndex: `${baseUrl}/view`,
roleTree: `${baseUrl}/view/roleTree`,
rolemanage: `${baseUrl}/view/rolemanage`,
metadetail:`${baseUrl}/metadetail`,
metadotheretail:`${baseUrl}/staticmeta/detail`,
standardmanage:`${baseUrl}/menu/datastandard`,
indecatormanage:`${baseUrl}/menu/dataindicator`,
taggermanage:`${baseUrl}/menu/datatagger`,
relationpage:`${baseUrl}/menu/sourcemap`,
catalogpage:`${baseUrl}/menu/domain`,
systempage:`${baseUrl}/menu/datasys`,
questionpage:`${baseUrl}/menu/myquestion`,
modelpage:`${baseUrl}/menu/data-model`,
noticepage:`${baseUrl}/menu/systemnotice`,
assertspage:`${baseUrl}/menu/asset-1104-manage`,
assetssource:`${baseUrl}/menu/asset-resource-browse`,//资源
asserts:`${baseUrl}/menu/asset-browse`,//资产,
assetmap:`${baseUrl}/menu/asset-map`,
},
api:{
houseinfo:`${Api}`,
api:`${Api}`,
standard:`${Api}/standard`,
authservice:`${Api}/authservice`,
singin: `${Api}/auth/signin`,
signout: `${Api}/auth/signout`,
users: `${Api}/authservice/users/:userId/domains`,
sessionInfo: `${Api}/auth/sessionInfo`,
userupdate: `${Api}/authservice/users/`,
jdbcmanage: `${Api}/metadataharvester/rest/targetConfig/jdbc`,
sysjdbcmanage: `${Api}/metadataharvester/rest/targetConfig/system/jdbc`,
harveJdbcmanage: `${Api}/metadataharvester/rest/harvestingTarget/jdbc`,
taskResult: `${Api}/metadataharvester/rest/taskResult`,
task: `${Api}/metadataharvester/rest/task`,
role: `${Api}/datacatalog/roleCtrl`,
management: `${Api}/datacatalog/management`,
domains: `${Api}/authservice/domains`,
roleUser: `${Api}/authservice/roles`,
usersRoles: `${Api}/authservice/users`,
dataqualityapi: `${Api}/dataqualityapi`,
dataq:`${Api}/dataq`,
label: `${Api}/tagmanager`,
metaRepo: `${Api}/metadatarepo`,
metaHarvest:`${Api}/metadataharvester`,
information: `${Api}/informationmanagement`,
questionfeedback:`${Api}/questionfeedback`,
fileCatalog: `${Api}/informationmanagement/rest/fileCatalog`,
fileInformation: `${Api}/informationmanagement/rest/fileInformation`,
dataInformation: `${Api}/informationmanagement/rest/dataInformation`,
issuetrack: `${Api}/questionfeedback/rest/issuetrack`,
questionInfo: `${Api}/questionfeedback/rest/questionInfo`,
report: `${Api}/portal/report`,
nodeRelation: `${Api}/metadatarepo/rest/nodeRelation`,
interfaceLog:`${Api}/auditlogger/interfaceLogCtrl`,
finder: `${Api}/finder`,
asset:`${Api}/dataassetmanager`,
metadataRelation: `${Api}/metadatarelation`,
tagger: `${Api}/tagger`,
customertag: `${Api}/customertag`,
datamodeler: `${Api}/datamodeler`,
indicatorrule:`${Api}/indicatorrule`,
accesspolicymanager: `${Api}/accesspolicymanager`,
dataquality: `${Api}/dataquality`,
activiti:`${Api}/activiti`,
dataculture:`${Api}/dataculture`,
indicator:`${Api}/index`,
dataservice:`${Api}/dataservice`,
pdataservice:`${Api}/pdataservice`,
sttagger:`${Api}/sttagger`,
notice:`${Api}/notice`,
workorder:`${Api}/governworkorder`
}
}
export const colors = {
primary: '#ffbc0c',
secondary: '#db0007'
}
\ No newline at end of file
import request from "../util/request";
import config from "../commons";
import qs from "qs";
const {
api: { tagger },
} = config
export function loadTagCatalogTree(data, successdo, errordo) {
request(
{ url: `${tagger}/tag/loadTagCatalogTree`, method: "get", data: data },
successdo,
errordo
)
}
export function getSupportTagForm(data, successdo, errordo) {
request(
{ url: `${tagger}/tag/getSupportTagForm`, method: "get", data: data },
successdo,
errordo
)
}
export function saveTag(isDefault, data, successdo, errordo) {
request(
{ url: `${tagger}/tag/saveTag?isDefault=${isDefault}`, method: "post", data: data },
successdo,
errordo
)
}
export function deleteTag(id, successdo, errordo) {
request(
{ url: `${tagger}/tag/deleteTag?id=${id}`, method: "delete", data: null },
successdo,
errordo
)
}
export function getTagByKeywordAndCreator(data, successdo, errordo) {
request(
{ url: `${tagger}/tag/getTagByKeywordAndCreator`, method: "get", data: data },
successdo,
errordo
)
}
export function getTagDataById(data, successdo, errordo) {
request(
{ url: `${tagger}/tag/getTagDataById`, method: "get", data: data },
successdo,
errordo
)
}
export function batchAddTagResource(data, successdo, errordo) {
request(
{ url: `${tagger}/tagResource/batchAddTagResource`, method: "post", data: qs.stringify(data) },
successdo,
errordo
)
}
export function newbatchAddTagResource(data, successdo, errordo) {
request(
{ url: `${tagger}/tagResource/batchAddTagResourceMultiTags`, method: "post", data: qs.stringify(data) },
successdo,
errordo
)
}
export function deleteTagResource(data, successdo, errordo) {
request(
{ url: `${tagger}/tagResource/deleteTagResource?esIds=${data}`, method: "delete", data: null },
successdo,
errordo
)
}
export function getResourceTagIn(data, successdo, errordo) {
request(
{ url: `${tagger}/tagResource/getResourceTagIn`, method: "post", data: qs.stringify(data) },
successdo,
errordo
)
}
//通过条件分页获取挂靠资源
export function getTagResourceDataPage(data, successdo, errordo) {
request(
{ url: `${tagger}/tagResource/getTagResourceDataPage`, method: "get", data: data },
successdo,
errordo
)
}
export function getSupportCatalogForm(data, successdo, errordo) {
request(
{ url: `${tagger}/tag/getSupportCatalogForm`, method: "get", data: data },
successdo,
errordo
)
}
export function saveTagCatalog(data, successdo, errordo) {
request(
{ url: `${tagger}/tag/saveTagCatalog`, method: "post", data: data },
successdo,
errordo
)
}
export function getCatalogById(data, successdo, errordo) {
request(
{ url: `${tagger}/tag/getCatalogById`, method: "get", data: data },
successdo,
errordo
)
}
export function deleteCatalog(id, successdo, errordo) {
request(
{ url: `${tagger}/tag/deleteCatalog?id=${id}`, method: "delete", data: null },
successdo,
errordo
)
}
\ No newline at end of file
import axios from "axios"
import pathToRegexp from "path-to-regexp"
import { message } from "antd"
import config from "../commons"
const {page:{loginpage}} =config
axios.interceptors.request.use(
config => {
config.headers.common['WWW-Authenticate']=null;
return config;
},
err => {
return Promise.reject(err);
});
axios.interceptors.response.use(
response => {
return response;
},
error => {
if (error.response) {
switch (error.response.status) {
case 401:
const config = {
content:"身份信息已过期,正在重新验证……",
key:'logout'
}
message.warning(config)
window.location.href=loginpage
}
}
return Promise.reject(error.response.data) // 返回接口返回的错误信息
}
);
const fetch = options => {
let { method = "get", data, url, config, ...opts } = options
try {
// const match = pathToRegexp.parse(url)
url = pathToRegexp.compile(url)(data)
// match.forEach(item => {
// if (item instanceof Object && data[item.name]) {
// delete data[item.name]
// }
// })
// For Ugly IE 304, Must add timestamp
// url = url + `?t=${Date.now()}`
} catch (e) {
//message.error(e.message)
}
switch (method.toLowerCase()) {
case "get":
return axios.get(
url,
{
params: data,
},
config
)
case "delete":
return axios.delete(
url,
{
data: data,
},
config
)
case "post":
return axios.post(url, data, config)
case "put":
return axios.put(url, data, config)
case "patch":
return axios.patch(url, data, config)
default:
return axios(options)
}
}
export default function request(options, successdo, errordo) {
fetch(options)
.then(response => {
//console.log(response)
if(response.status==302){
console.log('redirect')
window.location.reload();
}
//console.log("finish success try")
if(successdo)
successdo(response)
else
message.success('操作成功')
})
.catch(error => {
//console.log('try throw 302')
//console.log(error)
//console.log(error.response)
if(errordo)
errordo(error)
})
}
...@@ -18,6 +18,7 @@ import { FullScreenSvg, CancelFullScreenSvg } from './AssetSvg'; ...@@ -18,6 +18,7 @@ import { FullScreenSvg, CancelFullScreenSvg } from './AssetSvg';
import AssetDeleteModal from './AssetDeleteModal'; import AssetDeleteModal from './AssetDeleteModal';
import { AppContext, appId } from "../../../../App"; import { AppContext, appId } from "../../../../App";
import StartFlowModal from "./StartFlow"; import StartFlowModal from "./StartFlow";
import TagColumnConnect from "../../Tag";
import "./AssetTable.less"; import "./AssetTable.less";
import 'react-contexify/dist/ReactContexify.css'; import 'react-contexify/dist/ReactContexify.css';
...@@ -172,6 +173,8 @@ const AssetTable = (props) => { ...@@ -172,6 +173,8 @@ const AssetTable = (props) => {
const [currentTemplateType, setTemplateType] = useState() const [currentTemplateType, setTemplateType] = useState()
const [sorter, setSorter] = useState() const [sorter, setSorter] = useState()
const [elements, setElements] = useState() const [elements, setElements] = useState()
const [mouseEnterKey,setMouseEnterKey] = useState(null)
const [tableReload,setTableReload] = useState(null)
const [ modal, contextHolder ] = Modal.useModal(); const [ modal, contextHolder ] = Modal.useModal();
const anchorId = getQueryParam(AnchorId, props?.location?.search); const anchorId = getQueryParam(AnchorId, props?.location?.search);
...@@ -186,6 +189,8 @@ const AssetTable = (props) => { ...@@ -186,6 +189,8 @@ const AssetTable = (props) => {
const app = useContext(AppContext) const app = useContext(AppContext)
console.log(app)
const actionCol = { const actionCol = {
title: '操作', title: '操作',
dataIndex: 'action', dataIndex: 'action',
...@@ -215,9 +220,42 @@ const AssetTable = (props) => { ...@@ -215,9 +220,42 @@ const AssetTable = (props) => {
} }
} }
const tagColumns={
title:"标签",
key:"tag",
dataIndex:"tag",
width:200,
onCell:(record)=>{
return ({
onMouseEnter: (event) => {
setMouseEnterKey(record._id);
},
onMouseLeave: (event) => {
setMouseEnterKey(null);
},
})
},
render:(_,record)=>{
const payload = {id:record.id,type:'dataAsset',reload:tableReload,creator:app.user.userName}
console.log('payload',payload)
return (record._id===mouseEnterKey)?<TagColumnConnect {...{...payload,styleType:'complex'}} />:<TagColumnConnect {...payload} />
}
}
useEffect(() => { useEffect(() => {
if (TableWidth>0 && columns.length>0 && (elements??[]).length>0) { if (TableWidth>0 && columns.length>0 && (elements??[]).length>0) {
const newColumns = [...columns??[]]; const newColumns = [...columns??[]].map((column)=>{
return ({...column,onCell:(record)=>{
return({
onClick: (e) => {
setSelectItem(record);
onSelect && onSelect(record?.id, record?.dirId);
setAssetDetailDrawerVisible(true);
},
})
}})
});
const currentWidth = (newColumns.reduce((preVal, col) => (col.width?col.width:0) + preVal, 0)) + 32.0; const currentWidth = (newColumns.reduce((preVal, col) => (col.width?col.width:0) + preVal, 0)) + 32.0;
newColumns.forEach(column => { newColumns.forEach(column => {
...@@ -238,12 +276,12 @@ const AssetTable = (props) => { ...@@ -238,12 +276,12 @@ const AssetTable = (props) => {
} }
}) })
setRealColumns([...newColumns, <Column key='auto' />]); setRealColumns([...newColumns,tagColumns, <Column key='auto' />]);
} else { } else {
setRealColumns([]); setRealColumns([]);
} }
}, [columns, TableWidth, elements, users]) }, [columns, TableWidth, elements, users, mouseEnterKey, tableReload])
useEffect(() => { useEffect(() => {
getUsers(); getUsers();
...@@ -1165,12 +1203,6 @@ const AssetTable = (props) => { ...@@ -1165,12 +1203,6 @@ const AssetTable = (props) => {
onRow={(record) => { onRow={(record) => {
return { return {
id: `data-asset-${record?.id}`, id: `data-asset-${record?.id}`,
onClick: (e) => {
setSelectItem(record);
onSelect && onSelect(record?.id, record?.dirId);
setAssetDetailDrawerVisible(true);
},
onContextMenu: event => { onContextMenu: event => {
// if ((reference===AssetManageReference||(reference===AssetBrowseReference&&record.hasPermission)) && (record.resourceState==='uncombed'||record.resourceState==='notRelatedAsset')) { // if ((reference===AssetManageReference||(reference===AssetBrowseReference&&record.hasPermission)) && (record.resourceState==='uncombed'||record.resourceState==='notRelatedAsset')) {
// setContextMenuItem(record); // setContextMenuItem(record);
......
import React, { useEffect, useState } from 'react';
import { TreeSelect } from 'antd';
import { loadTagCatalogTree } from '../../../../service/TagService';
export interface TreeSelectItemProps {
value?: string | number;
onChange?: (value: string | number) => void;
placeholder?: string;
multiple?: boolean;
style?: React.CSSProperties;
resourceType:string;
session:any;
setSelectTags:any
selectTags:any
}
const TreeSelectItem: React.FC<TreeSelectItemProps> = ({
value,
onChange,
placeholder = '请选择',
multiple = true,
setSelectTags,
selectTags,
resourceType,
session
}) => {
const [treeData, setTreeData] = useState<any>([]);
const [loading,setLoading] = useState(false)
useEffect(() => {
getAllTags()
}, []);
//获取所有标签
const getAllTags = (bol=false) => {
setLoading(true);
loadTagCatalogTree({
isDefault:false,
withTagData: true,
type: 'public',
resourceType:resourceType,
creator: session?.user?.userName||''
}, (data:any) => {
getPrivateTags(data?.data,bol);
}, () => {
setLoading(false);
})
}
//目录树结构修改
const newTreeData = (datas:any,type:any,parentkey=undefined)=>{
try{
let data:any = JSON.parse(JSON.stringify(datas))
let newbox:any = []
for(let node of data){
let box:any = {
title: <div id={`catalog_${type}_${node.id}`}>
<div
style={{
borderRadius:2,
height:14,
border:type==='public'?'2px solid #2db7f5':'2px solid #d4380d',
float:'left',
marginTop:5,
marginRight:4,
}}
/>
<span style={{float:'left'}} >{node.name}</span>
</div>,
key: parentkey?`${parentkey},catalog_${type}_${node.id}`:`catalog_${type}_${node.id}`,
type: 'catalog',
isLeaf: false,
name:node.name,
value:`catalog_${type}_${node.id}`,
selectable:false,
children:[]
}
if(node.children&&node.children[0]){
let childrenBox = newTreeData(node.children,type,node.key)
box.children = childrenBox
}
if(node.tagNode&&node.tagNode[0]){
for(let item of node.tagNode){
box.children.push({
title: item.name,
key: item.id,
type: 'tag',
value:item.id,
isLeaf: true,
name:item.name
})
}
}
newbox.push(box)
}
return newbox
}catch(err){
console.log('err',err)
return []
}
}
//获取私有标签
const getPrivateTags = (publicData:any,reflash=true) => {
console.log(reflash)
loadTagCatalogTree({
isDefault:false,
withTagData: true,
type: 'private',
resourceType:resourceType,
creator: session?.user?.userName||''
}, (data:any) => {
setLoading(false);
try{
let _treeData:any = [];
if ((publicData?.children||[]).length>0) {
let publicbox = newTreeData(publicData.children,'public')
_treeData=_treeData.concat(publicbox)
}
if ((data?.data?.children||[]).length>0) {
let privatebox = newTreeData(data.data.children,'private')
_treeData=_treeData.concat(privatebox)
}
console.log(_treeData)
setTreeData(_treeData);
}catch(err){
console.log('err',err)
}
}, () => {
setLoading(false);
})
}
return (
<TreeSelect
treeData={treeData}
value={selectTags}
placeholder={placeholder}
onChange={(values)=>{setSelectTags(values)}}
allowClear
multiple={multiple}
style={{width:'100%'}}
showSearch
treeNodeFilterProp="title"
filterTreeNode={(input, node:any) =>{
return node?.name?.toLowerCase().indexOf(input.toLowerCase()) >= 0
// return node?.title?.props?.children?.[1]?.toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
// node?.title?.indexOf(input.toLowerCase()) >= 0
}}
/>
);
};
export default TreeSelectItem;
\ No newline at end of file
...@@ -2,12 +2,14 @@ import React, { useEffect, useState } from 'react'; ...@@ -2,12 +2,14 @@ import React, { useEffect, useState } from 'react';
import { Button, Tag, Modal } from 'antd'; import { Button, Tag, Modal } from 'antd';
import { PlusOutlined } from '@ant-design/icons'; import { PlusOutlined } from '@ant-design/icons';
import AddTagModal from './Component/AddTagModal'; import AddTagModal from './Component/AddNewTagModal';
import { dispatch } from '../../../model'; import { dispatch } from '../../../model';
const TagColumn = (props) => { const TagColumn = (props) => {
const { id, type = 'dataAsset', creator = '', styleType = 'simple', onAssetTag } = props; const { id, type = 'dataAsset', creator = '', styleType = 'simple', onAssetTag } = props;
console.log('creator',creator)
const [ ownTags, setOwnTags ] = useState([]); const [ ownTags, setOwnTags ] = useState([]);
const [ addTagModalVisible, setAddTagModalVisible ] = useState(false); const [ addTagModalVisible, setAddTagModalVisible ] = useState(false);
const [modal, contextHolder] = Modal.useModal(); const [modal, contextHolder] = Modal.useModal();
...@@ -149,6 +151,7 @@ const TagColumn = (props) => { ...@@ -149,6 +151,7 @@ const TagColumn = (props) => {
type='text' type='text'
icon={<PlusOutlined />} icon={<PlusOutlined />}
onClick={onAddBtnClick} onClick={onAddBtnClick}
style={{zIndex:100}}
> >
新增标签 新增标签
</Button> </Button>
......
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