Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
P
pro-layout
Project
Project
Details
Activity
Releases
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
packages
pro-layout
Commits
6bec1bcd
Commit
6bec1bcd
authored
May 08, 2020
by
Sendya
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: add fixedHeader
parent
12d82f90
Changes
20
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
317 additions
and
67 deletions
+317
-67
package.json
examples/package.json
+1
-1
BasicLayout.jsx
examples/src/layouts/BasicLayout.jsx
+35
-6
BasicLayout.less
examples/src/layouts/BasicLayout.less
+4
-0
en-US.js
examples/src/locales/lang/en-US.js
+10
-1
BasicLayout.jsx
src/BasicLayout.jsx
+19
-5
BasicLayout.less
src/BasicLayout.less
+1
-3
Header.jsx
src/Header.jsx
+39
-13
Header.less
src/Header.less
+7
-0
WrapContent.jsx
src/WrapContent.jsx
+6
-3
index.js
src/components/ConfigProvider/index.js
+3
-1
Fragment.jsx
src/components/Fragment.jsx
+7
-0
index.jsx
src/components/GlobalHeader/index.jsx
+4
-0
index.jsx
src/components/PageHeaderWrapper/index.jsx
+3
-2
BlockCheckbox.jsx
src/components/SettingDrawer/BlockCheckbox.jsx
+26
-3
LayoutChange.jsx
src/components/SettingDrawer/LayoutChange.jsx
+85
-0
ThemeColor.jsx
src/components/SettingDrawer/ThemeColor.jsx
+12
-18
index.jsx
src/components/SettingDrawer/index.jsx
+44
-4
SiderMenu.jsx
src/components/SiderMenu/SiderMenu.jsx
+5
-1
index.js
src/components/index.js
+3
-1
dynamicTheme.js
src/utils/dynamicTheme.js
+3
-5
No files found.
examples/package.json
View file @
6bec1bcd
...
@@ -44,6 +44,6 @@
...
@@ -44,6 +44,6 @@
"vue-svg-icon-loader"
:
"^2.1.1"
,
"vue-svg-icon-loader"
:
"^2.1.1"
,
"vue-template-compiler"
:
"^2.6.10"
,
"vue-template-compiler"
:
"^2.6.10"
,
"webpack-bundle-analyzer"
:
"^3.6.0"
,
"webpack-bundle-analyzer"
:
"^3.6.0"
,
"webpack-theme-color-replacer"
:
"^1.3.
2
"
"webpack-theme-color-replacer"
:
"^1.3.
11
"
}
}
}
}
examples/src/layouts/BasicLayout.jsx
View file @
6bec1bcd
...
@@ -60,6 +60,7 @@ const menuHeaderRender = (h, logo, title) => {
...
@@ -60,6 +60,7 @@ const menuHeaderRender = (h, logo, title) => {
const
rightContentRender
=
(
h
,
props
)
=>
{
const
rightContentRender
=
(
h
,
props
)
=>
{
const
cls
=
{
const
cls
=
{
'ant-pro-global-header-index-right'
:
true
,
'ant-pro-global-header-index-right'
:
true
,
'ant-pro-global-header-topmenu'
:
props
.
isTop
,
[
`ant-pro-global-header-index-
${
props
.
theme
}
`
]:
true
[
`ant-pro-global-header-index-
${
props
.
theme
}
`
]:
true
}
}
return
(
return
(
...
@@ -95,13 +96,15 @@ export default {
...
@@ -95,13 +96,15 @@ export default {
// 媒体查询
// 媒体查询
query
:
{},
query
:
{},
// 布局类型
// 布局类型
layout
:
'
side
menu'
,
// 'sidemenu', 'topmenu'
layout
:
'
top
menu'
,
// 'sidemenu', 'topmenu'
// 定宽: true / 流式: false
// 定宽: true / 流式: false
contentWidth
:
true
,
contentWidth
:
true
,
fixedHeader
:
false
,
fixSiderbar
:
false
,
// 主题 'dark' | 'light'
// 主题 'dark' | 'light'
theme
:
'dark'
,
theme
:
'dark'
,
// 主色调
// 主色调
primaryColor
:
'
daybreak
'
,
primaryColor
:
'
#1890ff
'
,
// 是否手机模式
// 是否手机模式
isMobile
:
false
isMobile
:
false
}
}
...
@@ -109,7 +112,6 @@ export default {
...
@@ -109,7 +112,6 @@ export default {
render
(
h
)
{
render
(
h
)
{
const
{
const
{
collapsed
,
collapsed
,
contentWidth
,
autoHideHeader
,
autoHideHeader
,
layout
,
layout
,
theme
,
theme
,
...
@@ -138,6 +140,25 @@ export default {
...
@@ -138,6 +140,25 @@ export default {
const
handleColorChange
=
(
color
)
=>
{
const
handleColorChange
=
(
color
)
=>
{
this
.
primaryColor
=
color
this
.
primaryColor
=
color
}
}
const
handleLayoutChange
=
(
value
)
=>
{
this
.
layout
=
value
if
(
value
===
'sidemenu'
)
{
this
.
contentWidth
=
false
}
}
const
handleLayoutSttingChange
=
({
type
,
value
})
=>
{
console
.
log
(
'type'
,
type
,
'value'
,
value
)
if
(
type
===
'contentWidth'
)
{
this
.
contentWidth
=
value
===
'Fixed'
}
if
(
type
===
'fixedHeader'
)
{
this
.
fixedHeader
=
value
}
if
(
type
===
'fixSiderbar'
)
{
this
.
fixSiderbar
=
value
}
}
const
cdProps
=
{
const
cdProps
=
{
props
:
{
props
:
{
menus
,
menus
,
...
@@ -147,28 +168,36 @@ export default {
...
@@ -147,28 +168,36 @@ export default {
handleMediaQuery
,
handleMediaQuery
,
handleCollapse
,
handleCollapse
,
layout
,
layout
,
contentWidth
,
contentWidth
:
this
.
contentWidth
,
fixedHeader
:
this
.
fixedHeader
,
fixSiderbar
:
this
.
fixSiderbar
,
theme
,
theme
,
isMobile
:
this
.
isMobile
,
isMobile
:
this
.
isMobile
,
// custom render
// custom render
rightContentRender
,
rightContentRender
,
footerRender
,
footerRender
,
i18nRender
,
i18nRender
,
menuHeaderRender
menuHeaderRender
,
// logo: LogoSvg,
// logo: LogoSvg,
// title: defaultSettings.title
title
:
'Ant Design Pro'
}
}
}
}
return
(
return
(
<
ProLayout
{
...
cdProps
}
>
<
ProLayout
{
...
cdProps
}
>
<
SettingDrawer
<
SettingDrawer
settings=
{
{}
}
navTheme=
{
theme
}
navTheme=
{
theme
}
layout=
{
layout
}
layout=
{
layout
}
primaryColor=
{
primaryColor
}
primaryColor=
{
primaryColor
}
contentWidth=
{
this
.
contentWidth
}
fixedHeader=
{
this
.
fixedHeader
}
fixSiderbar=
{
this
.
fixSiderbar
}
onThemeChange=
{
handleThemeChange
}
onThemeChange=
{
handleThemeChange
}
onColorChange=
{
handleColorChange
}
onColorChange=
{
handleColorChange
}
onLayoutChange=
{
handleLayoutChange
}
onLayoutSettingChange=
{
handleLayoutSttingChange
}
/>
/>
<
router
-
view
/>
<
router
-
view
/>
</
ProLayout
>
</
ProLayout
>
...
...
examples/src/layouts/BasicLayout.less
View file @
6bec1bcd
...
@@ -11,6 +11,10 @@
...
@@ -11,6 +11,10 @@
}
}
}
}
}
}
&.ant-pro-global-header-topmenu {
margin-right: 0;
}
.account {
.account {
.antd-pro-global-header-index-avatar {
.antd-pro-global-header-index-avatar {
margin: ~'calc((@{layout-header-height} - 24px) / 2)' 0;
margin: ~'calc((@{layout-header-height} - 24px) / 2)' 0;
...
...
examples/src/locales/lang/en-US.js
View file @
6bec1bcd
...
@@ -51,5 +51,14 @@ export default {
...
@@ -51,5 +51,14 @@ export default {
'app.setting.pagestyle.dark'
:
'Dark style'
,
'app.setting.pagestyle.dark'
:
'Dark style'
,
'app.setting.pagestyle.realdark'
:
'RealDark style'
,
'app.setting.pagestyle.realdark'
:
'RealDark style'
,
'app.setting.themecolor'
:
'Theme Color'
,
'app.setting.themecolor'
:
'Theme Color'
,
'app.setting.navigationmode'
:
'Navigation Mode'
'app.setting.navigationmode'
:
'Navigation Mode'
,
'app.setting.content-width'
:
'Content Width'
,
'app.setting.fixedheader'
:
'Fixed Header'
,
'app.setting.fixedsidebar'
:
'Fixed Sidebar'
,
'app.setting.sidemenu'
:
'Side Menu Layout'
,
'app.setting.topmenu'
:
'Top Menu Layout'
,
'app.setting.content-width.fixed'
:
'Fixed'
,
'app.setting.content-width.fluid'
:
'Fluid'
,
'app.setting.othersettings'
:
'Other Settings'
,
'app.setting.weakmode'
:
'Weak Mode'
}
}
src/BasicLayout.jsx
View file @
6bec1bcd
...
@@ -67,6 +67,7 @@ const headerRender = (h, props) => {
...
@@ -67,6 +67,7 @@ const headerRender = (h, props) => {
if
(
props
.
headerRender
===
false
)
{
if
(
props
.
headerRender
===
false
)
{
return
null
return
null
}
}
console
.
log
(
'headerRender'
,
props
)
return
<
HeaderView
{
...
{
props
}
}
/>
return
<
HeaderView
{
...
{
props
}
}
/>
}
}
...
@@ -80,12 +81,15 @@ const BasicLayout = {
...
@@ -80,12 +81,15 @@ const BasicLayout = {
const
{
props
,
children
}
=
content
const
{
props
,
children
}
=
content
const
{
const
{
layout
,
layout
,
// contentWidth,
// theme,
// theme,
isMobile
,
collapsed
,
collapsed
,
mediaQuery
,
mediaQuery
,
handleMediaQuery
,
handleMediaQuery
,
handleCollapse
,
handleCollapse
,
contentWidth
,
siderWidth
,
fixSiderbar
,
i18nRender
=
defaultI18nRender
i18nRender
=
defaultI18nRender
}
=
props
}
=
props
...
@@ -93,30 +97,40 @@ const BasicLayout = {
...
@@ -93,30 +97,40 @@ const BasicLayout = {
const
rightContentRender
=
getComponentFromProp
(
content
,
'rightContentRender'
)
const
rightContentRender
=
getComponentFromProp
(
content
,
'rightContentRender'
)
const
collapsedButtonRender
=
getComponentFromProp
(
content
,
'collapsedButtonRender'
)
const
collapsedButtonRender
=
getComponentFromProp
(
content
,
'collapsedButtonRender'
)
const
menuHeaderRender
=
getComponentFromProp
(
content
,
'menuHeaderRender'
)
const
menuHeaderRender
=
getComponentFromProp
(
content
,
'menuHeaderRender'
)
const
isTopMenu
=
layout
===
'topmenu'
const
cdProps
=
{
const
cdProps
=
{
...
props
,
...
props
,
hasSiderMenu
:
!
isTopMenu
,
footerRender
,
footerRender
,
menuHeaderRender
,
menuHeaderRender
,
rightContentRender
,
rightContentRender
,
collapsedButtonRender
collapsedButtonRender
}
}
console
.
log
(
'cdProps'
,
cdProps
)
return
(
return
(
<
ConfigProvider
i18nRender=
{
i18nRender
}
>
<
ConfigProvider
i18nRender=
{
i18nRender
}
contentWidth=
{
contentWidth
}
>
<
ContainerQuery
query=
{
MediaQueryEnum
}
onChange=
{
handleMediaQuery
}
>
<
ContainerQuery
query=
{
MediaQueryEnum
}
onChange=
{
handleMediaQuery
}
>
<
Layout
class=
{
{
'basicLayout'
:
true
,
...
mediaQuery
}
}
>
<
Layout
class=
{
{
'ant-pro-basicLayout'
:
true
,
'ant-pro-topmenu'
:
isTopMenu
,
...
mediaQuery
}
}
>
<
SiderMenuWrapper
<
SiderMenuWrapper
{
...
{
props
:
cdProps
}
}
{
...
{
props
:
cdProps
}
}
collapsed=
{
collapsed
}
collapsed=
{
collapsed
}
onCollapse=
{
handleCollapse
}
onCollapse=
{
handleCollapse
}
/>
/>
<
Layout
class=
{
[
layout
]
}
style=
{
{
paddingLeft
:
'0'
,
minHeight
:
'100vh'
}
}
>
<
Layout
class=
{
[
layout
]
}
style=
{
{
paddingLeft
:
fixSiderbar
?
`${siderWidth}px`
:
'0'
,
minHeight
:
'100vh'
}
}
>
{
headerRender
(
h
,
{
{
headerRender
(
h
,
{
...
cdProps
,
...
cdProps
,
mode
:
'horizontal'
,
mode
:
'horizontal'
,
})
}
})
}
<
WrapContent
class=
"ant-pro-basicLayout-content"
>
<
WrapContent
class=
"ant-pro-basicLayout-content"
contentWidth=
{
contentWidth
}
>
{
children
}
{
children
}
</
WrapContent
>
</
WrapContent
>
<
Layout
.
Footer
>
<
Layout
.
Footer
>
...
...
src/BasicLayout.less
View file @
6bec1bcd
...
@@ -58,10 +58,8 @@
...
@@ -58,10 +58,8 @@
max-height: 100%;
max-height: 100%;
}
}
}
}
}
.basicLayout {
// append hook styles
.ant-layout-sider-children {
.ant-layout-sider-children {
height: 100%;
height: 100%;
...
...
src/Header.jsx
View file @
6bec1bcd
/* eslint-disable */
import
'./Header.less'
import
'./Header.less'
import
{
Layout
}
from
'ant-design-vue'
import
{
Layout
}
from
'ant-design-vue'
import
BaseMenu
from
'./components/RouteMenu/BaseMenu'
import
BaseMenu
from
'./components/RouteMenu/BaseMenu'
import
{
defaultRenderLogoAntTitle
,
SiderMenuProps
}
from
'./components/SiderMenu/SiderMenu'
import
{
defaultRenderLogoAntTitle
,
SiderMenuProps
}
from
'./components/SiderMenu/SiderMenu'
import
GlobalHeader
,
{
GlobalHeaderProps
}
from
'./components/GlobalHeader'
import
GlobalHeader
,
{
GlobalHeaderProps
}
from
'./components/GlobalHeader'
import
{
VueFragment
}
from
'./components'
import
{
isFun
}
from
'./utils/util'
import
{
isFun
}
from
'./utils/util'
const
{
Header
}
=
Layout
const
{
Header
}
=
Layout
...
@@ -24,6 +24,10 @@ export const HeaderViewProps = {
...
@@ -24,6 +24,10 @@ export const HeaderViewProps = {
type
:
[
Function
,
Object
],
type
:
[
Function
,
Object
],
required
:
false
required
:
false
},
},
hasSiderMenu
:
{
type
:
Boolean
,
default
:
false
},
autoHideHeader
:
{
autoHideHeader
:
{
type
:
Boolean
,
type
:
Boolean
,
required
:
true
required
:
true
...
@@ -40,9 +44,6 @@ export const HeaderViewProps = {
...
@@ -40,9 +44,6 @@ export const HeaderViewProps = {
type
:
null
,
type
:
null
,
required
:
false
required
:
false
},
},
siderWidth
:
{
type
:
Number
},
visible
:
{
visible
:
{
type
:
Boolean
,
type
:
Boolean
,
default
:
true
default
:
true
...
@@ -55,7 +56,7 @@ const renderContent = (h, props) => {
...
@@ -55,7 +56,7 @@ const renderContent = (h, props) => {
const
contentWidth
=
props
.
contentWidth
const
contentWidth
=
props
.
contentWidth
const
baseCls
=
'ant-pro-top-nav-header'
const
baseCls
=
'ant-pro-top-nav-header'
const
{
logo
,
title
,
theme
,
isMobile
,
headerRender
,
rightContentRender
}
=
props
const
{
logo
,
title
,
theme
,
isMobile
,
headerRender
,
rightContentRender
}
=
props
const
rightContentProps
=
{
theme
}
const
rightContentProps
=
{
theme
,
isTop
,
isMobile
}
let
defaultDom
=
<
GlobalHeader
{
...
{
props
:
props
}}
/>
let
defaultDom
=
<
GlobalHeader
{
...
{
props
:
props
}}
/>
if
(
isTop
&&
!
isMobile
)
{
if
(
isTop
&&
!
isMobile
)
{
defaultDom
=
(
defaultDom
=
(
...
@@ -63,7 +64,7 @@ const renderContent = (h, props) => {
...
@@ -63,7 +64,7 @@ const renderContent = (h, props) => {
<
div
class=
{
[
`${baseCls}-main`
,
contentWidth
?
'wide'
:
''
]
}
>
<
div
class=
{
[
`${baseCls}-main`
,
contentWidth
?
'wide'
:
''
]
}
>
<
div
class=
{
`${baseCls}-left`
}
>
<
div
class=
{
`${baseCls}-left`
}
>
<
div
class=
{
`${baseCls}-logo`
}
key=
"logo"
id=
"logo"
>
<
div
class=
{
`${baseCls}-logo`
}
key=
"logo"
id=
"logo"
>
{
defaultRenderLogoAntTitle
(
h
,
logo
,
title
,
null
)
}
{
defaultRenderLogoAntTitle
(
h
,
{
logo
,
title
,
menuHeaderRender
:
null
}
)
}
</
div
>
</
div
>
</
div
>
</
div
>
<
div
class=
{
`${baseCls}-menu`
}
style=
{
{
maxWidth
:
`${maxWidth}px`
,
flex
:
1
}
}
>
<
div
class=
{
`${baseCls}-menu`
}
style=
{
{
maxWidth
:
`${maxWidth}px`
,
flex
:
1
}
}
>
...
@@ -86,18 +87,43 @@ const HeaderView = {
...
@@ -86,18 +87,43 @@ const HeaderView = {
render
(
h
)
{
render
(
h
)
{
const
{
const
{
visible
,
visible
,
siderWidth
:
width
,
isMobile
,
layout
,
collapsed
,
siderWidth
,
fixedHeader
,
autoHideHeader
,
autoHideHeader
,
hasSiderMenu
,
}
=
this
.
$props
}
=
this
.
$props
const
props
=
this
.
$props
const
props
=
this
.
$props
const
isTop
=
layout
===
'topmenu'
const
needSettingWidth
=
fixedHeader
&&
hasSiderMenu
&&
!
isTop
&&
!
isMobile
const
className
=
{
'ant-pro-fixed-header'
:
fixedHeader
,
'ant-pro-top-menu'
:
isTop
,
}
// 没有 <></> 暂时代替写法
return
(
return
(
visible
?
(
visible
?
(
<
Header
<
VueFragment
>
style=
{
{
padding
:
0
,
width
,
zIndex
:
2
}
}
{
fixedHeader
&&
<
Header
/>
}
class=
{
autoHideHeader
?
'ant-pro-fixed-header'
:
''
}
<
Header
>
style=
{
{
{
renderContent
(
h
,
props
)
}
padding
:
0
,
</
Header
>
width
:
needSettingWidth
?
`calc(100% - ${collapsed ? 80 : siderWidth}px)`
:
'100%'
,
zIndex
:
9
,
right
:
fixedHeader
?
0
:
undefined
}
}
class=
{
className
}
>
{
renderContent
(
h
,
props
)
}
</
Header
>
</
VueFragment
>
)
:
null
)
:
null
)
)
}
}
...
...
src/Header.less
View file @
6bec1bcd
@import "~ant-design-vue/es/style/themes/default";
@import "~ant-design-vue/es/style/themes/default";
@top-nav-header-prefix-cls: ~'@{ant-prefix}-pro-top-nav-header';
@top-nav-header-prefix-cls: ~'@{ant-prefix}-pro-top-nav-header';
@pro-layout-fixed-header-prefix-cls: ~'@{ant-prefix}-pro-fixed-header';
.@{top-nav-header-prefix-cls} {
.@{top-nav-header-prefix-cls} {
position: relative;
position: relative;
...
@@ -72,6 +73,12 @@
...
@@ -72,6 +73,12 @@
}
}
}
}
.@{pro-layout-fixed-header-prefix-cls} {
z-index: 9;
width: 100%;
transition: width 0.2s;
}
.drop-down {
.drop-down {
&.menu {
&.menu {
.anticon {
.anticon {
...
...
src/WrapContent.jsx
View file @
6bec1bcd
import
PropTypes
from
'ant-design-vue/es/_util/vue-types'
import
PropTypes
from
'ant-design-vue/es/_util/vue-types'
import
{
ConfigProvider
,
Layout
}
from
'ant-design-vue'
import
{
ConfigProvider
,
Layout
}
from
'ant-design-vue'
import
GridContent
from
'./components/GridContent'
const
{
Content
}
=
Layout
const
{
Content
}
=
Layout
const
WrapContentProps
=
{
const
WrapContentProps
=
{
isChildrenLayout
:
PropTypes
.
bool
,
isChildrenLayout
:
PropTypes
.
bool
,
location
:
PropTypes
.
any
,
location
:
PropTypes
.
any
,
contentHeight
:
PropTypes
.
number
contentHeight
:
PropTypes
.
number
,
contentWidth
:
PropTypes
.
bool
}
}
const
WrapContent
=
{
const
WrapContent
=
{
...
@@ -14,7 +16,8 @@ const WrapContent = {
...
@@ -14,7 +16,8 @@ const WrapContent = {
props
:
WrapContentProps
,
props
:
WrapContentProps
,
render
(
h
)
{
render
(
h
)
{
const
{
const
{
isChildrenLayout
isChildrenLayout
,
contentWidth
}
=
this
.
$props
}
=
this
.
$props
return
(
return
(
<
Content
>
<
Content
>
...
@@ -27,7 +30,7 @@ const WrapContent = {
...
@@ -27,7 +30,7 @@ const WrapContent = {
}
}
}
}
>
>
<
div
class=
"ant-pro-basicLayout-children-content-wrap"
>
<
div
class=
"ant-pro-basicLayout-children-content-wrap"
>
{
this
.
$slots
.
default
}
<
GridContent
contentWidth=
{
contentWidth
}
>
{
this
.
$slots
.
default
}
</
GridContent
>
</
div
>
</
div
>
</
ConfigProvider
>
</
ConfigProvider
>
</
Content
>
</
Content
>
...
...
src/components/ConfigProvider/index.js
View file @
6bec1bcd
...
@@ -4,11 +4,13 @@ const ConfigProvider = {
...
@@ -4,11 +4,13 @@ const ConfigProvider = {
name
:
'ProConfigProvider'
,
name
:
'ProConfigProvider'
,
props
:
{
props
:
{
i18nRender
:
PropTypes
.
any
,
i18nRender
:
PropTypes
.
any
,
contentWidth
:
PropTypes
.
bool
,
},
},
provide
()
{
provide
()
{
const
_self
=
this
const
_self
=
this
return
{
return
{
locale
:
_self
.
$props
.
i18nRender
locale
:
_self
.
$props
.
i18nRender
,
contentWidth
:
_self
.
$props
.
contentWidth
}
}
},
},
render
()
{
render
()
{
...
...
src/components/Fragment.jsx
0 → 100644
View file @
6bec1bcd
export
default
{
name
:
'VueFragment'
,
functional
:
true
,
render
(
h
,
ctx
)
{
return
ctx
.
children
.
length
>
1
?
h
(
'div'
,{},
ctx
.
children
)
:
ctx
.
children
}
}
src/components/GlobalHeader/index.jsx
View file @
6bec1bcd
...
@@ -18,6 +18,10 @@ export const GlobalHeaderProps = {
...
@@ -18,6 +18,10 @@ export const GlobalHeaderProps = {
type
:
Boolean
,
type
:
Boolean
,
default
:
()
=>
false
default
:
()
=>
false
},
},
fixedHeader
:
{
type
:
Boolean
,
default
:
false
},
logo
:
{
logo
:
{
type
:
null
,
type
:
null
,
default
:
()
=>
null
default
:
()
=>
null
...
...
src/components/PageHeaderWrapper/index.jsx
View file @
6bec1bcd
...
@@ -130,7 +130,7 @@ const defaultPageHeaderRender = (h, props, pageMeta, i18nRender) => {
...
@@ -130,7 +130,7 @@ const defaultPageHeaderRender = (h, props, pageMeta, i18nRender) => {
const
PageHeaderWrapper
=
{
const
PageHeaderWrapper
=
{
name
:
'PageHeaderWrapper'
,
name
:
'PageHeaderWrapper'
,
props
:
PageHeaderWrapperProps
,
props
:
PageHeaderWrapperProps
,
inject
:
[
'locale'
],
inject
:
[
'locale'
,
'contentWidth'
],
render
(
h
)
{
render
(
h
)
{
const
children
=
this
.
$slots
.
default
const
children
=
this
.
$slots
.
default
const
content
=
getComponentFromProp
(
this
,
'content'
)
const
content
=
getComponentFromProp
(
this
,
'content'
)
...
@@ -139,6 +139,7 @@ const PageHeaderWrapper = {
...
@@ -139,6 +139,7 @@ const PageHeaderWrapper = {
const
pageMeta
=
useContext
(
this
.
$props
.
route
||
this
.
$route
)
const
pageMeta
=
useContext
(
this
.
$props
.
route
||
this
.
$route
)
const
i18n
=
this
.
$props
.
i18nRender
||
this
.
locale
||
defaultI18nRender
const
i18n
=
this
.
$props
.
i18nRender
||
this
.
locale
||
defaultI18nRender
const
contentWidth
=
this
.
$props
.
contentWidth
||
this
.
contentWidth
||
false
// 当未设置 back props 或未监听 @back,不显示 back
// 当未设置 back props 或未监听 @back,不显示 back
const
onBack
=
this
.
$props
.
back
const
onBack
=
this
.
$props
.
back
const
back
=
onBack
&&
(()
=>
{
const
back
=
onBack
&&
(()
=>
{
...
@@ -181,7 +182,7 @@ const PageHeaderWrapper = {
...
@@ -181,7 +182,7 @@ const PageHeaderWrapper = {
<
GridContent
>
{
defaultPageHeaderRender
(
h
,
props
,
pageMeta
,
i18n
)
}
</
GridContent
>
<
GridContent
>
{
defaultPageHeaderRender
(
h
,
props
,
pageMeta
,
i18n
)
}
</
GridContent
>
</
div
>
</
div
>
{
children
?
(
{
children
?
(
<
GridContent
>
<
GridContent
contentWidth=
{
contentWidth
}
>
<
div
class=
{
`${prefixedClassName}-children-content`
}
>
<
div
class=
{
`${prefixedClassName}-children-content`
}
>
{
children
}
{
children
}
</
div
>
</
div
>
...
...
src/components/SettingDrawer/BlockCheckbox.jsx
View file @
6bec1bcd
import
{
Tooltip
,
Icon
}
from
'ant-design-vue'
import
{
Tooltip
,
Icon
}
from
'ant-design-vue'
import
{
defaultI18nRender
}
from
'./index'
const
BlockCheckboxProps
=
{
const
BlockCheckboxProps
=
{
value
:
{
value
:
{
type
:
String
,
type
:
String
,
default
:
null
default
:
null
},
},
// Item: { key, url, title }
list
:
{
list
:
{
type
:
Array
,
type
:
Array
,
default
:
()
=>
[]
default
:
null
}
}
}
}
...
@@ -16,18 +18,39 @@ const baseClassName = 'ant-pro-setting-drawer-block-checbox'
...
@@ -16,18 +18,39 @@ const baseClassName = 'ant-pro-setting-drawer-block-checbox'
const
BlockCheckbox
=
{
const
BlockCheckbox
=
{
props
:
BlockCheckboxProps
,
props
:
BlockCheckboxProps
,
inject
:
[
'locale'
],
render
(
h
)
{
render
(
h
)
{
const
{
value
,
list
}
=
this
const
{
value
,
list
}
=
this
const
i18n
=
this
.
$props
.
i18nRender
||
this
.
locale
||
defaultI18nRender
const
items
=
list
||
[
{
key
:
'sidemenu'
,
url
:
'https://gw.alipayobjects.com/zos/antfincdn/XwFOFbLkSM/LCkqqYNmvBEbokSDscrm.svg'
,
title
:
i18n
(
'app.setting.sidemenu'
),
},
{
key
:
'topmenu'
,
url
:
'https://gw.alipayobjects.com/zos/antfincdn/URETY8%24STp/KDNDBbriJhLwuqMoxcAr.svg'
,
title
:
i18n
(
'app.setting.topmenu'
),
},
]
const
handleChange
=
(
key
)
=>
{
const
handleChange
=
(
key
)
=>
{
this
.
$emit
(
'change'
,
key
)
this
.
$emit
(
'change'
,
key
)
}
}
const
disableStyle
=
{
cursor
:
'not-allowed'
}
return
(
return
(
<
div
class=
{
baseClassName
}
key=
{
value
}
>
<
div
class=
{
baseClassName
}
key=
{
value
}
>
{
list
.
map
(
item
=>
(
{
items
.
map
(
item
=>
(
<
Tooltip
title=
{
item
.
title
}
key=
{
item
.
key
}
>
<
Tooltip
title=
{
item
.
title
}
key=
{
item
.
key
}
>
<
div
class=
{
`${baseClassName}-item`
}
onClick=
{
()
=>
handleChange
(
item
.
key
)
}
>
<
div
class=
{
`${baseClassName}-item`
}
style=
{
item
.
disable
&&
disableStyle
}
onClick=
{
()
=>
!
item
.
disable
&&
handleChange
(
item
.
key
)
}
>
<
img
src=
{
item
.
url
}
alt=
{
item
.
key
}
/>
<
img
src=
{
item
.
url
}
alt=
{
item
.
key
}
/>
<
div
<
div
class=
{
`${baseClassName}-selectIcon`
}
class=
{
`${baseClassName}-selectIcon`
}
...
...
src/components/SettingDrawer/LayoutChange.jsx
0 → 100644
View file @
6bec1bcd
import
PropTypes
from
'ant-design-vue/es/_util/vue-types'
import
{
List
,
Tooltip
,
Select
,
Switch
}
from
'ant-design-vue'
import
{
defaultI18nRender
}
from
'./index'
export
const
renderLayoutSettingItem
=
(
h
,
item
)
=>
{
const
action
=
{...
item
.
action
}
return
(
<
Tooltip
title=
{
item
.
disabled
?
item
.
disabledReason
:
''
}
placement=
"left"
>
<
List
.
Item
actions=
{
[
action
]
}
>
<
span
style=
{
{
opacity
:
item
.
disabled
?
0.5
:
1
}
}
>
{
item
.
title
}
</
span
>
</
List
.
Item
>
</
Tooltip
>
)
}
export
const
LayoutSettingProps
=
{
contentWidth
:
PropTypes
.
bool
,
fixedHeader
:
PropTypes
.
bool
,
fixSiderbar
:
PropTypes
.
bool
,
layout
:
PropTypes
.
oneOf
([
'sidemenu'
,
'topmenu'
])
}
export
default
{
props
:
LayoutSettingProps
,
inject
:
[
'locale'
],
render
(
h
)
{
const
i18n
=
this
.
$props
.
i18nRender
||
this
.
locale
||
defaultI18nRender
const
{
contentWidth
,
fixedHeader
,
layout
,
fixSiderbar
}
=
this
const
handleChange
=
(
type
,
value
)
=>
{
this
.
$emit
(
'change'
,
{
type
,
value
})
}
return
(
<
List
split=
{
false
}
dataSource=
{
[
{
title
:
i18n
(
'app.setting.content-width'
),
action
:
(
<
Select
value=
{
contentWidth
&&
'Fixed'
||
'Fluid'
}
size=
"small"
onSelect=
{
(
value
)
=>
handleChange
(
'contentWidth'
,
value
)
}
style=
{
{
width
:
'80px'
}
}
>
{
layout
===
'sidemenu'
?
null
:
(
<
Select
.
Option
value=
"Fixed"
>
{
i18n
(
'app.setting.content-width.fixed'
)
}
</
Select
.
Option
>
)
}
<
Select
.
Option
value=
"Fluid"
>
{
i18n
(
'app.setting.content-width.fluid'
)
}
</
Select
.
Option
>
</
Select
>
),
},
{
title
:
i18n
(
'app.setting.fixedheader'
),
action
:
(
<
Switch
size=
"small"
checked=
{
!!
fixedHeader
}
onChange=
{
(
checked
)
=>
handleChange
(
'fixedHeader'
,
checked
)
}
/>
),
},
{
title
:
i18n
(
'app.setting.fixedsidebar'
),
disabled
:
layout
===
'topmenu'
,
disabledReason
:
i18n
(
'app.setting.fixedsidebar.hint'
),
action
:
(
<
Switch
size=
"small"
checked=
{
!!
fixSiderbar
}
onChange=
{
(
checked
)
=>
handleChange
(
'fixSiderbar'
,
checked
)
}
/>
),
},
]
}
renderItem=
{
(
item
,
index
)
=>
renderLayoutSettingItem
(
h
,
item
)
}
/>
)
}
}
src/components/SettingDrawer/ThemeColor.jsx
View file @
6bec1bcd
...
@@ -9,16 +9,16 @@ const baseClassName = 'theme-color'
...
@@ -9,16 +9,16 @@ const baseClassName = 'theme-color'
export
const
TagProps
=
{
export
const
TagProps
=
{
color
:
PropTypes
.
string
,
color
:
PropTypes
.
string
,
check
:
PropTypes
.
bool
,
check
:
PropTypes
.
bool
handleClick
:
PropTypes
.
func
,
}
}
const
Tag
=
{
const
Tag
=
{
props
:
TagProps
,
props
:
TagProps
,
render
(
h
)
{
functional
:
true
,
const
{
color
,
check
,
handleClick
}
=
this
render
(
h
,
content
)
{
const
{
props
:
{
color
,
check
},
data
,
...
rest
}
=
content
return
(
return
(
<
div
onClick=
{
handleClick
}
style=
{
{
backgroundColor
:
color
}
}
ref=
"colorRef"
>
<
div
{
...
data
}
style=
{
{
backgroundColor
:
color
}
}
>
{
check
?
<
Icon
type=
"check"
/>
:
null
}
{
check
?
<
Icon
type=
"check"
/>
:
null
}
</
div
>
</
div
>
)
)
...
@@ -34,15 +34,10 @@ export const ThemeColorProps = {
...
@@ -34,15 +34,10 @@ export const ThemeColorProps = {
const
ThemeColor
=
{
const
ThemeColor
=
{
props
:
ThemeColorProps
,
props
:
ThemeColorProps
,
inject
:
[
'locale'
],
render
(
h
)
{
render
(
h
)
{
const
{
title
,
value
,
colors
}
=
this
const
{
title
,
value
,
colors
=
[]
}
=
this
const
i18n
=
this
.
$props
.
i18nRender
||
this
.
locale
||
defaultI18nRender
const
i18n
=
this
.
$props
.
i18nRender
||
this
.
locale
||
defaultI18nRender
const
colorList
=
colors
||
[]
if
(
colorList
.
length
<
1
)
{
return
null
}
const
handleChange
=
(
key
)
=>
{
const
handleChange
=
(
key
)
=>
{
this
.
$emit
(
'change'
,
key
)
this
.
$emit
(
'change'
,
key
)
}
}
...
@@ -51,20 +46,19 @@ const ThemeColor = {
...
@@ -51,20 +46,19 @@ const ThemeColor = {
<
div
class=
{
baseClassName
}
ref=
{
'ref'
}
>
<
div
class=
{
baseClassName
}
ref=
{
'ref'
}
>
<
h3
class=
{
`${baseClassName}-title`
}
>
{
title
}
</
h3
>
<
h3
class=
{
`${baseClassName}-title`
}
>
{
title
}
</
h3
>
<
div
class=
{
`${baseClassName}-content`
}
>
<
div
class=
{
`${baseClassName}-content`
}
>
{
color
List
.
map
(
item
=>
{
{
color
s
.
map
(
item
=>
{
const
themeKey
=
genThemeToString
(
item
.
key
)
const
themeKey
=
genThemeToString
(
item
.
key
)
const
check
=
value
===
item
.
key
||
genThemeToString
(
value
)
===
item
.
key
return
(
return
(
<
Tooltip
<
Tooltip
key=
{
item
.
color
}
key=
{
item
.
color
}
title=
{
title=
{
themeKey
?
i18n
(
`app.setting.themecolor.${themeKey}`
)
:
item
.
key
}
themeKey
?
i18n
(
`app.setting.themecolor.${themeKey}`
)
:
item
.
key
}
>
>
<
Tag
<
Tag
class=
{
`${baseClassName}-block`
}
class=
{
`${baseClassName}-block`
}
color=
{
item
.
color
}
color=
{
item
.
color
}
check=
{
value
===
item
.
key
||
genThemeToString
(
value
)
===
item
.
key
}
check=
{
check
}
handle
Click=
{
()
=>
handleChange
(
item
.
key
)
}
on
Click=
{
()
=>
handleChange
(
item
.
key
)
}
/>
/>
</
Tooltip
>
</
Tooltip
>
)
)
...
...
src/components/SettingDrawer/index.jsx
View file @
6bec1bcd
import
'./index.less'
import
'./index.less'
import
PropTypes
from
'ant-design-vue/es/_util/vue-types'
import
PropTypes
from
'ant-design-vue/es/_util/vue-types'
import
{
Divider
,
Drawer
,
Icon
}
from
'ant-design-vue'
import
{
Divider
,
Drawer
,
List
,
Switch
,
Icon
}
from
'ant-design-vue'
import
BlockCheckbox
from
'./BlockCheckbox'
import
BlockCheckbox
from
'./BlockCheckbox'
import
ThemeColor
from
'./ThemeColor'
import
ThemeColor
from
'./ThemeColor'
import
LayoutSetting
,
{
renderLayoutSettingItem
}
from
'./LayoutChange'
import
{
updateTheme
}
from
'../../utils/dynamicTheme'
import
{
updateTheme
}
from
'../../utils/dynamicTheme'
const
baseClassName
=
'ant-pro-setting-drawer'
const
baseClassName
=
'ant-pro-setting-drawer'
...
@@ -50,7 +51,7 @@ const getThemeList = (i18nRender) => {
...
@@ -50,7 +51,7 @@ const getThemeList = (i18nRender) => {
const
darkColorList
=
[
const
darkColorList
=
[
{
{
key
:
'
daybreak
'
,
key
:
'
#1890ff
'
,
color
:
'#1890ff'
,
color
:
'#1890ff'
,
theme
:
'dark'
,
theme
:
'dark'
,
}
}
...
@@ -58,7 +59,7 @@ const getThemeList = (i18nRender) => {
...
@@ -58,7 +59,7 @@ const getThemeList = (i18nRender) => {
const
lightColorList
=
[
const
lightColorList
=
[
{
{
key
:
'
daybreak
'
,
key
:
'
#1890ff
'
,
color
:
'#1890ff'
,
color
:
'#1890ff'
,
theme
:
'dark'
,
theme
:
'dark'
,
}
}
...
@@ -66,6 +67,8 @@ const getThemeList = (i18nRender) => {
...
@@ -66,6 +67,8 @@ const getThemeList = (i18nRender) => {
if
(
list
.
find
((
item
)
=>
item
.
theme
===
'dark'
))
{
if
(
list
.
find
((
item
)
=>
item
.
theme
===
'dark'
))
{
themeList
.
push
({
themeList
.
push
({
// disable click
disable
:
true
,
key
:
'realDark'
,
key
:
'realDark'
,
url
:
'https://gw.alipayobjects.com/zos/antfincdn/hmKaLQvmY2/LCkqqYNmvBEbokSDscrm.svg'
,
url
:
'https://gw.alipayobjects.com/zos/antfincdn/hmKaLQvmY2/LCkqqYNmvBEbokSDscrm.svg'
,
title
:
i18nRender
(
'app.setting.pagestyle.realdark'
),
title
:
i18nRender
(
'app.setting.pagestyle.realdark'
),
...
@@ -98,7 +101,6 @@ const getThemeList = (i18nRender) => {
...
@@ -98,7 +101,6 @@ const getThemeList = (i18nRender) => {
}
}
const
changeSetting
=
(
key
,
value
,
hideMessageLoading
)
=>
{
const
changeSetting
=
(
key
,
value
,
hideMessageLoading
)
=>
{
console
.
log
(
'handleColorChange'
,
key
,
value
)
if
(
key
===
'navTheme'
)
{
if
(
key
===
'navTheme'
)
{
// 更新主题
// 更新主题
}
}
...
@@ -119,6 +121,9 @@ export const SettingDrawerProps = {
...
@@ -119,6 +121,9 @@ export const SettingDrawerProps = {
primaryColor
:
PropTypes
.
string
,
primaryColor
:
PropTypes
.
string
,
layout
:
PropTypes
.
oneOf
([
'sidemenu'
,
'topmenu'
]),
layout
:
PropTypes
.
oneOf
([
'sidemenu'
,
'topmenu'
]),
colorWeak
:
PropTypes
.
bool
,
colorWeak
:
PropTypes
.
bool
,
contentWidth
:
PropTypes
.
bool
,
fixedHeader
:
PropTypes
.
bool
,
fixSiderbar
:
PropTypes
.
bool
,
}
}
const
SettingDrawer
=
{
const
SettingDrawer
=
{
...
@@ -137,6 +142,9 @@ const SettingDrawer = {
...
@@ -137,6 +142,9 @@ const SettingDrawer = {
navTheme
=
'dark'
,
navTheme
=
'dark'
,
primaryColor
=
'daybreak'
,
primaryColor
=
'daybreak'
,
layout
=
'sidemenu'
,
layout
=
'sidemenu'
,
fixedHeader
=
false
,
fixSiderbar
=
false
,
contentWidth
=
false
,
colorWeak
colorWeak
}
=
this
}
=
this
const
i18n
=
this
.
$props
.
i18nRender
||
this
.
locale
||
defaultI18nRender
const
i18n
=
this
.
$props
.
i18nRender
||
this
.
locale
||
defaultI18nRender
...
@@ -151,6 +159,10 @@ const SettingDrawer = {
...
@@ -151,6 +159,10 @@ const SettingDrawer = {
this
.
$emit
(
'themeChange'
,
key
)
this
.
$emit
(
'themeChange'
,
key
)
}
}
const
handleLayoutSettingChange
=
(
val
)
=>
{
this
.
$emit
(
'layoutSettingChange'
,
val
)
}
return
(
return
(
<
Drawer
<
Drawer
visible=
{
this
.
show
}
visible=
{
this
.
show
}
...
@@ -202,6 +214,34 @@ const SettingDrawer = {
...
@@ -202,6 +214,34 @@ const SettingDrawer = {
}
}
/>
}
}
/>
</
Body
>
</
Body
>
<
LayoutSetting
contentWidth=
{
contentWidth
}
fixedHeader=
{
fixedHeader
}
fixSiderbar=
{
fixSiderbar
}
layout=
{
layout
}
onChange=
{
handleLayoutSettingChange
}
/>
<
Divider
/>
<
Body
title=
{
i18n
(
'app.setting.othersettings'
)
}
>
<
List
split=
{
false
}
renderItem=
{
(
item
)
=>
renderLayoutSettingItem
(
h
,
item
)
}
dataSource=
{
[
{
title
:
i18n
(
'app.setting.weakmode'
),
action
:
(
<
Switch
size=
"small"
checked=
{
!!
colorWeak
}
onChange=
{
(
checked
)
=>
changeSetting
(
'colorWeak'
,
checked
)
}
/>
),
},
]
}
/>
</
Body
>
</
div
>
</
div
>
</
Drawer
>
</
Drawer
>
)
)
...
...
src/components/SiderMenu/SiderMenu.jsx
View file @
6bec1bcd
...
@@ -54,6 +54,10 @@ export const SiderMenuProps = {
...
@@ -54,6 +54,10 @@ export const SiderMenuProps = {
type
:
String
,
type
:
String
,
default
:
'inline'
default
:
'inline'
},
},
fixSiderbar
:
{
type
:
Boolean
,
default
:
false
},
logo
:
{
logo
:
{
type
:
null
,
type
:
null
,
default
:
''
default
:
''
...
@@ -125,7 +129,7 @@ const SiderMenu = {
...
@@ -125,7 +129,7 @@ const SiderMenu = {
i18nRender
,
i18nRender
,
menuHeaderRender
menuHeaderRender
}
=
this
}
=
this
console
.
log
(
'fixSiderbar'
,
fixSiderbar
)
const
siderCls
=
[
'ant-pro-sider-menu-sider'
]
const
siderCls
=
[
'ant-pro-sider-menu-sider'
]
if
(
fixSiderbar
)
siderCls
.
push
(
'fix-sider-bar'
)
if
(
fixSiderbar
)
siderCls
.
push
(
'fix-sider-bar'
)
if
(
theme
===
'light'
)
siderCls
.
push
(
'light'
)
if
(
theme
===
'light'
)
siderCls
.
push
(
'light'
)
...
...
src/components/index.js
View file @
6bec1bcd
...
@@ -2,6 +2,7 @@ import RouteMenu from './RouteMenu'
...
@@ -2,6 +2,7 @@ import RouteMenu from './RouteMenu'
import
SiderMenuWrapper
,
{
SiderMenu
,
SiderMenuProps
}
from
'./SiderMenu'
import
SiderMenuWrapper
,
{
SiderMenu
,
SiderMenuProps
}
from
'./SiderMenu'
import
PageHeaderWrapper
from
'./PageHeaderWrapper'
import
PageHeaderWrapper
from
'./PageHeaderWrapper'
import
GlobalFooter
from
'./GlobalFooter'
import
GlobalFooter
from
'./GlobalFooter'
import
VueFragment
from
'./Fragment'
export
{
export
{
RouteMenu
,
RouteMenu
,
...
@@ -9,5 +10,6 @@ export {
...
@@ -9,5 +10,6 @@ export {
SiderMenuProps
,
SiderMenuProps
,
SiderMenuWrapper
,
SiderMenuWrapper
,
PageHeaderWrapper
,
PageHeaderWrapper
,
GlobalFooter
GlobalFooter
,
VueFragment
}
}
src/utils/dynamicTheme.js
View file @
6bec1bcd
...
@@ -14,7 +14,7 @@ export const themeColor = {
...
@@ -14,7 +14,7 @@ export const themeColor = {
return
lightens
.
concat
(
colorPalettes
).
concat
(
rgb
)
return
lightens
.
concat
(
colorPalettes
).
concat
(
rgb
)
},
},
changeColor
(
newColor
)
{
changeColor
(
newColor
)
{
le
t
options
=
{
cons
t
options
=
{
newColors
:
this
.
getAntdSerials
(
newColor
),
// new colors array, one-to-one corresponde with `matchColors`
newColors
:
this
.
getAntdSerials
(
newColor
),
// new colors array, one-to-one corresponde with `matchColors`
changeUrl
(
cssUrl
)
{
changeUrl
(
cssUrl
)
{
return
`/
${
cssUrl
}
`
// while router is not `hash` mode, it needs absolute path
return
`/
${
cssUrl
}
`
// while router is not `hash` mode, it needs absolute path
...
@@ -26,9 +26,7 @@ export const themeColor = {
...
@@ -26,9 +26,7 @@ export const themeColor = {
export
const
updateTheme
=
newPrimaryColor
=>
{
export
const
updateTheme
=
newPrimaryColor
=>
{
const
hideMessage
=
message
.
loading
(
'正在切换主题'
,
0
)
const
hideMessage
=
message
.
loading
(
'正在切换主题'
,
0
)
themeColor
.
changeColor
(
newPrimaryColor
).
finally
(
t
=>
{
themeColor
.
changeColor
(
newPrimaryColor
).
then
(
r
=>
{
setTimeout
(()
=>
{
hideMessage
()
hideMessage
()
},
1500
)
})
})
}
}
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