Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
szse
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhaochengxiang
szse
Commits
da4a5a83
Commit
da4a5a83
authored
Sep 25, 2025
by
fanyj
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
资产打标签
parent
60b94136
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
905 additions
and
10 deletions
+905
-10
commons.ts
src/commons.ts
+96
-0
TagService.js
src/service/TagService.js
+129
-0
request.js
src/util/request.js
+105
-0
AssetTable.jsx
src/view/Manage/AssetManage/Component/AssetTable.jsx
+41
-9
AddNewTagModal.jsx
src/view/Manage/Tag/Component/AddNewTagModal.jsx
+366
-0
TreeSelectItem.tsx
src/view/Manage/Tag/Component/TreeSelectItem.tsx
+164
-0
index.jsx
src/view/Manage/Tag/index.jsx
+4
-1
No files found.
src/commons.ts
0 → 100644
View file @
da4a5a83
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
src/service/TagService.js
0 → 100644
View file @
da4a5a83
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
src/util/request.js
0 → 100644
View file @
da4a5a83
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
)
})
}
src/view/Manage/AssetManage/Component/AssetTable.jsx
View file @
da4a5a83
...
@@ -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);
...
...
src/view/Manage/Tag/Component/AddNewTagModal.jsx
0 → 100644
View file @
da4a5a83
import
React
,
{
useState
,
useRef
,
useEffect
}
from
'react'
;
import
{
Modal
,
Button
,
AutoComplete
,
Input
,
Avatar
,
Tooltip
,
message
,
Form
,
TreeSelect
}
from
'antd'
;
import
{
connect
}
from
"react-redux"
;
import
{
getTagByKeywordAndCreator
,
batchAddTagResource
,
getSupportTagForm
,
saveTag
,
newbatchAddTagResource
}
from
'../../../../service/TagService'
;
import
'./AddTagModal.less'
;
import
TreeSelectItem
from
'./TreeSelectItem'
;
const
{
TextArea
}
=
Input
;
const
AddTagModal
=
(
props
)
=>
{
const
{
visible
,
onCancel
,
id
,
type
,
creator
,
callback
}
=
props
;
const
[
form
]
=
Form
.
useForm
();
const
[
step
,
setStep
]
=
useState
(
0
);
const
[
keyword
,
setKeyword
]
=
useState
(
''
);
const
[
selectTag
,
setSelectTag
]
=
useState
(
null
);
const
[
matchTags
,
setMatchTags
]
=
useState
([]);
const
[
options
,
setOptions
]
=
useState
();
const
[
confirmLoading
,
setConfirmLoading
]
=
useState
(
false
);
const
[
description
,
setDescription
]
=
useState
(
''
);
const
[
tagFormData
,
setTagFormData
]
=
useState
({});
const
[
selectTags
,
setSelectTags
]
=
useState
([])
const
getTagByKeyword
=
(
value
=
keyword
)
=>
{
getTagByKeywordAndCreator
({
keyword
:
value
,
creator
:
creator
||
''
,
resourceType
:
type
,
},
data
=>
{
setMatchTags
(
data
?.
data
||
[]);
let
tagExsit
=
false
,
_selectTag
=
null
;
const
_options
=
[];
(
data
?.
data
||
[]).
forEach
(
item
=>
{
_options
.
push
({
value
:
item
.
tagId
,
label
:
(
<
div
style=
{
{
display
:
'flex'
,
justifyContent
:
'space-between'
,
}
}
>
{
item
.
name
||
''
}
<
Avatar
shape=
"square"
size=
"small"
title=
{
item
.
type
===
'public'
?
'公共标签'
:
'个人标签'
}
>
{
item
.
type
===
'public'
?
'公'
:
'个'
}
</
Avatar
>
</
div
>
)
});
if
(
value
===
''
||
item
.
name
===
value
)
{
tagExsit
=
true
;
}
if
(
item
.
name
===
value
)
{
_selectTag
=
item
;
}
})
if
(
!
tagExsit
)
{
_options
.
push
({
value
:
-
1
,
label
:
(
<
a
>
{
`创建 ${value||''}`
}
</
a
>
)
})
}
setSelectTag
(
_selectTag
);
setOptions
(
_options
);
})
}
const
onOk
=
()
=>
{
if
(
selectTags
.
length
===
0
)
{
message
.
warning
(
'请先填写标签'
);
return
;
}
if
(
selectTags
.
length
>
0
)
{
setConfirmLoading
(
true
);
newbatchAddTagResource
({
tagIds
:
selectTags
.
join
(
','
),
resourceIds
:
id
,
type
,
creator
:
creator
||
''
},
()
=>
{
reset
();
onCancel
&&
onCancel
(
true
);
callback
?.()
setSelectTags
([])
},
()
=>
{
setConfirmLoading
(
false
);
})
}
else
{
getTagForm
();
}
}
const
cancel
=
()
=>
{
reset
();
onCancel
&&
onCancel
();
}
const
onBack
=
()
=>
{
setStep
(
0
);
}
const
onCreate
=
()
=>
{
form
.
validateFields
().
then
((
data
)
=>
{
setConfirmLoading
(
true
);
let
saveData
=
JSON
.
parse
(
JSON
.
stringify
(
tagFormData
))
for
(
let
item
of
saveData
.
targetParameters
){
item
.
value
=
String
(
data
[
item
.
name
])
}
saveTag
(
false
,
saveData
,(
data
)
=>
{
batchAddTagResource
({
tagId
:
data
?.
data
?.
id
,
resourceIds
:
id
,
type
,
creator
:
creator
||
''
},
()
=>
{
reset
()
onCancel
&&
onCancel
(
true
);
},
()
=>
{
setConfirmLoading
(
false
);
})
},(
err
)
=>
{
setConfirmLoading
(
false
);
console
.
log
(
"err"
,
err
)
})
})
}
const
onFocus
=
()
=>
{
getTagByKeyword
();
}
const
onKeywordChange
=
(
value
)
=>
{
//匹配行被选中时 跳过
if
(
value
!==
undefined
&&
value
!==
null
&&
typeof
(
value
)
!==
'string'
)
return
;
setSelectTag
(
null
);
setKeyword
(
value
||
''
);
getTagByKeyword
(
value
||
''
);
}
//获取新增标签表单
const
getTagForm
=
async
()
=>
{
setConfirmLoading
(
true
);
getSupportTagForm
({
isDefault
:
false
,
type
:
'private'
,
creator
:
creator
||
''
},
data
=>
{
const
_tagForm
=
data
?.
data
||
{};
setTagFormData
(
_tagForm
)
form
.
resetFields
()
setConfirmLoading
(
false
);
setStep
(
1
);
},
()
=>
{
setConfirmLoading
(
false
);
})
}
const
onSelect
=
async
(
value
,
option
)
=>
{
if
(
value
!==-
1
)
{
let
_selectTag
=
null
;
matchTags
.
forEach
(
item
=>
{
if
(
item
.
tagId
===
value
)
{
_selectTag
=
item
;
}
})
setSelectTag
(
_selectTag
);
setKeyword
(
_selectTag
.
name
||
''
);
}
else
{
setSelectTag
(
null
);
getTagForm
()
}
}
const
onDescriptionChange
=
(
e
)
=>
{
setDescription
(
e
.
target
.
value
);
}
const
reset
=
()
=>
{
setConfirmLoading
(
false
);
setStep
(
0
);
setSelectTag
(
null
);
setKeyword
(
''
);
}
let
footer
=
[];
if
(
step
===
0
)
{
footer
=
[
<
Button
key=
"0"
onClick=
{
cancel
}
>
取消
</
Button
>,
<
Button
key=
"1"
type=
"primary"
loading=
{
confirmLoading
}
onClick=
{
onOk
}
// disabled={keyword===''}
>
确定
</
Button
>
];
}
else
if
(
step
===
1
)
{
footer
=
[
<
Button
key=
"0"
onClick=
{
onBack
}
>
返回
</
Button
>,
<
Button
key=
"1"
type=
"primary"
loading=
{
confirmLoading
}
onClick=
{
onCreate
}
>
创建
</
Button
>
];
}
const
formItemLayout
=
{
labelCol
:
{
xs
:
{
span
:
24
},
sm
:
{
span
:
4
},
},
wrapperCol
:
{
xs
:
{
span
:
24
},
sm
:
{
span
:
20
},
},
};
const
newTreeData
=
(
data
)
=>
{
let
box
=
[]
for
(
let
item
of
data
){
let
node
=
{
title
:
item
.
name
,
value
:
item
.
idString
}
if
(
item
.
children
&&
item
.
children
[
0
]){
node
.
children
=
newTreeData
(
item
.
children
)
}
box
.
push
(
node
)
}
return
box
}
return
(
<
Modal
className=
'add-tag-modal'
forceRender
visible=
{
visible
}
title=
{
(
step
===
0
)?
'选择标签'
:
`创建${keyword}`
}
width=
{
520
}
onCancel=
{
cancel
}
footer=
{
footer
}
>
{
/* {
step === 0 && <AutoComplete
style={{ width: '100%' }}
allowClear
value={keyword}
onChange={onKeywordChange}
onFocus={onFocus}
options={options}
onSelect={onSelect}
/>
} */
}
{
step
===
0
&&
<
TreeSelectItem
session=
{
{
user
:{
userName
:
creator
}}
}
resourceType=
{
type
}
selectTags=
{
selectTags
}
setSelectTags=
{
setSelectTags
}
/>
}
{
step
===
1
&&
<
Form
{
...
formItemLayout
}
form=
{
form
}
>
{
tagFormData
&&
tagFormData
.
targetParameters
&&
tagFormData
.
targetParameters
[
0
]?
tagFormData
.
targetParameters
.
map
((
item
,
key
)
=>
{
if
(
item
.
name
===
'catalogId'
){
return
(
<
Form
.
Item
label=
{
item
.
cnName
}
name=
{
item
.
name
}
rules=
{
[{
required
:
item
.
required
,
message
:
`请选择${item.cnName}!`
}]
}
key=
{
`tagFormData${key}`
}
>
<
TreeSelect
style=
{
{
width
:
'100%'
}
}
dropdownStyle=
{
{
maxHeight
:
400
,
overflow
:
'auto'
}
}
treeData=
{
newTreeData
(
item
.
tagCatalogNode
.
children
)
}
treeDefaultExpandAll
/>
</
Form
.
Item
>
)
}
else
if
(
item
.
name
===
'usable'
){
return
(
<
Form
.
Item
label=
{
item
.
cnName
}
name=
{
item
.
name
}
rules=
{
[{
required
:
item
.
required
,
message
:
`请选择${item.cnName}!`
}]
}
initialValue=
"1"
style=
{
{
display
:
'none'
}
}
key=
{
`tagFormData${key}`
}
>
<
Input
disabled
/>
</
Form
.
Item
>
)
}
else
if
(
item
.
name
===
'name'
){
return
(
<
Form
.
Item
label=
{
item
.
cnName
}
name=
{
item
.
name
}
rules=
{
[{
required
:
item
.
required
,
message
:
`请输入${item.cnName}!`
}]
}
initialValue=
{
keyword
}
key=
{
`tagFormData${key}`
}
>
<
Input
disabled
/>
</
Form
.
Item
>
)
}
else
{
return
(
<
Form
.
Item
label=
{
item
.
cnName
}
name=
{
item
.
name
}
rules=
{
[{
required
:
item
.
required
,
message
:
`请输入${item.cnName}!`
}]
}
key=
{
`tagFormData${key}`
}
>
<
Input
/>
</
Form
.
Item
>
)
}
})
:
''
}
</
Form
>
}
</
Modal
>
)
}
export
default
AddTagModal
;
\ No newline at end of file
src/view/Manage/Tag/Component/TreeSelectItem.tsx
0 → 100644
View file @
da4a5a83
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
src/view/Manage/Tag/index.jsx
View file @
da4a5a83
...
@@ -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/Add
New
TagModal'
;
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
>
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment