Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
W
wiki-js
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
1
Merge Requests
1
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Registry
Registry
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Jacklull
wiki-js
Commits
acc3b736
You need to sign in or sign up before continuing.
Unverified
Commit
acc3b736
authored
Nov 01, 2022
by
Nicolas Giard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: page TOC + refactor PageDataDialog to composition API
parent
85a74aa3
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
109 additions
and
180 deletions
+109
-180
common.js
server/controllers/common.js
+13
-61
page.js
server/graph/resolvers/page.js
+4
-1
page.graphql
server/graph/schemas/page.graphql
+2
-1
pages.js
server/models/pages.js
+1
-0
render-page.js
server/tasks/workers/render-page.js
+2
-2
PageDataDialog.vue
ux/src/components/PageDataDialog.vue
+58
-49
PageDataTemplateDialog.vue
ux/src/components/PageDataTemplateDialog.vue
+0
-0
PagePropertiesDialog.vue
ux/src/components/PagePropertiesDialog.vue
+3
-2
Index.vue
ux/src/pages/Index.vue
+20
-63
page.js
ux/src/stores/page.js
+6
-1
No files found.
server/controllers/common.js
View file @
acc3b736
...
@@ -153,6 +153,11 @@ router.get(['/d', '/d/*'], async (req, res, next) => {
...
@@ -153,6 +153,11 @@ router.get(['/d', '/d/*'], async (req, res, next) => {
*/
*/
router
.
get
([
'/_edit'
,
'/_edit/*'
],
async
(
req
,
res
,
next
)
=>
{
router
.
get
([
'/_edit'
,
'/_edit/*'
],
async
(
req
,
res
,
next
)
=>
{
const
pageArgs
=
pageHelper
.
parsePath
(
req
.
path
,
{
stripExt
:
true
})
const
pageArgs
=
pageHelper
.
parsePath
(
req
.
path
,
{
stripExt
:
true
})
const
site
=
await
WIKI
.
db
.
sites
.
getSiteByHostname
({
hostname
:
req
.
hostname
})
if
(
!
site
)
{
throw
new
Error
(
'INVALID_SITE'
)
}
if
(
pageArgs
.
path
===
''
)
{
if
(
pageArgs
.
path
===
''
)
{
return
res
.
redirect
(
`/_edit/home`
)
return
res
.
redirect
(
`/_edit/home`
)
...
@@ -175,10 +180,10 @@ router.get(['/_edit', '/_edit/*'], async (req, res, next) => {
...
@@ -175,10 +180,10 @@ router.get(['/_edit', '/_edit/*'], async (req, res, next) => {
// -> Get page data from DB
// -> Get page data from DB
let
page
=
await
WIKI
.
db
.
pages
.
getPageFromDb
({
let
page
=
await
WIKI
.
db
.
pages
.
getPageFromDb
({
siteId
:
site
.
id
,
path
:
pageArgs
.
path
,
path
:
pageArgs
.
path
,
locale
:
pageArgs
.
locale
,
locale
:
pageArgs
.
locale
,
userId
:
req
.
user
.
id
,
userId
:
req
.
user
.
id
isPrivate
:
false
})
})
pageArgs
.
tags
=
_
.
get
(
page
,
'tags'
,
[])
pageArgs
.
tags
=
_
.
get
(
page
,
'tags'
,
[])
...
@@ -415,6 +420,11 @@ router.get('/*', async (req, res, next) => {
...
@@ -415,6 +420,11 @@ router.get('/*', async (req, res, next) => {
const
stripExt
=
_
.
some
(
WIKI
.
data
.
pageExtensions
,
ext
=>
_
.
endsWith
(
req
.
path
,
`.
${
ext
}
`
))
const
stripExt
=
_
.
some
(
WIKI
.
data
.
pageExtensions
,
ext
=>
_
.
endsWith
(
req
.
path
,
`.
${
ext
}
`
))
const
pageArgs
=
pageHelper
.
parsePath
(
req
.
path
,
{
stripExt
})
const
pageArgs
=
pageHelper
.
parsePath
(
req
.
path
,
{
stripExt
})
const
isPage
=
(
stripExt
||
pageArgs
.
path
.
indexOf
(
'.'
)
===
-
1
)
const
isPage
=
(
stripExt
||
pageArgs
.
path
.
indexOf
(
'.'
)
===
-
1
)
const
site
=
await
WIKI
.
db
.
sites
.
getSiteByHostname
({
hostname
:
req
.
hostname
})
if
(
!
site
)
{
throw
new
Error
(
'INVALID_SITE'
)
}
if
(
isPage
)
{
if
(
isPage
)
{
// if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) {
// if (WIKI.config.lang.namespacing && !pageArgs.explicitLocale) {
...
@@ -426,6 +436,7 @@ router.get('/*', async (req, res, next) => {
...
@@ -426,6 +436,7 @@ router.get('/*', async (req, res, next) => {
try
{
try
{
// -> Get Page from cache
// -> Get Page from cache
const
page
=
await
WIKI
.
db
.
pages
.
getPage
({
const
page
=
await
WIKI
.
db
.
pages
.
getPage
({
siteId
:
site
.
id
,
path
:
pageArgs
.
path
,
path
:
pageArgs
.
path
,
locale
:
pageArgs
.
locale
,
locale
:
pageArgs
.
locale
,
userId
:
req
.
user
.
id
userId
:
req
.
user
.
id
...
@@ -470,67 +481,8 @@ router.get('/*', async (req, res, next) => {
...
@@ -470,67 +481,8 @@ router.get('/*', async (req, res, next) => {
})
})
}
}
// -> Build sidebar navigation
let
sdi
=
1
const
sidebar
=
(
await
WIKI
.
db
.
navigation
.
getTree
({
cache
:
true
,
locale
:
pageArgs
.
locale
,
groups
:
req
.
user
.
groups
})).
map
(
n
=>
({
i
:
`sdi-
${
sdi
++
}
`
,
k
:
n
.
kind
,
l
:
n
.
label
,
c
:
n
.
icon
,
y
:
n
.
targetType
,
t
:
n
.
target
}))
// -> Build theme code injection
const
injectCode
=
{
css
:
''
,
// WIKI.config.theming.injectCSS,
head
:
''
,
// WIKI.config.theming.injectHead,
body
:
''
// WIKI.config.theming.injectBody
}
// Handle missing extra field
page
.
extra
=
page
.
extra
||
{
css
:
''
,
js
:
''
}
if
(
!
_
.
isEmpty
(
page
.
extra
.
css
))
{
injectCode
.
css
=
`
${
injectCode
.
css
}
\n
${
page
.
extra
.
css
}
`
}
if
(
!
_
.
isEmpty
(
page
.
extra
.
js
))
{
injectCode
.
body
=
`
${
injectCode
.
body
}
\n
${
page
.
extra
.
js
}
`
}
// -> Convert page TOC
if
(
!
_
.
isString
(
page
.
toc
))
{
page
.
toc
=
JSON
.
stringify
(
page
.
toc
)
}
// -> Inject comments variables
const
commentTmpl
=
{
codeTemplate
:
''
,
// WIKI.data.commentProvider.codeTemplate,
head
:
''
,
// WIKI.data.commentProvider.head,
body
:
''
,
// WIKI.data.commentProvider.body,
main
:
''
// WIKI.data.commentProvider.main
}
if
(
false
&&
WIKI
.
config
.
features
.
featurePageComments
&&
WIKI
.
data
.
commentProvider
.
codeTemplate
)
{
[
{
key
:
'pageUrl'
,
value
:
`
${
WIKI
.
config
.
host
}
/i/
${
page
.
id
}
`
},
{
key
:
'pageId'
,
value
:
page
.
id
}
].
forEach
((
cfg
)
=>
{
commentTmpl
.
head
=
_
.
replace
(
commentTmpl
.
head
,
new
RegExp
(
`{{
${
cfg
.
key
}
}}`
,
'g'
),
cfg
.
value
)
commentTmpl
.
body
=
_
.
replace
(
commentTmpl
.
body
,
new
RegExp
(
`{{
${
cfg
.
key
}
}}`
,
'g'
),
cfg
.
value
)
commentTmpl
.
main
=
_
.
replace
(
commentTmpl
.
main
,
new
RegExp
(
`{{
${
cfg
.
key
}
}}`
,
'g'
),
cfg
.
value
)
})
}
// -> Render view
// -> Render view
res
.
sendFile
(
path
.
join
(
WIKI
.
ROOTPATH
,
'assets/index.html'
))
res
.
sendFile
(
path
.
join
(
WIKI
.
ROOTPATH
,
'assets/index.html'
))
// res.render('page', {
// page,
// sidebar,
// injectCode,
// comments: commentTmpl,
// effectivePermissions
// })
}
else
if
(
pageArgs
.
path
===
'home'
)
{
}
else
if
(
pageArgs
.
path
===
'home'
)
{
res
.
redirect
(
'/_welcome'
)
res
.
redirect
(
'/_welcome'
)
}
else
{
}
else
{
...
...
server/graph/resolvers/page.js
View file @
acc3b736
...
@@ -166,7 +166,10 @@ module.exports = {
...
@@ -166,7 +166,10 @@ module.exports = {
*/
*/
async
pageByPath
(
obj
,
args
,
context
,
info
)
{
async
pageByPath
(
obj
,
args
,
context
,
info
)
{
const
pageArgs
=
pageHelper
.
parsePath
(
args
.
path
)
const
pageArgs
=
pageHelper
.
parsePath
(
args
.
path
)
let
page
=
await
WIKI
.
db
.
pages
.
getPageFromDb
(
pageArgs
)
let
page
=
await
WIKI
.
db
.
pages
.
getPageFromDb
({
...
pageArgs
,
siteId
:
args
.
siteId
})
if
(
page
)
{
if
(
page
)
{
return
{
return
{
...
page
,
...
page
,
...
...
server/graph/schemas/page.graphql
View file @
acc3b736
...
@@ -35,6 +35,7 @@ extend type Query {
...
@@ -35,6 +35,7 @@ extend type Query {
):
Page
):
Page
pageByPath
(
pageByPath
(
siteId
:
UUID
!
path
:
String
!
path
:
String
!
):
Page
):
Page
...
@@ -173,7 +174,7 @@ type Page {
...
@@ -173,7 +174,7 @@ type Page {
tags
:
[
PageTag
]
tags
:
[
PageTag
]
content
:
String
content
:
String
render
:
String
render
:
String
toc
:
String
toc
:
[
JSON
]
contentType
:
String
contentType
:
String
createdAt
:
Date
createdAt
:
Date
updatedAt
:
Date
updatedAt
:
Date
...
...
server/models/pages.js
View file @
acc3b736
...
@@ -1010,6 +1010,7 @@ module.exports = class Page extends Model {
...
@@ -1010,6 +1010,7 @@ module.exports = class Page extends Model {
.
where
(
queryModeID
?
{
.
where
(
queryModeID
?
{
'pages.id'
:
opts
'pages.id'
:
opts
}
:
{
}
:
{
'pages.siteId'
:
opts
.
siteId
,
'pages.path'
:
opts
.
path
,
'pages.path'
:
opts
.
path
,
'pages.localeCode'
:
opts
.
locale
'pages.localeCode'
:
opts
.
locale
})
})
...
...
server/tasks/workers/render-page.js
View file @
acc3b736
...
@@ -62,8 +62,8 @@ module.exports = async ({ payload }) => {
...
@@ -62,8 +62,8 @@ module.exports = async ({ payload }) => {
$
(
'.toc-anchor'
,
el
).
remove
()
$
(
'.toc-anchor'
,
el
).
remove
()
_
.
get
(
toc
,
leafPath
).
push
({
_
.
get
(
toc
,
leafPath
).
push
({
title
:
_
.
trim
(
$
(
el
).
text
()),
label
:
_
.
trim
(
$
(
el
).
text
()),
anchor
:
leafSlug
,
key
:
leafSlug
.
substring
(
1
)
,
children
:
[]
children
:
[]
})
})
})
})
...
...
ux/src/components/PageDataDialog.vue
View file @
acc3b736
<
template
lang=
"pug"
>
<
template
lang=
"pug"
>
q-card.page-data-dialog(style='width: 750px;')
q-card.page-data-dialog(style='width: 750px;')
q-toolbar.bg-primary.text-white.flex
q-toolbar.bg-primary.text-white.flex
.text-subtitle2
{{
$
t
(
'editor.pageData.title'
)
}}
.text-subtitle2
{{
t
(
'editor.pageData.title'
)
}}
q-space
q-space
q-btn(
q-btn(
icon='las la-times'
icon='las la-times'
...
@@ -10,13 +10,13 @@ q-card.page-data-dialog(style='width: 750px;')
...
@@ -10,13 +10,13 @@ q-card.page-data-dialog(style='width: 750px;')
v-close-popup
v-close-popup
)
)
q-card-section.page-data-dialog-selector
q-card-section.page-data-dialog-selector
//- .text-overline.text-white
{{
$
t
(
'editor.pageData.template'
)
}}
//- .text-overline.text-white
{{
t
(
'editor.pageData.template'
)
}}
.flex.q-gutter-sm
.flex.q-gutter-sm
q-select(
q-select(
dark
dark
v-model='templateId'
v-model='
state.
templateId'
:label='
$
t(`editor.pageData.template`)'
:label='t(`editor.pageData.template`)'
:aria-label='
$
t(`editor.pageData.template`)'
:aria-label='t(`editor.pageData.template`)'
:options='templates'
:options='templates'
option-value='id'
option-value='id'
map-options
map-options
...
@@ -28,14 +28,14 @@ q-card.page-data-dialog(style='width: 750px;')
...
@@ -28,14 +28,14 @@ q-card.page-data-dialog(style='width: 750px;')
q-btn.acrylic-btn(
q-btn.acrylic-btn(
dark
dark
icon='las la-pen'
icon='las la-pen'
:label='
$
t(`common.actions.manage`)'
:label='t(`common.actions.manage`)'
unelevated
unelevated
no-caps
no-caps
color='deep-orange-9'
color='deep-orange-9'
@click='editTemplates'
@click='editTemplates'
)
)
q-tabs.alt-card(
q-tabs.alt-card(
v-model='mode'
v-model='
state.
mode'
inline-label
inline-label
no-caps
no-caps
)
)
...
@@ -48,11 +48,11 @@ q-card.page-data-dialog(style='width: 750px;')
...
@@ -48,11 +48,11 @@ q-card.page-data-dialog(style='width: 750px;')
label='YAML'
label='YAML'
)
)
q-scroll-area(
q-scroll-area(
:thumb-style='thumbStyle'
:thumb-style='
siteStore.
thumbStyle'
:bar-style='barStyle'
:bar-style='
siteStore.
barStyle'
style='height: calc(100% - 50px - 75px - 48px);'
style='height: calc(100% - 50px - 75px - 48px);'
)
)
q-card-section(v-if='mode === `visual`')
q-card-section(v-if='
state.
mode === `visual`')
.q-gutter-sm
.q-gutter-sm
q-input(
q-input(
label='Attribute Text'
label='Attribute Text'
...
@@ -76,60 +76,69 @@ q-card.page-data-dialog(style='width: 750px;')
...
@@ -76,60 +76,69 @@ q-card.page-data-dialog(style='width: 750px;')
dense
dense
size='lg'
size='lg'
)
)
q-no-ssr(v-else, :placeholder='
$
t(`common.loading`)')
q-no-ssr(v-else, :placeholder='t(`common.loading`)')
codemirror.admin-theme-cm(
codemirror.admin-theme-cm(
ref='cmData'
ref='cmData'
v-model='content'
v-model='
state.
content'
:options='{ mode: `text/yaml` }'
:options='{ mode: `text/yaml` }'
)
)
q-dialog(
q-dialog(
v-model='showDataTemplateDialog'
v-model='s
tate.s
howDataTemplateDialog'
)
)
page-data-template-dialog
page-data-template-dialog
</
template
>
</
template
>
<
script
>
<
script
setup
>
import
{
get
}
from
'vuex-pathify'
import
{
useI18n
}
from
'vue-i18n'
import
{
useQuasar
}
from
'quasar'
import
{
nextTick
,
onMounted
,
reactive
,
ref
,
watch
}
from
'vue'
import
PageDataTemplateDialog
from
'./PageDataTemplateDialog.vue'
import
PageDataTemplateDialog
from
'./PageDataTemplateDialog.vue'
export
default
{
import
{
usePageStore
}
from
'src/stores/page'
components
:
{
import
{
useSiteStore
}
from
'src/stores/site'
PageDataTemplateDialog
},
// QUASAR
data
()
{
return
{
const
$q
=
useQuasar
()
showDataTemplateDialog
:
false
,
templateId
:
''
,
// STORES
content
:
''
,
mode
:
'visual'
const
pageStore
=
usePageStore
()
}
const
siteStore
=
useSiteStore
()
},
computed
:
{
// I18N
thumbStyle
:
get
(
'site/thumbStyle'
,
false
),
barStyle
:
get
(
'site/barStyle'
,
false
),
const
{
t
}
=
useI18n
()
templates
()
{
return
[
// DATA
{
id
:
''
,
const
state
=
reactive
({
label
:
'None'
,
showDataTemplateDialog
:
false
,
data
:
[]
templateId
:
''
,
}
,
content
:
''
,
...
this
.
$store
.
get
(
'site/pageDataTemplates'
),
mode
:
'visual'
{
})
id
:
'basic'
,
label
:
'Basic'
,
const
templates
=
[
data
:
[]
{
}
id
:
''
,
]
label
:
'None'
,
}
data
:
[]
},
},
methods
:
{
...
siteStore
.
pageDataTemplates
,
editTemplates
()
{
{
this
.
showDataTemplateDialog
=
!
this
.
showDataTemplateDialog
id
:
'basic'
,
}
label
:
'Basic'
,
data
:
[]
}
}
]
// METHODS
function
editTemplates
()
{
state
.
showDataTemplateDialog
=
!
state
.
showDataTemplateDialog
}
}
</
script
>
</
script
>
...
...
ux/src/components/PageDataTemplateDialog.vue
View file @
acc3b736
This diff is collapsed.
Click to expand it.
ux/src/components/PagePropertiesDialog.vue
View file @
acc3b736
...
@@ -270,8 +270,6 @@ q-card.page-properties-dialog
...
@@ -270,8 +270,6 @@ q-card.page-properties-dialog
</
template
>
</
template
>
<
script
setup
>
<
script
setup
>
import
{
usePageStore
}
from
'src/stores/page'
import
{
useSiteStore
}
from
'src/stores/site'
import
{
useI18n
}
from
'vue-i18n'
import
{
useI18n
}
from
'vue-i18n'
import
{
useQuasar
}
from
'quasar'
import
{
useQuasar
}
from
'quasar'
import
{
nextTick
,
onMounted
,
reactive
,
ref
,
watch
}
from
'vue'
import
{
nextTick
,
onMounted
,
reactive
,
ref
,
watch
}
from
'vue'
...
@@ -280,6 +278,9 @@ import PageRelationDialog from './PageRelationDialog.vue'
...
@@ -280,6 +278,9 @@ import PageRelationDialog from './PageRelationDialog.vue'
import
PageScriptsDialog
from
'./PageScriptsDialog.vue'
import
PageScriptsDialog
from
'./PageScriptsDialog.vue'
import
PageTags
from
'./PageTags.vue'
import
PageTags
from
'./PageTags.vue'
import
{
usePageStore
}
from
'src/stores/page'
import
{
useSiteStore
}
from
'src/stores/site'
// QUASAR
// QUASAR
const
$q
=
useQuasar
()
const
$q
=
useQuasar
()
...
...
ux/src/pages/Index.vue
View file @
acc3b736
...
@@ -141,9 +141,11 @@ q-page.column
...
@@ -141,9 +141,11 @@ q-page.column
q-icon.q-mr-sm(name='las la-stream', color='grey')
q-icon.q-mr-sm(name='las la-stream', color='grey')
.text-caption.text-grey-7 Contents
.text-caption.text-grey-7 Contents
.q-px-md.q-pb-sm
.q-px-md.q-pb-sm
q-tree(
q-tree.page-toc(
:nodes='state.toc'
:nodes='pageStore.toc'
icon='las la-caret-right'
node-key='key'
node-key='key'
dense
v-model:expanded='state.tocExpanded'
v-model:expanded='state.tocExpanded'
v-model:selected='state.tocSelected'
v-model:selected='state.tocSelected'
)
)
...
@@ -287,6 +289,7 @@ q-page.column
...
@@ -287,6 +289,7 @@ q-page.column
transition-show='jump-left'
transition-show='jump-left'
transition-hide='jump-right'
transition-hide='jump-right'
class='floating-sidepanel'
class='floating-sidepanel'
no-shake
)
)
component(:is='sideDialogs[state.sideDialogComponent]')
component(:is='sideDialogs[state.sideDialogComponent]')
...
@@ -354,54 +357,6 @@ const state = reactive({
...
@@ -354,54 +357,6 @@ const state = reactive({
globalDialogComponent
:
null
,
globalDialogComponent
:
null
,
showTagsEditBtn
:
false
,
showTagsEditBtn
:
false
,
tagEditMode
:
false
,
tagEditMode
:
false
,
toc
:
[
{
key
:
'h1-0'
,
label
:
'Introduction'
},
{
key
:
'h1-1'
,
label
:
'Planets'
,
children
:
[
{
key
:
'h2-0'
,
label
:
'Earth'
,
children
:
[
{
key
:
'h3-0'
,
label
:
'Countries'
,
children
:
[
{
key
:
'h4-0'
,
label
:
'Cities'
,
children
:
[
{
key
:
'h5-0'
,
label
:
'Montreal'
,
children
:
[
{
key
:
'h6-0'
,
label
:
'Districts'
}
]
}
]
}
]
}
]
},
{
key
:
'h2-1'
,
label
:
'Mars'
},
{
key
:
'h2-2'
,
label
:
'Jupiter'
}
]
}
],
tocExpanded
:
[
'h1-0'
,
'h1-1'
],
tocExpanded
:
[
'h1-0'
,
'h1-1'
],
tocSelected
:
[],
tocSelected
:
[],
currentRating
:
3
currentRating
:
3
...
@@ -472,8 +427,8 @@ watch(() => route.path, async (newValue) => {
...
@@ -472,8 +427,8 @@ watch(() => route.path, async (newValue) => {
}
}
},
{
immediate
:
true
})
},
{
immediate
:
true
})
watch
(()
=>
state
.
toc
,
refreshTocExpanded
)
watch
(()
=>
pageStore
.
toc
,
()
=>
{
refreshTocExpanded
()
},
{
immediate
:
true
}
)
watch
(()
=>
pageStore
.
tocDepth
,
refreshTocExpanded
)
watch
(()
=>
pageStore
.
tocDepth
,
()
=>
{
refreshTocExpanded
()
}
)
// METHODS
// METHODS
...
@@ -492,20 +447,22 @@ function savePage () {
...
@@ -492,20 +447,22 @@ function savePage () {
state
.
showGlobalDialog
=
true
state
.
showGlobalDialog
=
true
}
}
function
refreshTocExpanded
(
baseToc
)
{
function
refreshTocExpanded
(
baseToc
,
lvl
)
{
console
.
info
(
pageStore
.
tocDepth
.
min
,
lvl
,
pageStore
.
tocDepth
.
max
)
const
toExpand
=
[]
const
toExpand
=
[]
let
isRootNode
=
false
let
isRootNode
=
false
if
(
!
baseToc
)
{
if
(
!
baseToc
)
{
baseToc
=
stat
e
.
toc
baseToc
=
pageStor
e
.
toc
isRootNode
=
true
isRootNode
=
true
lvl
=
1
}
}
if
(
baseToc
.
length
>
0
)
{
if
(
baseToc
.
length
>
0
)
{
for
(
const
node
of
baseToc
)
{
for
(
const
node
of
baseToc
)
{
if
(
node
.
key
>=
`h
${
pageStore
.
tocDepth
.
min
}
`
&&
node
.
key
<=
`h
${
pageStore
.
tocDepth
.
max
}
`
)
{
if
(
lvl
>=
pageStore
.
tocDepth
.
min
&&
lvl
<
pageStore
.
tocDepth
.
max
)
{
toExpand
.
push
(
node
.
key
)
toExpand
.
push
(
node
.
key
)
}
}
if
(
node
.
children
?.
length
&&
node
.
key
<
`h
${
pageStore
.
tocDepth
.
max
}
`
)
{
if
(
node
.
children
?.
length
&&
lvl
<
pageStore
.
tocDepth
.
max
-
1
)
{
toExpand
.
push
(...
refreshTocExpanded
(
node
.
children
))
toExpand
.
push
(...
refreshTocExpanded
(
node
.
children
,
lvl
+
1
))
}
}
}
}
}
}
...
@@ -515,12 +472,6 @@ function refreshTocExpanded (baseToc) {
...
@@ -515,12 +472,6 @@ function refreshTocExpanded (baseToc) {
return
toExpand
return
toExpand
}
}
}
}
// MOUNTED
onMounted
(()
=>
{
refreshTocExpanded
()
})
</
script
>
</
script
>
<
style
lang=
"scss"
>
<
style
lang=
"scss"
>
...
@@ -691,4 +642,10 @@ onMounted(() => {
...
@@ -691,4 +642,10 @@ onMounted(() => {
background-color
:
$dark-3
;
background-color
:
$dark-3
;
}
}
}
}
.page-toc
{
&
.q-tree--dense
.q-tree__node
{
padding-bottom
:
5px
;
}
}
</
style
>
</
style
>
ux/src/stores/page.js
View file @
acc3b736
...
@@ -80,7 +80,8 @@ export const usePageStore = defineStore('page', {
...
@@ -80,7 +80,8 @@ export const usePageStore = defineStore('page', {
},
},
commentsCount
:
0
,
commentsCount
:
0
,
content
:
''
,
content
:
''
,
render
:
''
render
:
''
,
toc
:
[]
}),
}),
getters
:
{},
getters
:
{},
actions
:
{
actions
:
{
...
@@ -93,9 +94,11 @@ export const usePageStore = defineStore('page', {
...
@@ -93,9 +94,11 @@ export const usePageStore = defineStore('page', {
const
resp
=
await
APOLLO_CLIENT
.
query
({
const
resp
=
await
APOLLO_CLIENT
.
query
({
query
:
gql
`
query
:
gql
`
query loadPage (
query loadPage (
$siteId: UUID!
$path: String!
$path: String!
) {
) {
pageByPath(
pageByPath(
siteId: $siteId
path: $path
path: $path
) {
) {
id
id
...
@@ -105,10 +108,12 @@ export const usePageStore = defineStore('page', {
...
@@ -105,10 +108,12 @@ export const usePageStore = defineStore('page', {
locale
locale
updatedAt
updatedAt
render
render
toc
}
}
}
}
`
,
`
,
variables
:
{
variables
:
{
siteId
:
siteStore
.
id
,
path
path
},
},
fetchPolicy
:
'network-only'
fetchPolicy
:
'network-only'
...
...
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