diff --git a/assets/src/components/Editor.vue b/assets/src/components/Editor.vue
index dd1b2a09..144605c5 100644
--- a/assets/src/components/Editor.vue
+++ b/assets/src/components/Editor.vue
@@ -38,6 +38,10 @@ export default {
document.getElementById('save-button').removeEventListener('click', this.save)
},
mounted: function () {
+ if (this.req.content === undefined || this.req.content === null) {
+ this.req.content = ''
+ }
+
// Set up the main content editor.
this.content = CodeMirror(document.getElementById('editor'), {
value: this.req.content,
diff --git a/assets/src/components/Files.vue b/assets/src/components/Files.vue
index 317b0a8b..b5fcbc94 100644
--- a/assets/src/components/Files.vue
+++ b/assets/src/components/Files.vue
@@ -70,7 +70,6 @@ export default {
},
created () {
this.fetchData()
- console.log('created')
},
watch: {
'$route': 'fetchData',
@@ -96,16 +95,16 @@ export default {
if (url[0] !== '/') url = '/' + url
api.fetch(url)
- .then((trueURL) => {
- if (!url.endsWith('/') && trueURL.endsWith('/')) {
- console.log(trueURL)
+ .then((req) => {
+ if (!url.endsWith('/') && req.url.endsWith('/')) {
window.history.replaceState(window.history.state, document.title, window.location.pathname + '/')
}
+ this.$store.commit('updateRequest', req)
+ document.title = req.name
this.setLoading(false)
})
.catch(error => {
- console.log(error)
this.error = error
this.setLoading(false)
})
@@ -130,9 +129,13 @@ export default {
// Del!
if (event.keyCode === 46) {
- if (this.showDeleteButton && this.req.kind !== 'editor') {
- this.$store.commit('showHover', 'delete')
- }
+ if (this.req.kind === 'editor' ||
+ this.$route.name !== 'Files' ||
+ this.loading ||
+ !this.user.allowEdit ||
+ (this.req.kind === 'listing' && this.selectedCount === 0)) return
+
+ this.$store.commit('showHover', 'delete')
}
// F1!
@@ -143,9 +146,14 @@ export default {
// F2!
if (event.keyCode === 113) {
- if (this.showRenameButton) {
- this.$store.commit('showHover', 'rename')
- }
+ if (this.req.kind === 'editor' ||
+ this.$route.name !== 'Files' ||
+ this.loading ||
+ !this.user.allowEdit ||
+ (this.req.kind === 'listing' && this.selectedCount === 0) ||
+ (this.req.kind === 'listing' && this.selectedCount > 1)) return
+
+ this.$store.commit('showHover', 'rename')
}
// CTRL + S
diff --git a/assets/src/components/Header.vue b/assets/src/components/Header.vue
index efd8f3a0..aad20f71 100644
--- a/assets/src/components/Header.vue
+++ b/assets/src/components/Header.vue
@@ -69,7 +69,7 @@ export default {
return this.req.kind === 'listing' && !this.loading && this.$route.name === 'Files'
},
showSaveButton () {
- return (this.req.kind === 'editor' && !this.loading) || this.$route.name === 'User'
+ return (this.req.kind === 'editor' && !this.loading)
},
showSwitchButton () {
return this.req.kind === 'listing' && this.$route.name === 'Files' && !this.loading
diff --git a/assets/src/components/prompts/Move.vue b/assets/src/components/prompts/Move.vue
index 6db0005a..1c543d8c 100644
--- a/assets/src/components/prompts/Move.vue
+++ b/assets/src/components/prompts/Move.vue
@@ -4,7 +4,7 @@
Choose new house for your file(s)/folder(s):
- - {{ item.name }}
+ - {{ item.name }}
Currently navigating on: {{ current }}
.
@@ -27,45 +27,36 @@ export default {
data: function () {
return {
items: [],
- current: window.location.pathname
+ current: window.location.pathname,
+ moveTo: null
}
},
computed: mapState(['req', 'selected', 'baseURL']),
- mounted: function () {
- if (this.$route.path !== '/files/') {
- this.items.push({
- name: '..',
- url: url.removeLastDir(this.$route.path) + '/'
- })
- }
-
+ mounted () {
+ // If we're showing this on a listing,
+ // we can use the current request object
+ // to fill the move options.
if (this.req.kind === 'listing') {
- for (let item of this.req.items) {
- if (!item.isDir) continue
-
- this.items.push({
- name: item.name,
- url: item.url
- })
- }
-
+ this.fillOptions(this.req)
return
}
+
+ // Otherwise, we must be on a preview or editor
+ // so we fetch the data from the previous directory.
+ api.fetch(url.removeLastDir(this.$rute.path))
+ .then(this.fillOptions)
+ .catch(this.showError)
},
methods: {
move: function (event) {
event.preventDefault()
- let el = event.currentTarget
+ // Set the destination and create the promises array.
let promises = []
- let dest = this.current
+ let dest = (this.moveTo === null) ? this.current : this.moveTo
buttons.loading('move')
- let selected = el.querySelector('li[aria-selected=true]')
- if (selected !== null) {
- dest = selected.dataset.url
- }
-
+ // Create a new promise for each file.
for (let item of this.selected) {
let from = this.req.items[item].url
let to = dest + '/' + encodeURIComponent(this.req.items[item].name)
@@ -74,75 +65,69 @@ export default {
promises.push(api.move(from, to))
}
- this.$store.commit('showMove', false)
-
+ // Execute the promises.
Promise.all(promises)
.then(() => {
buttons.done('move')
- this.$router.push({page: dest})
+ this.$router.push({ path: dest })
})
.catch(error => {
buttons.done('move')
this.$store.commit('showError', error)
})
},
- next: function (event) {
- let uri = event.currentTarget.dataset.url
- this.json(uri)
- .then((data) => {
- this.current = uri
- this.items = []
+ fillOptions (req) {
+ // Sets the current path and resets
+ // the current items.
+ this.current = req.url
+ this.items = []
- if (uri !== this.baseURL + '/') {
- this.items.push({
- name: '..',
- url: url.removeLastDir(uri) + '/'
- })
- }
-
- let req = JSON.parse(data)
- for (let item of req.items) {
- if (!item.isDir) continue
-
- this.items.push({
- name: item.name,
- url: item.uri
- })
- }
+ // If the path isn't the root path,
+ // show a button to navigate to the previous
+ // directory.
+ if (req.url !== '/files/') {
+ this.items.push({
+ name: '..',
+ url: url.removeLastDir(req.url) + '/'
})
- .catch(e => console.log(e))
+ }
+
+ // If this folder is empty, finish here.
+ if (req.items === null) return
+
+ // Otherwise we add every directory to the
+ // move options.
+ for (let item of req.items) {
+ if (!item.isDir) continue
+
+ this.items.push({
+ name: item.name,
+ url: item.url
+ })
+ }
},
- json: function (url) {
- return new Promise((resolve, reject) => {
- let request = new XMLHttpRequest()
- request.open('GET', url)
- request.setRequestHeader('Accept', 'application/json')
- request.onload = () => {
- if (request.status === 200) {
- resolve(request.responseText)
- } else {
- reject(request.statusText)
- }
- }
- request.onerror = () => reject(request.statusText)
- request.send()
- })
+ showError (error) {
+ this.$store.commit('showError', error)
+ },
+ next: function (event) {
+ // Retrieves the URL of the directory the user
+ // just clicked in and fill the options with its
+ // content.
+ let uri = event.currentTarget.dataset.url
+
+ api.fetch(uri)
+ .then(this.fillOptions)
+ .catch(this.showError)
},
select: function (event) {
- let el = event.currentTarget
-
- if (el.getAttribute('aria-selected') === 'true') {
- el.setAttribute('aria-selected', false)
+ // If the element is already selected, unselect it.
+ if (this.moveTo === event.currentTarget.dataset.url) {
+ this.moveTo = null
return
}
- let el2 = this.$el.querySelector('li[aria-selected=true]')
- if (el2) {
- el2.setAttribute('aria-selected', false)
- }
-
- el.setAttribute('aria-selected', true)
- return
+ // Otherwise select the element.
+ this.moveTo = event.currentTarget.dataset.url
}
}
}
diff --git a/assets/src/utils/api.js b/assets/src/utils/api.js
index f7132f3f..a3357e85 100644
--- a/assets/src/utils/api.js
+++ b/assets/src/utils/api.js
@@ -21,13 +21,10 @@ function fetch (url) {
request.onload = () => {
switch (request.status) {
case 200:
- let req = JSON.parse(request.responseText)
- store.commit('updateRequest', req)
- document.title = req.name
- resolve(req.url)
+ resolve(JSON.parse(request.responseText))
break
default:
- reject(request.status)
+ reject(request.responseText)
break
}
}