]> BookStack Code Mirror - bookstack/blob - resources/assets/js/vues/image-manager.js
Fixes issue with code not wrapping on revision page.
[bookstack] / resources / assets / js / vues / image-manager.js
1 const dropzone = require('./components/dropzone');
2
3 let page = 0;
4 let previousClickTime = 0;
5 let previousClickImage = 0;
6 let dataLoaded = false;
7 let callback = false;
8 let baseUrl = '';
9
10 let preSearchImages = [];
11 let preSearchHasMore = false;
12
13 const data = {
14     images: [],
15
16     imageType: false,
17     uploadedTo: false,
18
19     selectedImage: false,
20     dependantPages: false,
21     showing: false,
22     view: 'all',
23     hasMore: false,
24     searching: false,
25     searchTerm: '',
26
27     imageUpdateSuccess: false,
28     imageDeleteSuccess: false,
29     deleteConfirm: false,
30 };
31
32 const methods = {
33
34     show(providedCallback, imageType = null) {
35         callback = providedCallback;
36         this.showing = true;
37         this.$el.children[0].components.overlay.show();
38
39         // Get initial images if they have not yet been loaded in.
40         if (dataLoaded && imageType === this.imageType) return;
41         if (imageType) {
42             this.imageType = imageType;
43             this.resetState();
44         }
45         this.fetchData();
46         dataLoaded = true;
47     },
48
49     hide() {
50         if (this.$refs.dropzone) {
51             this.$refs.dropzone.onClose();
52         }
53         this.showing = false;
54         this.selectedImage = false;
55         this.$el.children[0].components.overlay.hide();
56     },
57
58     fetchData() {
59         let url = baseUrl + page;
60         let query = {};
61         if (this.uploadedTo !== false) query.page_id = this.uploadedTo;
62         if (this.searching) query.term = this.searchTerm;
63
64         this.$http.get(url, {params: query}).then(response => {
65             this.images = this.images.concat(response.data.images);
66             this.hasMore = response.data.hasMore;
67             page++;
68         });
69     },
70
71     setView(viewName) {
72         this.view = viewName;
73         this.resetState();
74         this.fetchData();
75     },
76
77     resetState() {
78         this.cancelSearch();
79         this.images = [];
80         this.hasMore = false;
81         this.deleteConfirm = false;
82         page = 0;
83         baseUrl = window.baseUrl(`/images/${this.imageType}/${this.view}/`);
84     },
85
86     searchImages() {
87         if (this.searchTerm === '') return this.cancelSearch();
88
89         // Cache current settings for later
90         if (!this.searching) {
91             preSearchImages = this.images;
92             preSearchHasMore = this.hasMore;
93         }
94
95         this.searching = true;
96         this.images = [];
97         this.hasMore = false;
98         page = 0;
99         baseUrl = window.baseUrl(`/images/${this.imageType}/search/`);
100         this.fetchData();
101     },
102
103     cancelSearch() {
104         if (!this.searching) return;
105         this.searching = false;
106         this.searchTerm = '';
107         this.images = preSearchImages;
108         this.hasMore = preSearchHasMore;
109     },
110
111     imageSelect(image) {
112         let dblClickTime = 300;
113         let currentTime = Date.now();
114         let timeDiff = currentTime - previousClickTime;
115         let isDblClick = timeDiff < dblClickTime && image.id === previousClickImage;
116
117         if (isDblClick) {
118             this.callbackAndHide(image);
119         } else {
120             this.selectedImage = image;
121             this.deleteConfirm = false;
122             this.dependantPages = false;
123         }
124
125         previousClickTime = currentTime;
126         previousClickImage = image.id;
127     },
128
129     callbackAndHide(imageResult) {
130         if (callback) callback(imageResult);
131         this.hide();
132     },
133
134     saveImageDetails() {
135         let url = window.baseUrl(`/images/update/${this.selectedImage.id}`);
136         this.$http.put(url, this.selectedImage).then(response => {
137             this.$events.emit('success', trans('components.image_update_success'));
138         }).catch(error => {
139             if (error.response.status === 422) {
140                 let errors = error.response.data;
141                 let message = '';
142                 Object.keys(errors).forEach((key) => {
143                     message += errors[key].join('\n');
144                 });
145                 this.$events.emit('error', message);
146             }
147         });
148     },
149
150     deleteImage() {
151
152         if (!this.deleteConfirm) {
153             let url = window.baseUrl(`/images/usage/${this.selectedImage.id}`);
154             this.$http.get(url).then(resp => {
155                 this.dependantPages = resp.data;
156             }).catch(console.error).then(() => {
157                 this.deleteConfirm = true;
158             });
159             return;
160         }
161
162         this.$http.delete(`/images/${this.selectedImage.id}`).then(resp => {
163             this.images.splice(this.images.indexOf(this.selectedImage), 1);
164             this.selectedImage = false;
165             this.$events.emit('success', trans('components.image_delete_success'));
166             this.deleteConfirm = false;
167         });
168     },
169
170     getDate(stringDate) {
171         return new Date(stringDate);
172     },
173
174     uploadSuccess(event) {
175         this.images.unshift(event.data);
176         this.$events.emit('success', trans('components.image_upload_success'));
177     },
178 };
179
180 const computed = {
181     uploadUrl() {
182         return window.baseUrl(`/images/${this.imageType}/upload`);
183     }
184 };
185
186 function mounted() {
187     window.ImageManager = this;
188     this.imageType = this.$el.getAttribute('image-type');
189     this.uploadedTo = this.$el.getAttribute('uploaded-to');
190     baseUrl = window.baseUrl('/images/' + this.imageType + '/all/')
191 }
192
193 module.exports = {
194     mounted,
195     methods,
196     data,
197     computed,
198     components: {dropzone},
199 };