mirror of
https://github.com/BookStackApp/BookStack.git
synced 2024-11-29 04:10:09 +08:00
201 lines
5.4 KiB
JavaScript
201 lines
5.4 KiB
JavaScript
import * as Dates from "../services/dates";
|
|
import dropzone from "./components/dropzone";
|
|
|
|
let page = 0;
|
|
let previousClickTime = 0;
|
|
let previousClickImage = 0;
|
|
let dataLoaded = false;
|
|
let callback = false;
|
|
let baseUrl = '';
|
|
|
|
let preSearchImages = [];
|
|
let preSearchHasMore = false;
|
|
|
|
const data = {
|
|
images: [],
|
|
|
|
imageType: false,
|
|
uploadedTo: false,
|
|
|
|
selectedImage: false,
|
|
dependantPages: false,
|
|
showing: false,
|
|
view: 'all',
|
|
hasMore: false,
|
|
searching: false,
|
|
searchTerm: '',
|
|
|
|
imageUpdateSuccess: false,
|
|
imageDeleteSuccess: false,
|
|
deleteConfirm: false,
|
|
};
|
|
|
|
const methods = {
|
|
|
|
show(providedCallback, imageType = null) {
|
|
callback = providedCallback;
|
|
this.showing = true;
|
|
this.$el.children[0].components.overlay.show();
|
|
|
|
// Get initial images if they have not yet been loaded in.
|
|
if (dataLoaded && imageType === this.imageType) return;
|
|
if (imageType) {
|
|
this.imageType = imageType;
|
|
this.resetState();
|
|
}
|
|
this.fetchData();
|
|
dataLoaded = true;
|
|
},
|
|
|
|
hide() {
|
|
if (this.$refs.dropzone) {
|
|
this.$refs.dropzone.onClose();
|
|
}
|
|
this.showing = false;
|
|
this.selectedImage = false;
|
|
this.$el.children[0].components.overlay.hide();
|
|
},
|
|
|
|
fetchData() {
|
|
let url = baseUrl + page;
|
|
let query = {};
|
|
if (this.uploadedTo !== false) query.uploaded_to = this.uploadedTo;
|
|
if (this.searching) query.term = this.searchTerm;
|
|
|
|
this.$http.get(url, {params: query}).then(response => {
|
|
this.images = this.images.concat(response.data.images);
|
|
this.hasMore = response.data.hasMore;
|
|
page++;
|
|
});
|
|
},
|
|
|
|
setView(viewName) {
|
|
this.view = viewName;
|
|
this.resetState();
|
|
this.fetchData();
|
|
},
|
|
|
|
resetState() {
|
|
this.cancelSearch();
|
|
this.images = [];
|
|
this.hasMore = false;
|
|
this.deleteConfirm = false;
|
|
page = 0;
|
|
baseUrl = window.baseUrl(`/images/${this.imageType}/${this.view}/`);
|
|
},
|
|
|
|
searchImages() {
|
|
if (this.searchTerm === '') return this.cancelSearch();
|
|
|
|
// Cache current settings for later
|
|
if (!this.searching) {
|
|
preSearchImages = this.images;
|
|
preSearchHasMore = this.hasMore;
|
|
}
|
|
|
|
this.searching = true;
|
|
this.images = [];
|
|
this.hasMore = false;
|
|
page = 0;
|
|
baseUrl = window.baseUrl(`/images/${this.imageType}/search/`);
|
|
this.fetchData();
|
|
},
|
|
|
|
cancelSearch() {
|
|
if (!this.searching) return;
|
|
this.searching = false;
|
|
this.searchTerm = '';
|
|
this.images = preSearchImages;
|
|
this.hasMore = preSearchHasMore;
|
|
},
|
|
|
|
imageSelect(image) {
|
|
let dblClickTime = 300;
|
|
let currentTime = Date.now();
|
|
let timeDiff = currentTime - previousClickTime;
|
|
let isDblClick = timeDiff < dblClickTime && image.id === previousClickImage;
|
|
|
|
if (isDblClick) {
|
|
this.callbackAndHide(image);
|
|
} else {
|
|
this.selectedImage = image;
|
|
this.deleteConfirm = false;
|
|
this.dependantPages = false;
|
|
}
|
|
|
|
previousClickTime = currentTime;
|
|
previousClickImage = image.id;
|
|
},
|
|
|
|
callbackAndHide(imageResult) {
|
|
if (callback) callback(imageResult);
|
|
this.hide();
|
|
},
|
|
|
|
saveImageDetails() {
|
|
let url = window.baseUrl(`/images/${this.selectedImage.id}`);
|
|
this.$http.put(url, this.selectedImage).then(response => {
|
|
this.$events.emit('success', trans('components.image_update_success'));
|
|
}).catch(error => {
|
|
if (error.response.status === 422) {
|
|
let errors = error.response.data;
|
|
let message = '';
|
|
Object.keys(errors).forEach((key) => {
|
|
message += errors[key].join('\n');
|
|
});
|
|
this.$events.emit('error', message);
|
|
}
|
|
});
|
|
},
|
|
|
|
deleteImage() {
|
|
|
|
if (!this.deleteConfirm) {
|
|
let url = window.baseUrl(`/images/usage/${this.selectedImage.id}`);
|
|
this.$http.get(url).then(resp => {
|
|
this.dependantPages = resp.data;
|
|
}).catch(console.error).then(() => {
|
|
this.deleteConfirm = true;
|
|
});
|
|
return;
|
|
}
|
|
let url = window.baseUrl(`/images/${this.selectedImage.id}`);
|
|
this.$http.delete(url).then(resp => {
|
|
this.images.splice(this.images.indexOf(this.selectedImage), 1);
|
|
this.selectedImage = false;
|
|
this.$events.emit('success', trans('components.image_delete_success'));
|
|
this.deleteConfirm = false;
|
|
});
|
|
},
|
|
|
|
getDate(stringDate) {
|
|
return Dates.formatDateTime(new Date(stringDate));
|
|
},
|
|
|
|
uploadSuccess(event) {
|
|
this.images.unshift(event.data);
|
|
this.$events.emit('success', trans('components.image_upload_success'));
|
|
},
|
|
};
|
|
|
|
const computed = {
|
|
uploadUrl() {
|
|
return window.baseUrl(`/images/${this.imageType}/upload`);
|
|
}
|
|
};
|
|
|
|
function mounted() {
|
|
window.ImageManager = this;
|
|
this.imageType = this.$el.getAttribute('image-type');
|
|
this.uploadedTo = this.$el.getAttribute('uploaded-to');
|
|
baseUrl = window.baseUrl('/images/' + this.imageType + '/all/')
|
|
}
|
|
|
|
export default {
|
|
mounted,
|
|
methods,
|
|
data,
|
|
computed,
|
|
components: {dropzone},
|
|
};
|