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
68ae8ccf
Commit
68ae8ccf
authored
Jul 23, 2021
by
Sendya
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: some custom render
parent
75c71052
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
113 additions
and
55 deletions
+113
-55
App.vue
examples/App.vue
+7
-8
BasicLayout.vue
examples/layouts/BasicLayout.vue
+42
-6
RouteView.vue
examples/layouts/RouteView.vue
+3
-0
main.ts
examples/main.ts
+5
-3
router.ts
examples/router.ts
+21
-12
shims-vue.d.ts
examples/shims-vue.d.ts
+4
-3
package.json
package.json
+1
-1
BasicLayout.tsx
src/BasicLayout.tsx
+15
-5
GridContent.less
src/GridContent/GridContent.less
+0
-11
Header.tsx
src/Header.tsx
+6
-1
index.tsx
src/PageContainer/index.tsx
+1
-1
BaseMenu.tsx
src/SiderMenu/BaseMenu.tsx
+1
-0
SiderMenu.tsx
src/SiderMenu/SiderMenu.tsx
+3
-1
shims-vue.d.ts
src/shims-vue.d.ts
+4
-3
No files found.
examples/App.vue
View file @
68ae8ccf
<
template
>
<
template
>
<a-config-provider
:get
PopupC
ontainer=
"getPopupContainer"
>
<a-config-provider
:get
-popup-c
ontainer=
"getPopupContainer"
>
<router-view
/>
<router-view
/>
</a-config-provider>
</a-config-provider>
</
template
>
</
template
>
...
@@ -12,15 +12,14 @@ export default defineComponent({
...
@@ -12,15 +12,14 @@ export default defineComponent({
setup
()
{
setup
()
{
const
getPopupContainer
=
(
el
:
Element
,
dialogContext
:
any
)
=>
{
const
getPopupContainer
=
(
el
:
Element
,
dialogContext
:
any
)
=>
{
if
(
dialogContext
)
{
if
(
dialogContext
)
{
return
dialogContext
.
getDialogWrap
();
return
dialogContext
.
getDialogWrap
();
}
else
{
}
return
document
.
body
;
return
document
.
body
;
}
};
}
return
{
return
{
getPopupContainer
,
getPopupContainer
,
}
}
;
}
}
,
});
});
</
script
>
</
script
>
...
...
examples/layouts/BasicLayout.vue
View file @
68ae8ccf
...
@@ -4,14 +4,30 @@
...
@@ -4,14 +4,30 @@
v-model:selectedKeys=
"baseState.selectedKeys"
v-model:selectedKeys=
"baseState.selectedKeys"
v-model:openKeys=
"baseState.openKeys"
v-model:openKeys=
"baseState.openKeys"
v-bind=
"state"
v-bind=
"state"
:collapsed-button-render=
"false"
:breadcrumb=
"
{ routes: breadcrumb }"
>
>
<template
#
collapsedButtonRender
>
<!-- only work layout `Side` -->
<a-button>
abc
</a-button>
<template
#
headerContentRender
>
<a
:style=
"
{ margin: '0 8px', fontSize: '20px' }" @click="handleCollapsed">
<MenuUnfoldOutlined
v-if=
"baseState.collapsed"
/>
<MenuFoldOutlined
v-else
/>
</a>
<span>
some..
</span>
</
template
>
</
template
>
<!-- custom right-content -->
<!-- custom right-content -->
<
template
#
rightContentRender
>
<
template
#
rightContentRender
>
<span
style=
"color: #0f0"
>
right
</span>
<span
style=
"color: #0f0"
>
right
</span>
</
template
>
</
template
>
<!-- custom breadcrumb itemRender -->
<
template
#
breadcrumbRender=
"{ route, params, routes, paths }"
>
<span
v-if=
"routes.indexOf(route) === routes.length - 1"
>
{{
route
.
breadcrumbName
}}
</span>
<router-link
v-else
:to=
"
{ path: paths.join('/'), params }">
{{
route
.
breadcrumbName
}}
</router-link>
</
template
>
<!-- content begin -->
<!-- content begin -->
<router-view
/>
<router-view
/>
<!-- content end -->
<!-- content end -->
...
@@ -41,7 +57,7 @@
...
@@ -41,7 +57,7 @@
</template>
</template>
<
script
lang=
"ts"
>
<
script
lang=
"ts"
>
import
{
defineComponent
,
reactive
,
watchEffect
}
from
'vue'
;
import
{
computed
,
defineComponent
,
reactive
,
watchEffect
}
from
'vue'
;
import
{
useRouter
}
from
'vue-router'
;
import
{
useRouter
}
from
'vue-router'
;
import
{
Button
,
Switch
,
Select
,
Space
}
from
'ant-design-vue'
;
import
{
Button
,
Switch
,
Select
,
Space
}
from
'ant-design-vue'
;
import
{
getMenuData
,
clearMenuItem
,
FooterToolbar
}
from
'@ant-design-vue/pro-layout'
;
import
{
getMenuData
,
clearMenuItem
,
FooterToolbar
}
from
'@ant-design-vue/pro-layout'
;
...
@@ -61,8 +77,8 @@ export default defineComponent({
...
@@ -61,8 +77,8 @@ export default defineComponent({
},
},
setup
()
{
setup
()
{
const
router
=
useRouter
();
const
router
=
useRouter
();
const
{
menuData
}
=
getMenuData
(
clearMenuItem
(
router
.
getRoutes
()));
const
{
menuData
}
=
getMenuData
(
clearMenuItem
(
router
.
getRoutes
()));
const
baseState
=
reactive
<
Omit
<
RouteContextProps
,
'menuData'
>>
({
const
baseState
=
reactive
<
Omit
<
RouteContextProps
,
'menuData'
>>
({
selectedKeys
:
[],
selectedKeys
:
[],
openKeys
:
[],
openKeys
:
[],
...
@@ -75,19 +91,39 @@ export default defineComponent({
...
@@ -75,19 +91,39 @@ export default defineComponent({
splitMenus
:
false
,
splitMenus
:
false
,
title
:
'ProLayout'
,
title
:
'ProLayout'
,
logo
:
'https://alicdn.antdv.com/v2/assets/logo.1ef800a8.svg'
,
logo
:
'https://alicdn.antdv.com/v2/assets/logo.1ef800a8.svg'
,
navTheme
:
'
light
'
,
navTheme
:
'
dark
'
,
layout
:
'mix'
,
layout
:
'mix'
,
});
});
const
breadcrumb
=
computed
(()
=>
router
.
currentRoute
.
value
.
matched
.
concat
().
map
(
item
=>
{
return
{
path
:
item
.
path
,
breadcrumbName
:
item
.
meta
.
title
||
''
,
};
}),
);
const
handleCollapsed
=
()
=>
{
baseState
.
collapsed
=
!
baseState
.
collapsed
;
};
watchEffect
(()
=>
{
watchEffect
(()
=>
{
if
(
router
.
currentRoute
)
{
if
(
router
.
currentRoute
)
{
baseState
.
selectedKeys
=
router
.
currentRoute
.
value
.
matched
.
concat
().
map
(
r
=>
r
.
path
);
const
matched
=
router
.
currentRoute
.
value
.
matched
.
concat
();
baseState
.
selectedKeys
=
matched
.
map
(
r
=>
r
.
path
);
baseState
.
openKeys
=
matched
.
filter
(
r
=>
r
.
path
!==
router
.
currentRoute
.
value
.
path
)
.
map
(
r
=>
r
.
path
);
console
.
log
(
'baseState'
,
baseState
);
}
}
});
});
return
{
return
{
i18n
,
i18n
,
baseState
,
baseState
,
state
,
state
,
breadcrumb
,
handleCollapsed
,
};
};
},
},
});
});
...
...
examples/layouts/RouteView.vue
0 → 100644
View file @
68ae8ccf
<
template
>
<router-view
/>
</
template
>
examples/main.ts
View file @
68ae8ccf
import
'ant-design-vue/es/style'
;
import
{
ConfigProvider
}
from
'ant-design-vue'
;
import
{
createApp
}
from
'vue'
;
import
{
createApp
}
from
'vue'
;
import
router
from
'./router'
;
import
router
from
'./router'
;
import
icons
from
'./icons'
;
import
icons
from
'./icons'
;
import
App
from
'./App.vue'
;
import
App
from
'./App.vue'
;
import
{
ConfigProvider
}
from
'ant-design-vue'
;
import
ProLayout
,
{
PageContainer
}
from
'../src'
;
import
'ant-design-vue/es/style'
;
import
'../dist/style.less'
;
import
ProLayout
,
{
PageContainer
}
from
'../src'
;
// '../dist/pro-layout.es';
const
app
=
createApp
(
App
);
const
app
=
createApp
(
App
);
app
.
use
(
router
);
app
.
use
(
router
);
...
...
examples/router.ts
View file @
68ae8ccf
import
{
createRouter
,
createWebHistory
}
from
'vue-router'
;
import
{
createRouter
,
createWebHistory
}
from
'vue-router'
;
import
type
{
RouteRecordRaw
}
from
'vue-router'
;
import
type
{
RouteRecordRaw
}
from
'vue-router'
;
import
BasicLayout
from
'./layouts/BasicLayout.vue'
;
import
BasicLayout
from
'./layouts/BasicLayout.vue'
;
import
RouteView
from
'./layouts/RouteView.vue'
;
const
routes
:
RouteRecordRaw
[]
=
[
const
routes
:
RouteRecordRaw
[]
=
[
{
{
path
:
'/'
,
path
:
'/'
,
name
:
'index'
,
name
:
'index'
,
meta
:
{
title
:
''
},
meta
:
{
title
:
'
Home
'
},
component
:
BasicLayout
,
component
:
BasicLayout
,
redirect
:
'/
monitor
'
,
redirect
:
'/
dashboard
'
,
children
:
[
children
:
[
{
{
path
:
'/dashboard'
,
path
:
'/dashboard'
,
name
:
'dashboard'
,
name
:
'dashboard'
,
meta
:
{
title
:
'Dashboard'
,
icon
:
'SettingOutlined'
},
meta
:
{
title
:
'Dashboard'
},
component
:
()
=>
import
(
'./views/page1.vue'
),
redirect
:
'/dashboard/monitor'
,
},
component
:
RouteView
,
{
children
:
[
path
:
'/monitor'
,
{
name
:
'monitor'
,
path
:
'workspace'
,
meta
:
{
title
:
'Monitor'
,
icon
:
'DatabaseOutlined'
},
name
:
'workspace'
,
component
:
()
=>
import
(
'./views/page2.vue'
),
meta
:
{
title
:
'Dashboard'
,
icon
:
'SettingOutlined'
},
component
:
()
=>
import
(
'./views/page1.vue'
),
},
{
path
:
'monitor'
,
name
:
'monitor'
,
meta
:
{
title
:
'Monitor'
,
icon
:
'DatabaseOutlined'
},
component
:
()
=>
import
(
'./views/page2.vue'
),
},
],
},
},
],
],
},
},
...
@@ -28,6 +38,5 @@ const routes: RouteRecordRaw[] = [
...
@@ -28,6 +38,5 @@ const routes: RouteRecordRaw[] = [
export
default
createRouter
({
export
default
createRouter
({
history
:
createWebHistory
(),
history
:
createWebHistory
(),
routes
:
routes
,
routes
,
});
});
examples/shims-vue.d.ts
View file @
68ae8ccf
declare
module
'*.vue'
{
declare
module
'*.vue'
{
import
{
DefineComponent
}
from
'vue'
import
{
DefineComponent
}
from
'vue'
;
const
component
:
DefineComponent
<
{},
{},
any
>
export
default
component
const
component
:
DefineComponent
<
{},
{},
any
>
;
export
default
component
;
}
}
package.json
View file @
68ae8ccf
{
{
"name"
:
"@ant-design-vue/pro-layout"
,
"name"
:
"@ant-design-vue/pro-layout"
,
"version"
:
"3.1.0-alpha.
4
"
,
"version"
:
"3.1.0-alpha.
5
"
,
"license"
:
"
MIT
"
,
"license"
:
"
MIT
"
,
"files"
:
[
"files"
:
[
"dist"
,
"dist"
,
...
...
src/BasicLayout.tsx
View file @
68ae8ccf
...
@@ -55,6 +55,10 @@ export const basicLayoutProps = {
...
@@ -55,6 +55,10 @@ export const basicLayoutProps = {
type
:
[
Object
,
Function
,
Boolean
]
as
PropType
<
WithFalse
<
BreadcrumbProps
[
'itemRender'
]
>>
,
type
:
[
Object
,
Function
,
Boolean
]
as
PropType
<
WithFalse
<
BreadcrumbProps
[
'itemRender'
]
>>
,
default
:
()
=>
{},
default
:
()
=>
{},
},
},
headerContentRender
:
{
type
:
[
Function
,
Object
,
Boolean
]
as
PropType
<
WithFalse
<
()
=>
CustomRender
>>
,
default
:
()
=>
undefined
,
},
headerRender
:
{
headerRender
:
{
type
:
[
Object
,
Function
,
Boolean
]
as
PropType
<
type
:
[
Object
,
Function
,
Boolean
]
as
PropType
<
WithFalse
<
(
props
:
any
/* HeaderProps */
)
=>
CustomRender
>
WithFalse
<
(
props
:
any
/* HeaderProps */
)
=>
CustomRender
>
...
@@ -148,7 +152,7 @@ const ProLayout = defineComponent({
...
@@ -148,7 +152,7 @@ const ProLayout = defineComponent({
const
headerRender
=
(
const
headerRender
=
(
p
:
BasicLayoutProps
&
{
p
:
BasicLayoutProps
&
{
hasSiderMenu
:
boolean
;
hasSiderMenu
:
boolean
;
customH
eaderRender
:
WithFalse
<
CustomRender
>
;
h
eaderRender
:
WithFalse
<
CustomRender
>
;
rightContentRender
:
WithFalse
<
CustomRender
>
;
rightContentRender
:
WithFalse
<
CustomRender
>
;
},
},
matchMenuKeys
?:
string
[],
matchMenuKeys
?:
string
[],
...
@@ -158,14 +162,18 @@ const ProLayout = defineComponent({
...
@@ -158,14 +162,18 @@ const ProLayout = defineComponent({
}
}
return
<
Header
{
...
p
}
matchMenuKeys=
{
matchMenuKeys
||
[]
}
/>;
return
<
Header
{
...
p
}
matchMenuKeys=
{
matchMenuKeys
||
[]
}
/>;
};
};
const
collapsedButtonRender
=
const
collapsedButtonRender
=
getPropsSlot
(
slots
,
props
,
'collapsedButtonRender'
);
props
.
collapsedButtonRender
===
false
?
false
:
getPropsSlot
(
slots
,
props
,
'collapsedButtonRender'
);
const
headerContentRender
=
getPropsSlot
(
slots
,
props
,
'headerContentRender'
);
const
rightContentRender
=
getPropsSlot
(
slots
,
props
,
'rightContentRender'
);
const
rightContentRender
=
getPropsSlot
(
slots
,
props
,
'rightContentRender'
);
const
customHeaderRender
=
getPropsSlot
(
slots
,
props
,
'headerRender'
);
const
customHeaderRender
=
getPropsSlot
(
slots
,
props
,
'headerRender'
);
const
menuHeaderRender
=
getPropsSlot
(
slots
,
props
,
'menuHeaderRender'
);
const
menuHeaderRender
=
getPropsSlot
(
slots
,
props
,
'menuHeaderRender'
);
const
footerRender
=
getPropsSlot
(
slots
,
props
,
'footerRender'
);
const
footerRender
=
getPropsSlot
(
slots
,
props
,
'footerRender'
);
// const menuRender = getPropsSlot(slots, props, 'menuRender');
// const menuRender = getPropsSlot(slots, props, 'menuRender');
const
breadcrumbRender
=
props
[
'breadcrumbRender'
]
||
slots
[
'breadcrumbRender'
];
const
breadcrumbRender
=
props
[
'breadcrumbRender'
]
||
slots
[
'breadcrumbRender'
];
const
headerDom
=
computed
(()
=>
const
headerDom
=
computed
(()
=>
headerRender
(
headerRender
(
{
{
...
@@ -177,22 +185,24 @@ const ProLayout = defineComponent({
...
@@ -177,22 +185,24 @@ const ProLayout = defineComponent({
onOpenKeys
,
onOpenKeys
,
onSelect
,
onSelect
,
onMenuHeaderClick
,
onMenuHeaderClick
,
customHeaderRender
,
rightContentRender
,
rightContentRender
,
headerTitleRender
:
menuHeaderRender
,
headerTitleRender
:
menuHeaderRender
,
headerContentRender
:
headerContentRender
,
headerRender
:
customHeaderRender
,
theme
:
(
props
.
navTheme
||
'dark'
).
toLocaleLowerCase
().
includes
(
'dark'
)
?
'dark'
:
'light'
,
theme
:
(
props
.
navTheme
||
'dark'
).
toLocaleLowerCase
().
includes
(
'dark'
)
?
'dark'
:
'light'
,
},
},
props
.
matchMenuKeys
,
props
.
matchMenuKeys
,
),
),
);
);
console
.
log
(
'refProps.breadcrumb'
,
refProps
.
breadcrumb
);
const
routeContext
=
reactive
({
const
routeContext
=
reactive
({
getPrefixCls
,
getPrefixCls
,
// ...props,
// ...props,
locale
:
refProps
.
locale
.
value
||
defaultRouteContext
.
locale
,
locale
:
refProps
.
locale
.
value
||
defaultRouteContext
.
locale
,
breadcrumb
:
computed
(()
=>
{
breadcrumb
:
computed
(()
=>
{
return
{
return
{
...
refP
rops
.
breadcrumb
,
...
p
rops
.
breadcrumb
,
itemRender
:
breadcrumbRender
,
itemRender
:
breadcrumbRender
,
};
};
}),
}),
...
...
src/GridContent/GridContent.less
deleted
100644 → 0
View file @
75c71052
@import 'ant-design-vue/es/style/themes/default.less';
@pro-layout-grid-content-prefix-cls: ~'@{ant-prefix}-pro-grid-content';
.@{pro-layout-grid-content-prefix-cls} {
width: 100%;
&.wide {
max-width: 1200px;
margin: 0 auto;
}
}
\ No newline at end of file
src/Header.tsx
View file @
68ae8ccf
...
@@ -58,6 +58,7 @@ export const HeaderView = defineComponent({
...
@@ -58,6 +58,7 @@ export const HeaderView = defineComponent({
const
needFixedHeader
=
computed
(
const
needFixedHeader
=
computed
(
()
=>
fixedHeader
.
value
||
context
.
fixedHeader
||
layout
.
value
===
'mix'
,
()
=>
fixedHeader
.
value
||
context
.
fixedHeader
||
layout
.
value
===
'mix'
,
);
);
const
isMix
=
computed
(()
=>
layout
.
value
===
'mix'
);
const
isTop
=
computed
(()
=>
layout
.
value
===
'top'
);
const
isTop
=
computed
(()
=>
layout
.
value
===
'top'
);
const
needSettingWidth
=
computed
(
const
needSettingWidth
=
computed
(
()
=>
needFixedHeader
.
value
&&
hasSiderMenu
.
value
&&
!
isTop
.
value
&&
!
isMobile
.
value
,
()
=>
needFixedHeader
.
value
&&
hasSiderMenu
.
value
&&
!
isTop
.
value
&&
!
isMobile
.
value
,
...
@@ -76,7 +77,11 @@ export const HeaderView = defineComponent({
...
@@ -76,7 +77,11 @@ export const HeaderView = defineComponent({
const
renderContent
=
()
=>
{
const
renderContent
=
()
=>
{
let
defaultDom
=
(
let
defaultDom
=
(
<
GlobalHeader
{
...
props
}
onCollapse=
{
onCollapse
.
value
}
menuData=
{
clearMenuData
.
value
}
>
<
GlobalHeader
{
...
props
}
onCollapse=
{
onCollapse
.
value
}
menuData=
{
clearMenuData
.
value
}
>
{
props
.
headerContentRender
&&
props
.
headerContentRender
(
props
)
}
{
!
isMix
.
value
?
props
.
headerContentRender
&&
typeof
props
.
headerContentRender
===
'function'
?
props
.
headerContentRender
(
props
)
:
props
.
headerContentRender
:
null
}
</
GlobalHeader
>
</
GlobalHeader
>
);
);
if
(
isTop
.
value
&&
!
isMobile
.
value
)
{
if
(
isTop
.
value
&&
!
isMobile
.
value
)
{
...
...
src/PageContainer/index.tsx
View file @
68ae8ccf
...
@@ -210,7 +210,7 @@ const defaultPageHeaderRender = (
...
@@ -210,7 +210,7 @@ const defaultPageHeaderRender = (
}
}
const
breadcrumb
=
restProps
.
breadcrumb
||
{
const
breadcrumb
=
restProps
.
breadcrumb
||
{
routes
:
unref
(
value
.
breadcrumb
?.
routes
)
,
routes
:
value
.
breadcrumb
?.
routes
,
itemRender
:
value
.
breadcrumb
?.
itemRender
,
itemRender
:
value
.
breadcrumb
?.
itemRender
,
};
};
// inject value
// inject value
...
...
src/SiderMenu/BaseMenu.tsx
View file @
68ae8ccf
...
@@ -254,6 +254,7 @@ export default defineComponent({
...
@@ -254,6 +254,7 @@ export default defineComponent({
})
=>
{
})
=>
{
emit
(
'click'
,
args
);
emit
(
'click'
,
args
);
};
};
console
.
log
(
'openKeys'
,
props
.
openKeys
);
return
()
=>
(
return
()
=>
(
<
Menu
<
Menu
key=
"Menu"
key=
"Menu"
...
...
src/SiderMenu/SiderMenu.tsx
View file @
68ae8ccf
...
@@ -172,7 +172,9 @@ const SiderMenu: FC<SiderMenuProps> = (props: SiderMenuProps) => {
...
@@ -172,7 +172,9 @@ const SiderMenu: FC<SiderMenuProps> = (props: SiderMenuProps) => {
[
`
${
baseClassName
}
-fixed`
]:
context
.
fixSiderbar
,
[
`
${
baseClassName
}
-fixed`
]:
context
.
fixSiderbar
,
};
};
});
});
const
hasSide
=
computed
(()
=>
(
props
.
layout
===
'mix'
&&
props
.
splitMenus
)
||
false
);
const
hasSide
=
computed
(
()
=>
((
props
.
layout
===
'mix'
||
props
.
layout
===
'side'
)
&&
props
.
splitMenus
)
||
false
,
);
const
flatMenuData
=
computed
(()
=>
{
const
flatMenuData
=
computed
(()
=>
{
return
(
hasSide
.
value
&&
getMenuFirstChildren
(
context
.
menuData
,
context
.
selectedKeys
[
0
]))
||
[];
return
(
hasSide
.
value
&&
getMenuFirstChildren
(
context
.
menuData
,
context
.
selectedKeys
[
0
]))
||
[];
});
});
...
...
src/shims-vue.d.ts
View file @
68ae8ccf
declare
module
'*.vue'
{
declare
module
'*.vue'
{
import
{
DefineComponent
}
from
'vue'
import
{
DefineComponent
}
from
'vue'
;
const
component
:
DefineComponent
<
{},
{},
any
>
export
default
component
const
component
:
DefineComponent
<
{},
{},
any
>
;
export
default
component
;
}
}
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