Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
C
cocktail-party-server
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
cocktail-party
cocktail-party-server
Commits
bb5520a7
提交
bb5520a7
authored
5月 30, 2020
作者:
RuoYi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
当tags-view滚动关闭右键菜单
上级
1e2058bd
显示空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
85 行增加
和
91 行删除
+85
-91
element-ui.scss
ruoyi-ui/src/assets/styles/element-ui.scss
+1
-1
ScrollPane.vue
ruoyi-ui/src/layout/components/TagsView/ScrollPane.vue
+9
-0
index.vue
ruoyi-ui/src/layout/components/TagsView/index.vue
+75
-90
没有找到文件。
ruoyi-ui/src/assets/styles/element-ui.scss
浏览文件 @
bb5520a7
...
...
@@ -31,7 +31,7 @@
.fixed-width
{
.el-button--mini
{
padding
:
7px
10px
;
width
:
60px
;
min-
width
:
60px
;
}
}
...
...
ruoyi-ui/src/layout/components/TagsView/ScrollPane.vue
浏览文件 @
bb5520a7
...
...
@@ -19,12 +19,21 @@ export default {
return
this
.
$refs
.
scrollContainer
.
$refs
.
wrap
}
},
mounted
()
{
this
.
scrollWrapper
.
addEventListener
(
'scroll'
,
this
.
emitScroll
,
true
)
},
beforeDestroy
()
{
this
.
scrollWrapper
.
removeEventListener
(
'scroll'
,
this
.
emitScroll
)
},
methods
:
{
handleScroll
(
e
)
{
const
eventDelta
=
e
.
wheelDelta
||
-
e
.
deltaY
*
40
const
$scrollWrapper
=
this
.
scrollWrapper
$scrollWrapper
.
scrollLeft
=
$scrollWrapper
.
scrollLeft
+
eventDelta
/
4
},
emitScroll
()
{
this
.
$emit
(
'scroll'
)
},
moveToTarget
(
currentTag
)
{
const
$container
=
this
.
$refs
.
scrollContainer
.
$el
const
$containerWidth
=
$container
.
offsetWidth
...
...
ruoyi-ui/src/layout/components/TagsView/index.vue
浏览文件 @
bb5520a7
<
template
>
<div
id=
"tags-view-container"
class=
"tags-view-container"
>
<scroll-pane
ref=
"scrollPane"
class=
"tags-view-wrapper
"
>
<scroll-pane
ref=
"scrollPane"
class=
"tags-view-wrapper"
@
scroll=
"handleScroll
"
>
<router-link
v-for=
"tag in visitedViews"
ref=
"tag"
...
...
@@ -14,11 +14,7 @@
@contextmenu.prevent.native="openMenu(tag,$event)"
>
{{
tag
.
title
}}
<span
v-if=
"!isAffix(tag)"
class=
"el-icon-close"
@
click
.
prevent
.
stop=
"closeSelectedTag(tag)"
/>
<span
v-if=
"!isAffix(tag)"
class=
"el-icon-close"
@
click
.
prevent
.
stop=
"closeSelectedTag(tag)"
/>
</router-link>
</scroll-pane>
<ul
v-show=
"visible"
:style=
"
{left:left+'px',top:top+'px'}" class="contextmenu">
...
...
@@ -31,8 +27,8 @@
</
template
>
<
script
>
import
ScrollPane
from
"./ScrollPane"
;
import
path
from
"path"
;
import
ScrollPane
from
'./ScrollPane'
import
path
from
'path'
export
default
{
components
:
{
ScrollPane
},
...
...
@@ -43,14 +39,14 @@ export default {
left
:
0
,
selectedTag
:
{},
affixTags
:
[]
};
}
},
computed
:
{
visitedViews
()
{
return
this
.
$store
.
state
.
tagsView
.
visitedViews
;
return
this
.
$store
.
state
.
tagsView
.
visitedViews
},
routes
()
{
return
this
.
$store
.
state
.
permission
.
routes
;
return
this
.
$store
.
state
.
permission
.
routes
},
theme
()
{
return
this
.
$store
.
state
.
settings
.
theme
;
...
...
@@ -58,24 +54,24 @@ export default {
},
watch
:
{
$route
()
{
this
.
addTags
();
this
.
moveToCurrentTag
();
this
.
addTags
()
this
.
moveToCurrentTag
()
},
visible
(
value
)
{
if
(
value
)
{
document
.
body
.
addEventListener
(
"click"
,
this
.
closeMenu
);
document
.
body
.
addEventListener
(
'click'
,
this
.
closeMenu
)
}
else
{
document
.
body
.
removeEventListener
(
"click"
,
this
.
closeMenu
);
document
.
body
.
removeEventListener
(
'click'
,
this
.
closeMenu
)
}
}
},
mounted
()
{
this
.
initTags
();
this
.
addTags
();
this
.
initTags
()
this
.
addTags
()
},
methods
:
{
isActive
(
route
)
{
return
route
.
path
===
this
.
$route
.
path
;
return
route
.
path
===
this
.
$route
.
path
},
activeStyle
(
tag
)
{
if
(
!
this
.
isActive
(
tag
))
return
{};
...
...
@@ -85,142 +81,131 @@ export default {
};
},
isAffix
(
tag
)
{
return
tag
.
meta
&&
tag
.
meta
.
affix
;
return
tag
.
meta
&&
tag
.
meta
.
affix
},
filterAffixTags
(
routes
,
basePath
=
"/"
)
{
let
tags
=
[];
filterAffixTags
(
routes
,
basePath
=
'/'
)
{
let
tags
=
[]
routes
.
forEach
(
route
=>
{
if
(
route
.
meta
&&
route
.
meta
.
affix
)
{
const
tagPath
=
path
.
resolve
(
basePath
,
route
.
path
);
const
tagPath
=
path
.
resolve
(
basePath
,
route
.
path
)
tags
.
push
({
fullPath
:
tagPath
,
path
:
tagPath
,
name
:
route
.
name
,
meta
:
{
...
route
.
meta
}
});
})
}
if
(
route
.
children
)
{
const
tempTags
=
this
.
filterAffixTags
(
route
.
children
,
route
.
path
);
const
tempTags
=
this
.
filterAffixTags
(
route
.
children
,
route
.
path
)
if
(
tempTags
.
length
>=
1
)
{
tags
=
[...
tags
,
...
tempTags
];
tags
=
[...
tags
,
...
tempTags
]
}
}
});
return
tags
;
})
return
tags
},
initTags
()
{
const
affixTags
=
(
this
.
affixTags
=
this
.
filterAffixTags
(
this
.
routes
));
const
affixTags
=
this
.
affixTags
=
this
.
filterAffixTags
(
this
.
routes
)
for
(
const
tag
of
affixTags
)
{
// Must have tag name
if
(
tag
.
name
)
{
this
.
$store
.
dispatch
(
"tagsView/addVisitedView"
,
tag
);
this
.
$store
.
dispatch
(
'tagsView/addVisitedView'
,
tag
)
}
}
},
addTags
()
{
const
{
name
}
=
this
.
$route
;
const
{
name
}
=
this
.
$route
if
(
name
)
{
this
.
$store
.
dispatch
(
"tagsView/addView"
,
this
.
$route
);
this
.
$store
.
dispatch
(
'tagsView/addView'
,
this
.
$route
)
}
return
false
;
return
false
},
moveToCurrentTag
()
{
const
tags
=
this
.
$refs
.
tag
;
const
tags
=
this
.
$refs
.
tag
this
.
$nextTick
(()
=>
{
for
(
const
tag
of
tags
)
{
if
(
tag
.
to
.
path
===
this
.
$route
.
path
)
{
this
.
$refs
.
scrollPane
.
moveToTarget
(
tag
);
this
.
$refs
.
scrollPane
.
moveToTarget
(
tag
)
// when query is different then update
if
(
tag
.
to
.
fullPath
!==
this
.
$route
.
fullPath
)
{
this
.
$store
.
dispatch
(
"tagsView/updateVisitedView"
,
this
.
$route
);
this
.
$store
.
dispatch
(
'tagsView/updateVisitedView'
,
this
.
$route
)
}
break
;
break
}
}
});
})
},
refreshSelectedTag
(
view
)
{
this
.
$store
.
dispatch
(
"tagsView/delCachedView"
,
view
).
then
(()
=>
{
const
{
fullPath
}
=
view
;
this
.
$store
.
dispatch
(
'tagsView/delCachedView'
,
view
).
then
(()
=>
{
const
{
fullPath
}
=
view
this
.
$nextTick
(()
=>
{
this
.
$router
.
replace
({
path
:
"/redirect"
+
fullPath
});
});
});
path
:
'/redirect'
+
fullPath
})
})
})
},
closeSelectedTag
(
view
)
{
this
.
$store
.
dispatch
(
"tagsView/delView"
,
view
)
.
then
(({
visitedViews
})
=>
{
this
.
$store
.
dispatch
(
'tagsView/delView'
,
view
).
then
(({
visitedViews
})
=>
{
if
(
this
.
isActive
(
view
))
{
this
.
toLastView
(
visitedViews
,
view
);
this
.
toLastView
(
visitedViews
,
view
)
}
});
})
},
closeOthersTags
()
{
this
.
$router
.
push
(
this
.
selectedTag
);
this
.
$store
.
dispatch
(
"tagsView/delOthersViews"
,
this
.
selectedTag
)
.
then
(()
=>
{
this
.
moveToCurrentTag
();
});
this
.
$router
.
push
(
this
.
selectedTag
)
this
.
$store
.
dispatch
(
'tagsView/delOthersViews'
,
this
.
selectedTag
).
then
(()
=>
{
this
.
moveToCurrentTag
()
})
},
closeAllTags
(
view
)
{
this
.
$store
.
dispatch
(
"tagsView/delAllViews"
)
.
then
(({
visitedViews
})
=>
{
this
.
$store
.
dispatch
(
'tagsView/delAllViews'
).
then
(({
visitedViews
})
=>
{
if
(
this
.
affixTags
.
some
(
tag
=>
tag
.
path
===
view
.
path
))
{
return
;
return
}
this
.
toLastView
(
visitedViews
,
view
);
});
this
.
toLastView
(
visitedViews
,
view
)
})
},
toLastView
(
visitedViews
,
view
)
{
const
latestView
=
visitedViews
.
slice
(
-
1
)[
0
];
const
latestView
=
visitedViews
.
slice
(
-
1
)[
0
]
if
(
latestView
)
{
this
.
$router
.
push
(
latestView
.
fullPath
);
this
.
$router
.
push
(
latestView
.
fullPath
)
}
else
{
// now the default is to redirect to the home page if there is no tags-view,
// you can adjust it according to your needs.
if
(
view
.
name
===
"Dashboard"
)
{
if
(
view
.
name
===
'Dashboard'
)
{
// to reload home page
this
.
$router
.
replace
({
path
:
"/redirect"
+
view
.
fullPath
});
this
.
$router
.
replace
({
path
:
'/redirect'
+
view
.
fullPath
})
}
else
{
this
.
$router
.
push
(
"/"
);
this
.
$router
.
push
(
'/'
)
}
}
},
openMenu
(
tag
,
e
)
{
const
menuMinWidth
=
105
;
const
offsetLeft
=
this
.
$el
.
getBoundingClientRect
().
left
;
// container margin left
const
offsetWidth
=
this
.
$el
.
offsetWidth
;
// container width
const
maxLeft
=
offsetWidth
-
menuMinWidth
;
// left boundary
const
left
=
e
.
clientX
-
offsetLeft
+
15
;
// 15: margin right
const
menuMinWidth
=
105
const
offsetLeft
=
this
.
$el
.
getBoundingClientRect
().
left
// container margin left
const
offsetWidth
=
this
.
$el
.
offsetWidth
// container width
const
maxLeft
=
offsetWidth
-
menuMinWidth
// left boundary
const
left
=
e
.
clientX
-
offsetLeft
+
15
// 15: margin right
if
(
left
>
maxLeft
)
{
this
.
left
=
maxLeft
;
this
.
left
=
maxLeft
}
else
{
this
.
left
=
left
;
this
.
left
=
left
}
this
.
top
=
e
.
clientY
;
this
.
visible
=
true
;
this
.
selectedTag
=
tag
;
this
.
top
=
e
.
clientY
this
.
visible
=
true
this
.
selectedTag
=
tag
},
closeMenu
()
{
this
.
visible
=
false
;
this
.
visible
=
false
},
handleScroll
()
{
this
.
closeMenu
()
}
}
}
;
}
</
script
>
<
style
lang=
"scss"
scoped
>
...
...
@@ -229,7 +214,7 @@ export default {
width
:
100%
;
background
:
#fff
;
border-bottom
:
1px
solid
#d8dce5
;
box-shadow
:
0
1px
3px
0
rgba
(
0
,
0
,
0
,
0
.12
)
,
0
0
3px
0
rgba
(
0
,
0
,
0
,
0
.04
);
box-shadow
:
0
1px
3px
0
rgba
(
0
,
0
,
0
,
.12
)
,
0
0
3px
0
rgba
(
0
,
0
,
0
,
.04
);
.tags-view-wrapper
{
.tags-view-item
{
display
:
inline-block
;
...
...
@@ -255,7 +240,7 @@ export default {
color
:
#fff
;
border-color
:
#42b983
;
&
:
:
before
{
content
:
""
;
content
:
''
;
background
:
#fff
;
display
:
inline-block
;
width
:
8px
;
...
...
@@ -278,7 +263,7 @@ export default {
font-size
:
12px
;
font-weight
:
400
;
color
:
#333
;
box-shadow
:
2px
2px
3px
0
rgba
(
0
,
0
,
0
,
0
.3
);
box-shadow
:
2px
2px
3px
0
rgba
(
0
,
0
,
0
,
.3
);
li
{
margin
:
0
;
padding
:
7px
16px
;
...
...
@@ -301,10 +286,10 @@ export default {
vertical-align
:
2px
;
border-radius
:
50%
;
text-align
:
center
;
transition
:
all
0
.3s
cubic-bezier
(
0
.645
,
0
.045
,
0
.355
,
1
);
transition
:
all
.3s
cubic-bezier
(
.645
,
.045
,
.355
,
1
);
transform-origin
:
100%
50%
;
&
:before
{
transform
:
scale
(
0
.6
);
transform
:
scale
(
.6
);
display
:
inline-block
;
vertical-align
:
-3px
;
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论