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
0605f654
Unverified
Commit
0605f654
authored
Jan 22, 2023
by
NGPixel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: file manager thumbnail preview
parent
5c1b9b66
Show whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
59 additions
and
38 deletions
+59
-38
package.json
package.json
+1
-2
common.js
server/controllers/common.js
+19
-16
system.js
server/core/system.js
+3
-0
asset.js
server/graph/resolvers/asset.js
+5
-8
assets.js
server/models/assets.js
+14
-1
ext.js
server/modules/extensions/sharp/ext.js
+4
-2
base.pug
server/views/base.pug
+3
-3
quasar.config.js
ux/quasar.config.js
+5
-4
FileManager.vue
ux/src/components/FileManager.vue
+5
-2
No files found.
package.json
View file @
0605f654
...
...
@@ -10,8 +10,7 @@
"dev"
:
"nodemon server"
,
"legacy:dev"
:
"NODE_OPTIONS=--openssl-legacy-provider node dev"
,
"legacy:build"
:
"NODE_OPTIONS=--openssl-legacy-provider webpack --profile --config dev/webpack/webpack.prod.js"
,
"test"
:
"eslint --format codeframe --ext .js,.vue . && pug-lint server/views && jest"
,
"cypress:open"
:
"cypress open"
"test"
:
"eslint --format codeframe --ext .js,.vue . && pug-lint server/views && jest"
},
"repository"
:
{
"type"
:
"git"
,
...
...
server/controllers/common.js
View file @
0605f654
...
...
@@ -5,8 +5,6 @@ const _ = require('lodash')
const
CleanCSS
=
require
(
'clean-css'
)
const
moment
=
require
(
'moment'
)
const
path
=
require
(
'path'
)
const
tmplCreateRegex
=
/^
[
0-9
]
+
(
,
[
0-9
]
+
)?
$/
const
siteAssetsPath
=
path
.
resolve
(
WIKI
.
ROOTPATH
,
WIKI
.
config
.
dataPath
,
'assets'
)
/**
...
...
@@ -78,30 +76,35 @@ router.get('/_site/:siteId?/:resource', async (req, res, next) => {
/**
* Asset Thumbnails / Download
*/
router
.
get
(
'/_asset/:siteId/:mode/*'
,
async
(
req
,
res
,
next
)
=>
{
const
site
=
req
.
params
.
siteId
?
WIKI
.
sites
[
req
.
params
.
siteId
]
:
await
WIKI
.
db
.
sites
.
getSiteByHostname
({
hostname
:
req
.
hostname
})
if
(
!
site
)
{
return
res
.
status
(
404
).
send
(
'Site Not Found'
)
}
const
filePath
=
req
.
params
[
0
]
console
.
info
(
filePath
)
switch
(
req
.
params
.
mode
)
{
case
'thumb'
:
{
try
{
router
.
get
(
'/_thumb/:id.png'
,
async
(
req
,
res
,
next
)
=>
{
const
thumb
=
await
WIKI
.
db
.
assets
.
getThumbnail
({
id
:
req
.
params
.
id
})
}
catch
(
err
)
{
if
(
thumb
)
{
// TODO: Check permissions
switch
(
thumb
.
previewState
)
{
case
'pending'
:
{
res
.
send
(
'PENDING'
)
break
}
case
'ready'
:
{
res
.
set
(
'Content-Type'
,
'image/png'
)
res
.
send
(
thumb
.
preview
)
break
}
case
'download'
:
{
case
'failed'
:
{
res
.
status
(
500
).
send
(
'Thumbnail Preview Failed'
).
end
()
break
}
default
:
{
return
res
.
status
(
404
).
send
(
'Invalid Site Resourc
e'
)
return
res
.
status
(
500
).
send
(
'Invalid Thumbnail Preview Stat
e'
)
}
}
return
res
.
send
(
'BOB'
).
end
()
}
else
{
return
res
.
sendStatus
(
404
)
}
})
/**
...
...
server/core/system.js
View file @
0605f654
...
...
@@ -10,6 +10,9 @@ module.exports = {
minimumNodeRequired
:
'18.0.0'
},
init
()
{
fs
.
ensureDir
(
path
.
resolve
(
WIKI
.
ROOTPATH
,
WIKI
.
config
.
dataPath
,
'assets'
))
fs
.
ensureDir
(
path
.
resolve
(
WIKI
.
ROOTPATH
,
WIKI
.
config
.
dataPath
,
'uploads'
))
// Clear content cache
fs
.
emptyDir
(
path
.
resolve
(
WIKI
.
ROOTPATH
,
WIKI
.
config
.
dataPath
,
'cache'
))
...
...
server/graph/resolvers/asset.js
View file @
0605f654
...
...
@@ -258,7 +258,7 @@ module.exports = {
const
asset
=
assetRaw
[
0
]
// Add to tree
const
treeAsset
=
await
WIKI
.
db
.
tree
.
addAsset
({
await
WIKI
.
db
.
tree
.
addAsset
({
id
:
asset
.
id
,
parentPath
:
folder
.
folderPath
?
`
${
folder
.
folderPath
}
.
${
folder
.
fileName
}
`
:
folder
.
fileName
,
fileName
:
formattedFilename
,
...
...
@@ -309,13 +309,7 @@ module.exports = {
WIKI
.
logger
.
warn
(
'Cannot generate asset thumbnail because the Sharp extension is not installed.'
)
}
else
{
WIKI
.
logger
.
debug
(
`Generating thumbnail of asset
${
sanitizedFilename
}
...`
)
const
previewDestFolder
=
path
.
resolve
(
WIKI
.
ROOTPATH
,
WIKI
.
config
.
dataPath
,
'assets'
)
const
previewDestPath
=
path
.
join
(
previewDestFolder
,
`asset-thumb-
${
treeAsset
.
hash
}
.png`
)
await
fs
.
ensureDir
(
previewDestFolder
)
const
previewDestPath
=
path
.
resolve
(
WIKI
.
ROOTPATH
,
WIKI
.
config
.
dataPath
,
`uploads/
${
tempFileId
}
-thumb.png`
)
// -> Resize
await
WIKI
.
extensions
.
ext
.
sharp
.
resize
({
format
:
'png'
,
...
...
@@ -332,6 +326,9 @@ module.exports = {
preview
:
await
fs
.
readFile
(
previewDestPath
),
previewState
:
'ready'
})
// -> Delete
await
fs
.
remove
(
previewDestPath
)
}
}
...
...
server/models/assets.js
View file @
0605f654
...
...
@@ -3,6 +3,7 @@ const moment = require('moment')
const
path
=
require
(
'path'
)
const
fs
=
require
(
'fs-extra'
)
const
_
=
require
(
'lodash'
)
const
commonHelper
=
require
(
'../helpers/common'
)
/**
* Users model
...
...
@@ -160,7 +161,19 @@ module.exports = class Asset extends Model {
}
}
static
async
getAsset
(
assetPath
,
res
)
{
static
async
getThumbnail
({
id
,
path
,
locale
,
siteId
})
{
return
WIKI
.
db
.
tree
.
query
()
.
select
(
'tree.*'
,
'assets.preview'
,
'assets.previewState'
)
.
innerJoin
(
'assets'
,
'tree.id'
,
'assets.id'
)
.
where
(
id
?
{
'tree.id'
:
id
}
:
{
'tree.hash'
:
commonHelper
.
generateHash
(
path
),
'tree.localeCode'
:
locale
,
'tree.siteId'
:
siteId
})
.
first
()
}
static
async
getAsset
({
path
,
locale
,
siteId
},
res
)
{
try
{
const
fileInfo
=
''
// assetHelper.getPathInfo(assetPath)
const
fileHash
=
''
// assetHelper.generateHash(assetPath)
...
...
server/modules/extensions/sharp/ext.js
View file @
0605f654
...
...
@@ -51,7 +51,8 @@ module.exports = {
width
=
null
,
height
=
null
,
fit
=
'cover'
,
background
=
{
r
:
0
,
g
:
0
,
b
:
0
,
alpha
:
0
}
background
=
{
r
:
0
,
g
:
0
,
b
:
0
,
alpha
:
0
},
kernel
=
'lanczos3'
})
{
this
.
load
()
...
...
@@ -75,7 +76,8 @@ module.exports = {
width
,
height
,
fit
,
background
background
,
kernel
}).
toFormat
(
format
)
return
pipeline
([
inputStream
,
transformer
,
outputStream
])
...
...
server/views/base.pug
View file @
0605f654
...
...
@@ -44,7 +44,7 @@ html(lang=siteConfig.lang)
link(
type='text/css'
rel='stylesheet'
href='/_assets-legacy/css/app.
36b4c9522aa279325701
.css'
href='/_assets-legacy/css/app.
c05740c020721e44657c
.css'
)
...
...
@@ -54,14 +54,14 @@ html(lang=siteConfig.lang)
script(
type='text/javascript'
src='/_assets-legacy/js/runtime.js?167
123789
0'
src='/_assets-legacy/js/runtime.js?167
437313
0'
)
script(
type='text/javascript'
src='/_assets-legacy/js/app.js?167
123789
0'
src='/_assets-legacy/js/app.js?167
437313
0'
)
...
...
ux/quasar.config.js
View file @
0605f654
...
...
@@ -102,11 +102,12 @@ module.exports = configure(function (/* ctx */) {
devServer
:
{
// https: true
open
:
false
,
// opens browser window automatically
port
:
5
001
,
port
:
3
001
,
proxy
:
{
'/_graphql'
:
'http://localhost:5000/_graphql'
,
'/_site'
:
'http://localhost:5000'
,
'/_user'
:
'http://localhost:5000'
'/_graphql'
:
'http://127.0.0.1:3000/_graphql'
,
'/_site'
:
'http://127.0.0.1:3000'
,
'/_thumb'
:
'http://127.0.0.1:3000'
,
'/_user'
:
'http://127.0.0.1:3000'
}
},
...
...
ux/src/components/FileManager.vue
View file @
0605f654
...
...
@@ -68,7 +68,7 @@ q-layout.fileman(view='hHh lpR lFr', container)
.q-pa-md
template(v-if='currentFileDetails')
q-img.rounded-borders.q-mb-md(
src='/_assets/illustrations/fileman-page.svg
'
:src='currentFileDetails.thumbnail
'
width='100%'
fit='cover'
:ratio='16/10'
...
...
@@ -450,8 +450,10 @@ const currentFileDetails = computed(() => {
value
:
item
.
title
}
]
let
thumbnail
=
''
switch
(
item
.
type
)
{
case
'page'
:
{
thumbnail
=
'/_assets/illustrations/fileman-page.svg'
items
.
push
({
label
:
t
(
'fileman.detailsPageType'
),
value
:
t
(
`fileman.
${
item
.
pageType
}
PageType`
)
...
...
@@ -471,6 +473,7 @@ const currentFileDetails = computed(() => {
break
}
case
'asset'
:
{
thumbnail
=
`/_thumb/
${
item
.
id
}
.png`
items
.
push
({
label
:
t
(
'fileman.detailsAssetType'
),
value
:
fileTypes
[
item
.
fileExt
]
?
t
(
`fileman.
${
item
.
fileExt
}
FileType`
)
:
t
(
'fileman.unknownFileType'
,
{
type
:
item
.
fileExt
.
toUpperCase
()
})
...
...
@@ -483,7 +486,7 @@ const currentFileDetails = computed(() => {
}
}
return
{
thumbnail
:
''
,
thumbnail
,
items
}
}
else
{
...
...
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