Skip to content

Commit 6b5a002

Browse files
mathieutufgiraud
authored and
fgiraud
committed
refactor($theme-default): extract page components (#1427)
* refactor(default-theme): Extract PageEdit component and Extract PageNav component.
1 parent f1703cb commit 6b5a002

File tree

4 files changed

+276
-252
lines changed

4 files changed

+276
-252
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,267 +1,29 @@
11
<template>
22
<main class="page">
3-
<slot name="top"/>
3+
<slot name="top" />
44

5-
<Content class="theme-default-content"/>
5+
<Content />
6+
<PageEdit />
67

7-
<footer class="page-edit">
8-
<div
9-
class="edit-link"
10-
v-if="editLink"
11-
>
12-
<a
13-
:href="editLink"
14-
target="_blank"
15-
rel="noopener noreferrer"
16-
>{{ editLinkText }}</a>
17-
<OutboundLink/>
18-
</div>
8+
<PageNav v-bind="{ sidebarItems }" />
199

20-
<div
21-
class="last-updated"
22-
v-if="lastUpdated"
23-
>
24-
<span class="prefix">{{ lastUpdatedText }}: </span>
25-
<span class="time">{{ lastUpdated }}</span>
26-
</div>
27-
</footer>
28-
29-
<div class="page-nav" v-if="prev || next">
30-
<p class="inner">
31-
<span
32-
v-if="prev"
33-
class="prev"
34-
>
35-
36-
<router-link
37-
v-if="prev"
38-
class="prev"
39-
:to="prev.path"
40-
>
41-
{{ prev.title || prev.path }}
42-
</router-link>
43-
</span>
44-
45-
<span
46-
v-if="next"
47-
class="next"
48-
>
49-
<router-link
50-
v-if="next"
51-
:to="next.path"
52-
>
53-
{{ next.title || next.path }}
54-
</router-link>
55-
56-
</span>
57-
</p>
58-
</div>
59-
60-
<slot name="bottom"/>
10+
<slot name="bottom" />
6111
</main>
6212
</template>
6313

6414
<script>
65-
import isString from 'lodash/isString'
66-
import isNil from 'lodash/isNil'
67-
68-
import { resolvePage, outboundRE, endingSlashRE } from '../util'
15+
import PageEdit from '@theme/components/PageEdit.vue'
16+
import PageNav from '@theme/components/PageNav.vue'
6917
7018
export default {
71-
props: ['sidebarItems'],
72-
73-
computed: {
74-
lastUpdated () {
75-
return this.$page.lastUpdated
76-
},
77-
78-
lastUpdatedText () {
79-
if (typeof this.$themeLocaleConfig.lastUpdated === 'string') {
80-
return this.$themeLocaleConfig.lastUpdated
81-
}
82-
if (typeof this.$site.themeConfig.lastUpdated === 'string') {
83-
return this.$site.themeConfig.lastUpdated
84-
}
85-
return 'Last Updated'
86-
},
87-
88-
prev () {
89-
return resolvePageLink(LINK_TYPES.PREV, this)
90-
},
91-
92-
next () {
93-
return resolvePageLink(LINK_TYPES.NEXT, this)
94-
},
95-
96-
editLink () {
97-
if (this.$page.frontmatter.editLink === false) {
98-
return
99-
}
100-
const {
101-
repo,
102-
editLinks,
103-
docsDir = '',
104-
docsBranch = 'master',
105-
docsRepo = repo
106-
} = this.$site.themeConfig
107-
108-
if (docsRepo && editLinks && this.$page.relativePath) {
109-
return this.createEditLink(repo, docsRepo, docsDir, docsBranch, this.$page.relativePath)
110-
}
111-
},
112-
113-
editLinkText () {
114-
return (
115-
this.$themeLocaleConfig.editLinkText
116-
|| this.$site.themeConfig.editLinkText
117-
|| `Edit this page`
118-
)
119-
}
120-
},
121-
122-
methods: {
123-
createEditLink (repo, docsRepo, docsDir, docsBranch, path) {
124-
const bitbucket = /bitbucket.org/
125-
if (bitbucket.test(repo)) {
126-
const base = outboundRE.test(docsRepo)
127-
? docsRepo
128-
: repo
129-
return (
130-
base.replace(endingSlashRE, '')
131-
+ `/src`
132-
+ `/${docsBranch}/`
133-
+ (docsDir ? docsDir.replace(endingSlashRE, '') + '/' : '')
134-
+ path
135-
+ `?mode=edit&spa=0&at=${docsBranch}&fileviewer=file-view-default`
136-
)
137-
}
138-
139-
const base = outboundRE.test(docsRepo)
140-
? docsRepo
141-
: `https://github.com/${docsRepo}`
142-
return (
143-
base.replace(endingSlashRE, '')
144-
+ `/edit`
145-
+ `/${docsBranch}/`
146-
+ (docsDir ? docsDir.replace(endingSlashRE, '') + '/' : '')
147-
+ path
148-
)
149-
}
150-
}
151-
}
152-
153-
function resolvePrev (page, items) {
154-
return find(page, items, -1)
155-
}
156-
157-
function resolveNext (page, items) {
158-
return find(page, items, 1)
159-
}
160-
161-
const LINK_TYPES = {
162-
NEXT: {
163-
resolveLink: resolveNext,
164-
getThemeLinkConfig: ({ nextLinks }) => nextLinks,
165-
getPageLinkConfig: ({ frontmatter }) => frontmatter.next
166-
},
167-
PREV: {
168-
resolveLink: resolvePrev,
169-
getThemeLinkConfig: ({ prevLinks }) => prevLinks,
170-
getPageLinkConfig: ({ frontmatter }) => frontmatter.prev
171-
}
172-
}
173-
174-
function resolvePageLink (linkType, { $themeConfig, $page, $route, $site, sidebarItems }) {
175-
const { resolveLink, getThemeLinkConfig, getPageLinkConfig } = linkType
176-
177-
// Get link config from theme
178-
const themeLinkConfig = getThemeLinkConfig($themeConfig)
179-
180-
// Get link config from current page
181-
const pageLinkConfig = getPageLinkConfig($page)
182-
183-
// Page link config will overwrite global theme link config if defined
184-
const link = isNil(pageLinkConfig) ? themeLinkConfig : pageLinkConfig
185-
186-
if (link === false) {
187-
return
188-
} else if (isString(link)) {
189-
return resolvePage($site.pages, link, $route.path)
190-
} else {
191-
return resolveLink($page, sidebarItems)
192-
}
193-
}
194-
195-
function find (page, items, offset) {
196-
const res = []
197-
flatten(items, res)
198-
for (let i = 0; i < res.length; i++) {
199-
const cur = res[i]
200-
if (cur.type === 'page' && cur.path === decodeURIComponent(page.path)) {
201-
return res[i + offset]
202-
}
203-
}
19+
components: { PageEdit, PageNav },
20+
props: ['sidebarItems']
20421
}
205-
206-
function flatten (items, res) {
207-
for (let i = 0, l = items.length; i < l; i++) {
208-
if (items[i].type === 'group') {
209-
flatten(items[i].children || [], res)
210-
} else {
211-
res.push(items[i])
212-
}
213-
}
214-
}
215-
21622
</script>
21723

21824
<style lang="stylus">
219-
@require '../styles/wrapper.styl'
220-
221-
.page
222-
padding-bottom 2rem
223-
display block
224-
225-
.page-edit
226-
@extend $wrapper
227-
padding-top 1rem
228-
padding-bottom 1rem
229-
overflow auto
230-
.edit-link
231-
display inline-block
232-
a
233-
color lighten($textColor, 25%)
234-
margin-right 0.25rem
235-
.last-updated
236-
float right
237-
font-size 0.9em
238-
.prefix
239-
font-weight 500
240-
color lighten($textColor, 25%)
241-
.time
242-
font-weight 400
243-
color #aaa
244-
245-
.page-nav
246-
@extend $wrapper
247-
padding-top 1rem
248-
padding-bottom 0
249-
.inner
250-
min-height 2rem
251-
margin-top 0
252-
border-top 1px solid $borderColor
253-
padding-top 1rem
254-
overflow auto // clear float
255-
.next
256-
float right
257-
258-
@media (max-width: $MQMobile)
259-
.page-edit
260-
.edit-link
261-
margin-bottom .5rem
262-
.last-updated
263-
font-size .8em
264-
float none
265-
text-align left
266-
25+
.page {
26+
padding-bottom: 2rem;
27+
display: block;
28+
}
26729
</style>

0 commit comments

Comments
 (0)