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
5c1b9b66
Unverified
Commit
5c1b9b66
authored
Jan 22, 2023
by
Nicolas Giard
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix: file manager load (2)
parent
18e80a95
Show whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
61 additions
and
60 deletions
+61
-60
cypress.json
cypress.json
+0
-11
dev.code-workspace
dev.code-workspace
+0
-22
common.js
server/controllers/common.js
+30
-0
FileManager.vue
ux/src/components/FileManager.vue
+19
-3
TreeLevel.vue
ux/src/components/TreeLevel.vue
+0
-5
TreeNav.vue
ux/src/components/TreeNav.vue
+2
-7
TreeNode.vue
ux/src/components/TreeNode.vue
+4
-9
fileTypes.js
ux/src/helpers/fileTypes.js
+6
-3
No files found.
cypress.json
deleted
100644 → 0
View file @
18e80a95
{
"baseUrl"
:
"http://localhost:3000"
,
"projectId"
:
"r7qxah"
,
"fixturesFolder"
:
false
,
"integrationFolder"
:
"dev/cypress/integration"
,
"pluginsFile"
:
"dev/cypress/plugins/index.js"
,
"screenshotsFolder"
:
"dev/cypress/screenshots"
,
"supportFile"
:
"dev/cypress/support/index.js"
,
"videosFolder"
:
"dev/cypress/videos"
,
"numTestsKeptInMemory"
:
1
}
dev.code-workspace
deleted
100644 → 0
View file @
18e80a95
{
"folders": [
{
"name": "server",
"path": "server"
},
{
"name": "ux",
"path": "ux"
},
{
"path": "."
}
],
"settings": {
"i18n-ally.localesPaths": [
"src/i18n",
"src/i18n/locales"
],
"i18n-ally.keystyle": "nested"
}
}
server/controllers/common.js
View file @
5c1b9b66
...
@@ -40,6 +40,7 @@ router.get('/_site/:siteId?/:resource', async (req, res, next) => {
...
@@ -40,6 +40,7 @@ router.get('/_site/:siteId?/:resource', async (req, res, next) => {
if
(
!
site
)
{
if
(
!
site
)
{
return
res
.
status
(
404
).
send
(
'Site Not Found'
)
return
res
.
status
(
404
).
send
(
'Site Not Found'
)
}
}
console
.
info
(
req
.
params
)
switch
(
req
.
params
.
resource
)
{
switch
(
req
.
params
.
resource
)
{
case
'logo'
:
{
case
'logo'
:
{
if
(
site
.
config
.
assets
.
logo
)
{
if
(
site
.
config
.
assets
.
logo
)
{
...
@@ -75,6 +76,35 @@ router.get('/_site/:siteId?/:resource', async (req, res, next) => {
...
@@ -75,6 +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
{
}
catch
(
err
)
{
}
break
}
case
'download'
:
{
break
}
default
:
{
return
res
.
status
(
404
).
send
(
'Invalid Site Resource'
)
}
}
return
res
.
send
(
'BOB'
).
end
()
})
/**
* New v3 vue app
* New v3 vue app
*/
*/
router
.
get
([
router
.
get
([
...
...
ux/src/components/FileManager.vue
View file @
5c1b9b66
...
@@ -250,10 +250,23 @@ q-layout.fileman(view='hHh lpR lFr', container)
...
@@ -250,10 +250,23 @@ q-layout.fileman(view='hHh lpR lFr', container)
q-item-section(side)
q-item-section(side)
q-icon(name='las la-eye', color='primary')
q-icon(name='las la-eye', color='primary')
q-item-section View
q-item-section View
template(v-if='item.type === `asset` && item.imageEdit')
q-item(clickable)
q-item-section(side)
q-icon(name='las la-edit', color='orange')
q-item-section Edit Image...
q-item(clickable)
q-item-section(side)
q-icon(name='las la-crop', color='orange')
q-item-section Resize Image...
q-item(clickable, v-if='item.type !== `folder`', @click='copyItemURL(item)')
q-item(clickable, v-if='item.type !== `folder`', @click='copyItemURL(item)')
q-item-section(side)
q-item-section(side)
q-icon(name='las la-clipboard', color='primary')
q-icon(name='las la-clipboard', color='primary')
q-item-section Copy URL
q-item-section Copy URL
q-item(clickable, v-if='item.type !== `folder`', @click='')
q-item-section(side)
q-icon(name='las la-download', color='primary')
q-item-section Download
q-item(clickable)
q-item(clickable)
q-item-section(side)
q-item-section(side)
q-icon(name='las la-copy', color='teal')
q-icon(name='las la-copy', color='teal')
...
@@ -411,6 +424,7 @@ const files = computed(() => {
...
@@ -411,6 +424,7 @@ const files = computed(() => {
case
'asset'
:
{
case
'asset'
:
{
f
.
icon
=
fileTypes
[
f
.
fileExt
]?.
icon
??
''
f
.
icon
=
fileTypes
[
f
.
fileExt
]?.
icon
??
''
f
.
side
=
filesize
(
f
.
fileSize
,
{
round
:
0
})
f
.
side
=
filesize
(
f
.
fileSize
,
{
round
:
0
})
f
.
imageEdit
=
fileTypes
[
f
.
fileExt
]?.
imageEdit
if
(
fileTypes
[
f
.
fileExt
])
{
if
(
fileTypes
[
f
.
fileExt
])
{
f
.
caption
=
t
(
`fileman.
${
f
.
fileExt
}
FileType`
)
f
.
caption
=
t
(
`fileman.
${
f
.
fileExt
}
FileType`
)
}
else
{
}
else
{
...
@@ -489,8 +503,8 @@ function close () {
...
@@ -489,8 +503,8 @@ function close () {
siteStore
.
overlay
=
null
siteStore
.
overlay
=
null
}
}
async
function
treeLazyLoad
(
nodeId
,
{
done
,
fail
})
{
async
function
treeLazyLoad
(
nodeId
,
isCurrent
,
{
done
,
fail
})
{
await
loadTree
({
parentId
:
nodeId
,
types
:
[
'folder'
]
})
await
loadTree
({
parentId
:
nodeId
,
types
:
isCurrent
?
null
:
[
'folder'
]
})
done
()
done
()
}
}
...
@@ -792,6 +806,7 @@ async function uploadNewFiles () {
...
@@ -792,6 +806,7 @@ async function uploadNewFiles () {
}
}
}
}
state
.
uploadPercentage
=
100
state
.
uploadPercentage
=
100
loadTree
({
parentId
:
state
.
currentFolderId
})
$q
.
notify
({
$q
.
notify
({
type
:
'positive'
,
type
:
'positive'
,
message
:
t
(
'fileman.uploadSuccess'
)
message
:
t
(
'fileman.uploadSuccess'
)
...
@@ -859,7 +874,8 @@ async function copyItemURL (item) {
...
@@ -859,7 +874,8 @@ async function copyItemURL (item) {
break
break
}
}
case
'asset'
:
{
case
'asset'
:
{
// TODO: Copy asset URL to clibpard
const
assetPath
=
item
.
folderPath
?
`
${
item
.
folderPath
}
/
${
item
.
fileName
}
`
:
item
.
fileName
await
navigator
.
clipboard
.
writeText
(
`
${
window
.
location
.
origin
}
/
${
assetPath
}
`
)
break
break
}
}
default
:
{
default
:
{
...
...
ux/src/components/TreeLevel.vue
View file @
5c1b9b66
...
@@ -67,7 +67,6 @@ const $q = useQuasar()
...
@@ -67,7 +67,6 @@ const $q = useQuasar()
const
roots
=
inject
(
'roots'
)
const
roots
=
inject
(
'roots'
)
const
nodes
=
inject
(
'nodes'
)
const
nodes
=
inject
(
'nodes'
)
const
selection
=
inject
(
'selection'
)
const
selection
=
inject
(
'selection'
)
const
emitContextAction
=
inject
(
'emitContextAction'
)
const
contextActionList
=
inject
(
'contextActionList'
)
const
contextActionList
=
inject
(
'contextActionList'
)
// COMPUTED
// COMPUTED
...
@@ -103,8 +102,4 @@ function setRoot () {
...
@@ -103,8 +102,4 @@ function setRoot () {
selection
.
value
=
null
selection
.
value
=
null
}
}
function
createRootFolder
()
{
emitContextAction
(
null
,
'newFolder'
)
}
</
script
>
</
script
>
ux/src/components/TreeNav.vue
View file @
5c1b9b66
...
@@ -108,18 +108,14 @@ const selection = computed({
...
@@ -108,18 +108,14 @@ const selection = computed({
// METHODS
// METHODS
function
emitLazyLoad
(
nodeId
,
clb
)
{
function
emitLazyLoad
(
nodeId
,
isCurrent
,
clb
)
{
if
(
props
.
useLazyLoad
)
{
if
(
props
.
useLazyLoad
)
{
emit
(
'lazyLoad'
,
nodeId
,
clb
)
emit
(
'lazyLoad'
,
nodeId
,
isCurrent
,
clb
)
}
else
{
}
else
{
clb
.
done
()
clb
.
done
()
}
}
}
}
function
emitContextAction
(
nodeId
,
action
)
{
emit
(
'contextAction'
,
nodeId
,
action
)
}
function
setOpened
(
nodeId
)
{
function
setOpened
(
nodeId
)
{
state
.
opened
[
nodeId
]
=
true
state
.
opened
[
nodeId
]
=
true
}
}
...
@@ -142,7 +138,6 @@ provide('opened', state.opened)
...
@@ -142,7 +138,6 @@ provide('opened', state.opened)
provide
(
'displayMode'
,
toRef
(
props
,
'displayMode'
))
provide
(
'displayMode'
,
toRef
(
props
,
'displayMode'
))
provide
(
'selection'
,
selection
)
provide
(
'selection'
,
selection
)
provide
(
'emitLazyLoad'
,
emitLazyLoad
)
provide
(
'emitLazyLoad'
,
emitLazyLoad
)
provide
(
'emitContextAction'
,
emitContextAction
)
// EXPOSE
// EXPOSE
...
...
ux/src/components/TreeNode.vue
View file @
5c1b9b66
...
@@ -5,7 +5,7 @@ li.treeview-node
...
@@ -5,7 +5,7 @@ li.treeview-node
q-icon(
q-icon(
:name='icon'
:name='icon'
size='sm'
size='sm'
@click.stop='
hasChildren ? toggleNode() : open
Node()'
@click.stop='
toggle
Node()'
)
)
.treeview-label-text
{{
displayMode
===
'path'
?
node
.
fileName
:
node
.
title
}}
.treeview-label-text
{{
displayMode
===
'path'
?
node
.
fileName
:
node
.
title
}}
q-spinner.q-mr-xs(
q-spinner.q-mr-xs(
...
@@ -82,7 +82,6 @@ const opened = inject('opened')
...
@@ -82,7 +82,6 @@ const opened = inject('opened')
const
displayMode
=
inject
(
'displayMode'
)
const
displayMode
=
inject
(
'displayMode'
)
const
selection
=
inject
(
'selection'
)
const
selection
=
inject
(
'selection'
)
const
emitLazyLoad
=
inject
(
'emitLazyLoad'
)
const
emitLazyLoad
=
inject
(
'emitLazyLoad'
)
const
emitContextAction
=
inject
(
'emitContextAction'
)
const
contextActionList
=
inject
(
'contextActionList'
)
const
contextActionList
=
inject
(
'contextActionList'
)
// DATA
// DATA
...
@@ -113,13 +112,13 @@ const isActive = computed(() => {
...
@@ -113,13 +112,13 @@ const isActive = computed(() => {
// METHODS
// METHODS
async
function
toggleNode
()
{
async
function
toggleNode
(
isCurrent
=
false
)
{
opened
[
props
.
node
.
id
]
=
!
(
opened
[
props
.
node
.
id
]
===
true
)
opened
[
props
.
node
.
id
]
=
!
(
opened
[
props
.
node
.
id
]
===
true
)
if
(
opened
[
props
.
node
.
id
]
&&
!
loaded
[
props
.
node
.
id
])
{
if
(
opened
[
props
.
node
.
id
]
&&
!
loaded
[
props
.
node
.
id
])
{
state
.
isLoading
=
true
state
.
isLoading
=
true
await
Promise
.
race
([
await
Promise
.
race
([
new
Promise
((
resolve
,
reject
)
=>
{
new
Promise
((
resolve
,
reject
)
=>
{
emitLazyLoad
(
props
.
node
.
id
,
{
done
:
resolve
,
fail
:
reject
})
emitLazyLoad
(
props
.
node
.
id
,
isCurrent
,
{
done
:
resolve
,
fail
:
reject
})
}),
}),
new
Promise
((
resolve
,
reject
)
=>
{
new
Promise
((
resolve
,
reject
)
=>
{
setTimeout
(()
=>
reject
(
new
Error
(
'Async tree loading timeout'
)),
30000
)
setTimeout
(()
=>
reject
(
new
Error
(
'Async tree loading timeout'
)),
30000
)
...
@@ -135,11 +134,7 @@ function openNode () {
...
@@ -135,11 +134,7 @@ function openNode () {
if
(
selection
.
value
!==
props
.
node
.
id
&&
opened
[
props
.
node
.
id
])
{
if
(
selection
.
value
!==
props
.
node
.
id
&&
opened
[
props
.
node
.
id
])
{
return
return
}
}
toggleNode
()
toggleNode
(
true
)
}
function
contextAction
(
action
)
{
emitContextAction
(
props
.
node
.
id
,
action
)
}
}
</
script
>
</
script
>
ux/src/helpers/fileTypes.js
View file @
5c1b9b66
...
@@ -69,10 +69,12 @@ export default {
...
@@ -69,10 +69,12 @@ export default {
icon
:
'img:/_assets/icons/color-cd.svg'
icon
:
'img:/_assets/icons/color-cd.svg'
},
},
jpg
:
{
jpg
:
{
icon
:
'img:/_assets/icons/color-jpg.svg'
icon
:
'img:/_assets/icons/color-jpg.svg'
,
imageEdit
:
true
},
},
jpeg
:
{
jpeg
:
{
icon
:
'img:/_assets/icons/color-jpg.svg'
icon
:
'img:/_assets/icons/color-jpg.svg'
,
imageEdit
:
true
},
},
json
:
{
json
:
{
icon
:
'img:/_assets/icons/color-json.svg'
icon
:
'img:/_assets/icons/color-json.svg'
...
@@ -111,7 +113,8 @@ export default {
...
@@ -111,7 +113,8 @@ export default {
icon
:
'img:/_assets/icons/color-pdf.svg'
icon
:
'img:/_assets/icons/color-pdf.svg'
},
},
png
:
{
png
:
{
icon
:
'img:/_assets/icons/color-png.svg'
icon
:
'img:/_assets/icons/color-png.svg'
,
imageEdit
:
true
},
},
pptx
:
{
pptx
:
{
icon
:
'img:/_assets/icons/color-ppt.svg'
icon
:
'img:/_assets/icons/color-ppt.svg'
...
...
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