Blame view

sources/apps/files/js/files.js 13.5 KB
6d9380f96   Cédric Dupont   Update sources OC...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
  /*
   * Copyright (c) 2014
   *
   * This file is licensed under the Affero General Public License version 3
   * or later.
   *
   * See the COPYING-README file.
   *
   */
  
  /* global getURLParameter */
  /**
   * Utility class for file related operations
   */
  (function() {
  	var Files = {
  		// file space size sync
  		_updateStorageStatistics: function(currentDir) {
  			var state = Files.updateStorageStatistics;
  			if (state.dir){
  				if (state.dir === currentDir) {
  					return;
  				}
  				// cancel previous call, as it was for another dir
  				state.call.abort();
  			}
  			state.dir = currentDir;
  			state.call = $.getJSON(OC.filePath('files','ajax','getstoragestats.php') + '?dir=' + encodeURIComponent(currentDir),function(response) {
  				state.dir = null;
  				state.call = null;
  				Files.updateMaxUploadFilesize(response);
  			});
  		},
  		/**
  		 * Update storage statistics such as free space, max upload,
  		 * etc based on the given directory.
  		 *
  		 * Note this function is debounced to avoid making too
  		 * many ajax calls in a row.
  		 *
  		 * @param dir directory
  		 * @param force whether to force retrieving
  		 */
  		updateStorageStatistics: function(dir, force) {
  			if (!OC.currentUser) {
31b7f2792   Kload   Upgrade to ownclo...
46
  				return;
03e52840d   Kload   Init
47
  			}
31b7f2792   Kload   Upgrade to ownclo...
48

6d9380f96   Cédric Dupont   Update sources OC...
49
50
  			if (force) {
  				Files._updateStorageStatistics(dir);
03e52840d   Kload   Init
51
  			}
6d9380f96   Cédric Dupont   Update sources OC...
52
53
  			else {
  				Files._updateStorageStatisticsDebounced(dir);
31b7f2792   Kload   Upgrade to ownclo...
54
  			}
6d9380f96   Cédric Dupont   Update sources OC...
55
  		},
31b7f2792   Kload   Upgrade to ownclo...
56

6d9380f96   Cédric Dupont   Update sources OC...
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
  		updateMaxUploadFilesize:function(response) {
  			if (response === undefined) {
  				return;
  			}
  			if (response.data !== undefined && response.data.uploadMaxFilesize !== undefined) {
  				$('#max_upload').val(response.data.uploadMaxFilesize);
  				$('#free_space').val(response.data.freeSpace);
  				$('#upload.button').attr('original-title', response.data.maxHumanFilesize);
  				$('#usedSpacePercent').val(response.data.usedSpacePercent);
  				Files.displayStorageWarnings();
  			}
  			if (response[0] === undefined) {
  				return;
  			}
  			if (response[0].uploadMaxFilesize !== undefined) {
  				$('#max_upload').val(response[0].uploadMaxFilesize);
  				$('#upload.button').attr('original-title', response[0].maxHumanFilesize);
  				$('#usedSpacePercent').val(response[0].usedSpacePercent);
  				Files.displayStorageWarnings();
31b7f2792   Kload   Upgrade to ownclo...
76
  			}
31b7f2792   Kload   Upgrade to ownclo...
77

6d9380f96   Cédric Dupont   Update sources OC...
78
  		},
31b7f2792   Kload   Upgrade to ownclo...
79

6d9380f96   Cédric Dupont   Update sources OC...
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
  		/**
  		 * Fix path name by removing double slash at the beginning, if any
  		 */
  		fixPath: function(fileName) {
  			if (fileName.substr(0, 2) == '//') {
  				return fileName.substr(1);
  			}
  			return fileName;
  		},
  
  		/**
  		 * Checks whether the given file name is valid.
  		 * @param name file name to check
  		 * @return true if the file name is valid.
  		 * Throws a string exception with an error message if
  		 * the file name is not valid
  		 */
  		isFileNameValid: function (name) {
  			var trimmedName = name.trim();
  			if (trimmedName === '.'	|| trimmedName === '..')
  			{
  				throw t('files', '"{name}" is an invalid file name.', {name: name});
  			} else if (trimmedName.length === 0) {
  				throw t('files', 'File name cannot be empty.');
  			}
  			// check for invalid characters
  			var invalidCharacters =
  				['\\', '/', '<', '>', ':', '"', '|', '?', '*', '
  '];
  			for (var i = 0; i < invalidCharacters.length; i++) {
  				if (trimmedName.indexOf(invalidCharacters[i]) !== -1) {
  					throw t('files', "Invalid name, '\\', '/', '<', '>', ':', '\"', '|', '?' and '*' are not allowed.");
31b7f2792   Kload   Upgrade to ownclo...
112
113
  				}
  			}
6d9380f96   Cédric Dupont   Update sources OC...
114
115
116
117
118
119
  			return true;
  		},
  		displayStorageWarnings: function() {
  			if (!OC.Notification.isHidden()) {
  				return;
  			}
03e52840d   Kload   Init
120

6d9380f96   Cédric Dupont   Update sources OC...
121
122
123
124
125
126
127
128
129
130
  			var usedSpacePercent = $('#usedSpacePercent').val();
  			if (usedSpacePercent > 98) {
  				OC.Notification.show(t('files', 'Your storage is full, files can not be updated or synced anymore!'));
  				return;
  			}
  			if (usedSpacePercent > 90) {
  				OC.Notification.show(t('files', 'Your storage is almost full ({usedSpacePercent}%)',
  					{usedSpacePercent: usedSpacePercent}));
  			}
  		},
03e52840d   Kload   Init
131

6d9380f96   Cédric Dupont   Update sources OC...
132
  		displayEncryptionWarning: function() {
03e52840d   Kload   Init
133

6d9380f96   Cédric Dupont   Update sources OC...
134
135
136
  			if (!OC.Notification.isHidden()) {
  				return;
  			}
03e52840d   Kload   Init
137

6d9380f96   Cédric Dupont   Update sources OC...
138
139
140
141
142
  			var encryptedFiles = $('#encryptedFiles').val();
  			var initStatus = $('#encryptionInitStatus').val();
  			if (initStatus === '0') { // enc not initialized, but should be
  				OC.Notification.show(t('files', 'Encryption App is enabled but your keys are not initialized, please log-out and log-in again'));
  				return;
03e52840d   Kload   Init
143
  			}
6d9380f96   Cédric Dupont   Update sources OC...
144
145
146
  			if (initStatus === '1') { // encryption tried to init but failed
  				OC.Notification.show(t('files', 'Invalid private key for Encryption App. Please update your private key password in your personal settings to recover access to your encrypted files.'));
  				return;
03e52840d   Kload   Init
147
  			}
6d9380f96   Cédric Dupont   Update sources OC...
148
149
150
  			if (encryptedFiles === '1') {
  				OC.Notification.show(t('files', 'Encryption was disabled but your files are still encrypted. Please go to your personal settings to decrypt your files.'));
  				return;
03e52840d   Kload   Init
151
  			}
6d9380f96   Cédric Dupont   Update sources OC...
152
153
154
155
156
157
158
159
160
161
  		},
  
  		/**
  		 * Returns the download URL of the given file(s)
  		 * @param filename string or array of file names to download
  		 * @param dir optional directory in which the file name is, defaults to the current directory
  		 */
  		getDownloadUrl: function(filename, dir) {
  			if ($.isArray(filename)) {
  				filename = JSON.stringify(filename);
03e52840d   Kload   Init
162
  			}
6d9380f96   Cédric Dupont   Update sources OC...
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
  			var params = {
  				dir: dir,
  				files: filename
  			};
  			return this.getAjaxUrl('download', params);
  		},
  
  		/**
  		 * Returns the ajax URL for a given action
  		 * @param action action string
  		 * @param params optional params map
  		 */
  		getAjaxUrl: function(action, params) {
  			var q = '';
  			if (params) {
  				q = '?' + OC.buildQueryString(params);
03e52840d   Kload   Init
179
  			}
6d9380f96   Cédric Dupont   Update sources OC...
180
181
  			return OC.filePath('files', 'ajax', action + '.php') + q;
  		},
03e52840d   Kload   Init
182

6d9380f96   Cédric Dupont   Update sources OC...
183
184
185
  		getMimeIcon: function(mime, ready) {
  			if (Files.getMimeIcon.cache[mime]) {
  				ready(Files.getMimeIcon.cache[mime]);
837968727   Kload   [enh] Upgrade to ...
186
  			} else {
6d9380f96   Cédric Dupont   Update sources OC...
187
188
189
190
191
192
193
  				$.get( OC.filePath('files','ajax','mimeicon.php'), {mime: mime}, function(path) {
  					if(OC.Util.hasSVGSupport()){
  						path = path.substr(0, path.length-4) + '.svg';
  					}
  					Files.getMimeIcon.cache[mime]=path;
  					ready(Files.getMimeIcon.cache[mime]);
  				});
837968727   Kload   [enh] Upgrade to ...
194
  			}
6d9380f96   Cédric Dupont   Update sources OC...
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
  		},
  
  		/**
  		 * Generates a preview URL based on the URL space.
  		 * @param urlSpec map with {x: width, y: height, file: file path}
  		 * @return preview URL
  		 * @deprecated used OCA.Files.FileList.generatePreviewUrl instead
  		 */
  		generatePreviewUrl: function(urlSpec) {
  			console.warn('DEPRECATED: please use generatePreviewUrl() from an OCA.Files.FileList instance');
  			return OCA.Files.App.fileList.generatePreviewUrl(urlSpec);
  		},
  
  		/**
  		 * Lazy load preview
  		 * @deprecated used OCA.Files.FileList.lazyLoadPreview instead
  		 */
  		lazyLoadPreview : function(path, mime, ready, width, height, etag) {
  			console.warn('DEPRECATED: please use lazyLoadPreview() from an OCA.Files.FileList instance');
  			return OCA.Files.App.fileList.lazyLoadPreview({
  				path: path,
  				mime: mime,
  				callback: ready,
  				width: width,
  				height: height,
  				etag: etag
  			});
  		},
  
  		/**
  		 * Initialize the files view
  		 */
  		initialize: function() {
  			Files.getMimeIcon.cache = {};
  			Files.displayEncryptionWarning();
  			Files.bindKeyboardShortcuts(document, $);
  
  			// TODO: move file list related code (upload) to OCA.Files.FileList
  			$('#file_action_panel').attr('activeAction', false);
  
  			// Triggers invisible file input
  			$('#upload a').on('click', function() {
  				$(this).parent().children('#file_upload_start').trigger('click');
  				return false;
  			});
03e52840d   Kload   Init
240

6d9380f96   Cédric Dupont   Update sources OC...
241
242
243
244
  			// Trigger cancelling of file upload
  			$('#uploadprogresswrapper .stop').on('click', function() {
  				OC.Upload.cancelUploads();
  			});
03e52840d   Kload   Init
245

6d9380f96   Cédric Dupont   Update sources OC...
246
247
248
249
250
  			// drag&drop support using jquery.fileupload
  			// TODO use OC.dialogs
  			$(document).bind('drop dragover', function (e) {
  					e.preventDefault(); // prevent browser from doing anything, if file isn't dropped in dropZone
  				});
03e52840d   Kload   Init
251

6d9380f96   Cédric Dupont   Update sources OC...
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
  			//do a background scan if needed
  			scanFiles();
  
  			// display storage warnings
  			setTimeout(Files.displayStorageWarnings, 100);
  			OC.Notification.setDefault(Files.displayStorageWarnings);
  
  			// only possible at the moment if user is logged in or the files app is loaded
  			if (OC.currentUser && OCA.Files.App) {
  				// start on load - we ask the server every 5 minutes
  				var func = _.bind(OCA.Files.App.fileList.updateStorageStatistics, OCA.Files.App.fileList);
  				var updateStorageStatisticsInterval = 5*60*1000;
  				var updateStorageStatisticsIntervalId = setInterval(func, updateStorageStatisticsInterval);
  
  				// TODO: this should also stop when switching to another view
  				// Use jquery-visibility to de-/re-activate file stats sync
  				if ($.support.pageVisibility) {
  					$(document).on({
  						'show.visibility': function() {
  							if (!updateStorageStatisticsIntervalId) {
  								updateStorageStatisticsIntervalId = setInterval(func, updateStorageStatisticsInterval);
  							}
  						},
  						'hide.visibility': function() {
  							clearInterval(updateStorageStatisticsIntervalId);
  							updateStorageStatisticsIntervalId = 0;
  						}
  					});
  				}
  			}
03e52840d   Kload   Init
282

03e52840d   Kload   Init
283

6d9380f96   Cédric Dupont   Update sources OC...
284
285
  			$('#webdavurl').on('click', function () {
  				$('#webdavurl').select();
31b7f2792   Kload   Upgrade to ownclo...
286
  			});
6d9380f96   Cédric Dupont   Update sources OC...
287
288
289
290
291
292
293
  
  			//FIXME scroll to and highlight preselected file
  			/*
  			if (getURLParameter('scrollto')) {
  				FileList.scrollTo(getURLParameter('scrollto'));
  			}
  			*/
31b7f2792   Kload   Upgrade to ownclo...
294
  		}
03e52840d   Kload   Init
295
  	}
6d9380f96   Cédric Dupont   Update sources OC...
296
297
298
  	Files._updateStorageStatisticsDebounced = _.debounce(Files._updateStorageStatistics, 250);
  	OCA.Files.Files = Files;
  })();
03e52840d   Kload   Init
299

31b7f2792   Kload   Upgrade to ownclo...
300
  function scanFiles(force, dir, users) {
03e52840d   Kload   Init
301
302
303
  	if (!OC.currentUser) {
  		return;
  	}
31b7f2792   Kload   Upgrade to ownclo...
304
  	if (!dir) {
03e52840d   Kload   Init
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
  		dir = '';
  	}
  	force = !!force; //cast to bool
  	scanFiles.scanning = true;
  	var scannerEventSource;
  	if (users) {
  		var usersString;
  		if (users === 'all') {
  			usersString = users;
  		} else {
  			usersString = JSON.stringify(users);
  		}
  		scannerEventSource = new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force: force,dir: dir, users: usersString});
  	} else {
  		scannerEventSource = new OC.EventSource(OC.filePath('files','ajax','scan.php'),{force: force,dir: dir});
  	}
  	scanFiles.cancel = scannerEventSource.close.bind(scannerEventSource);
31b7f2792   Kload   Upgrade to ownclo...
322
323
  	scannerEventSource.listen('count',function(count) {
  		console.log(count + ' files scanned');
03e52840d   Kload   Init
324
  	});
31b7f2792   Kload   Upgrade to ownclo...
325
326
  	scannerEventSource.listen('folder',function(path) {
  		console.log('now scanning ' + path);
03e52840d   Kload   Init
327
  	});
31b7f2792   Kload   Upgrade to ownclo...
328
  	scannerEventSource.listen('done',function(count) {
03e52840d   Kload   Init
329
  		scanFiles.scanning=false;
31b7f2792   Kload   Upgrade to ownclo...
330
  		console.log('done after ' + count + ' files');
6d9380f96   Cédric Dupont   Update sources OC...
331
332
333
  		if (OCA.Files.App) {
  			OCA.Files.App.fileList.updateStorageStatistics(true);
  		}
03e52840d   Kload   Init
334
  	});
31b7f2792   Kload   Upgrade to ownclo...
335
  	scannerEventSource.listen('user',function(user) {
03e52840d   Kload   Init
336
337
338
339
  		console.log('scanning files for ' + user);
  	});
  }
  scanFiles.scanning=false;
6d9380f96   Cédric Dupont   Update sources OC...
340
  // TODO: move to FileList
31b7f2792   Kload   Upgrade to ownclo...
341
  var createDragShadow = function(event) {
03e52840d   Kload   Init
342
  	//select dragged file
6d9380f96   Cédric Dupont   Update sources OC...
343
  	var FileList = OCA.Files.App.fileList;
03e52840d   Kload   Init
344
345
346
  	var isDragSelected = $(event.target).parents('tr').find('td input:first').prop('checked');
  	if (!isDragSelected) {
  		//select dragged file
6d9380f96   Cédric Dupont   Update sources OC...
347
  		FileList._selectFileEl($(event.target).parents('tr:first'), true);
03e52840d   Kload   Init
348
  	}
6d9380f96   Cédric Dupont   Update sources OC...
349
350
351
  	// do not show drag shadow for too many files
  	var selectedFiles = _.first(FileList.getSelectedFiles(), FileList.pageSize);
  	selectedFiles = _.sortBy(selectedFiles, FileList._fileInfoCompare);
03e52840d   Kload   Init
352

31b7f2792   Kload   Upgrade to ownclo...
353
  	if (!isDragSelected && selectedFiles.length === 1) {
03e52840d   Kload   Init
354
  		//revert the selection
6d9380f96   Cédric Dupont   Update sources OC...
355
  		FileList._selectFileEl($(event.target).parents('tr:first'), false);
03e52840d   Kload   Init
356
357
358
359
360
361
  	}
  
  	// build dragshadow
  	var dragshadow = $('<table class="dragshadow"></table>');
  	var tbody = $('<tbody></tbody>');
  	dragshadow.append(tbody);
6d9380f96   Cédric Dupont   Update sources OC...
362
  	var dir = FileList.getCurrentDirectory();
03e52840d   Kload   Init
363

31b7f2792   Kload   Upgrade to ownclo...
364
  	$(selectedFiles).each(function(i,elem) {
6d9380f96   Cédric Dupont   Update sources OC...
365
366
367
368
  		var newtr = $('<tr/>')
  			.attr('data-dir', dir)
  			.attr('data-file', elem.name)
  			.attr('data-origin', elem.origin);
03e52840d   Kload   Init
369
  		newtr.append($('<td/>').addClass('filename').text(elem.name));
6d9380f96   Cédric Dupont   Update sources OC...
370
  		newtr.append($('<td/>').addClass('size').text(OC.Util.humanFileSize(elem.size)));
03e52840d   Kload   Init
371
372
373
374
  		tbody.append(newtr);
  		if (elem.type === 'dir') {
  			newtr.find('td.filename').attr('style','background-image:url('+OC.imagePath('core', 'filetypes/folder.png')+')');
  		} else {
6d9380f96   Cédric Dupont   Update sources OC...
375
376
  			var path = dir + '/' + elem.name;
  			OCA.Files.App.files.lazyLoadPreview(path, elem.mime, function(previewpath) {
31b7f2792   Kload   Upgrade to ownclo...
377
378
  				newtr.find('td.filename').attr('style','background-image:url('+previewpath+')');
  			}, null, null, elem.etag);
03e52840d   Kload   Init
379
380
381
382
  		}
  	});
  
  	return dragshadow;
31b7f2792   Kload   Upgrade to ownclo...
383
  };
03e52840d   Kload   Init
384
385
  
  //options for file drag/drop
6d9380f96   Cédric Dupont   Update sources OC...
386
387
  //start&stop handlers needs some cleaning up
  // TODO: move to FileList class
03e52840d   Kload   Init
388
  var dragOptions={
6d9380f96   Cédric Dupont   Update sources OC...
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
  	revert: 'invalid',
  	revertDuration: 300,
  	opacity: 0.7,
  	zIndex: 100,
  	appendTo: 'body',
  	cursorAt: { left: 24, top: 18 },
  	helper: createDragShadow,
  	cursor: 'move',
  	start: function(event, ui){
  		var $selectedFiles = $('td.filename input:checkbox:checked');
  		if($selectedFiles.length > 1){
  			$selectedFiles.parents('tr').fadeTo(250, 0.2);
  		}
  		else{
  			$(this).fadeTo(250, 0.2);
  		}
  	},
03e52840d   Kload   Init
406
  	stop: function(event, ui) {
6d9380f96   Cédric Dupont   Update sources OC...
407
408
409
410
411
412
413
  		var $selectedFiles = $('td.filename input:checkbox:checked');
  		if($selectedFiles.length > 1){
  			$selectedFiles.parents('tr').fadeTo(250, 1);
  		}
  		else{
  			$(this).fadeTo(250, 1);
  		}
03e52840d   Kload   Init
414
415
  		$('#fileList tr td.filename').addClass('ui-draggable');
  	}
31b7f2792   Kload   Upgrade to ownclo...
416
  };
03e52840d   Kload   Init
417
418
419
420
  // sane browsers support using the distance option
  if ( $('html.ie').length === 0) {
  	dragOptions['distance'] = 20;
  }
6d9380f96   Cédric Dupont   Update sources OC...
421
422
423
  // TODO: move to FileList class
  var folderDropOptions = {
  	hoverClass: "canDrop",
03e52840d   Kload   Init
424
  	drop: function( event, ui ) {
6d9380f96   Cédric Dupont   Update sources OC...
425
426
  		// don't allow moving a file into a selected folder
  		var FileList = OCA.Files.App.fileList;
03e52840d   Kload   Init
427
428
429
  		if ($(event.target).parents('tr').find('td input:first').prop('checked') === true) {
  			return false;
  		}
6d9380f96   Cédric Dupont   Update sources OC...
430
  		var targetPath = FileList.getCurrentDirectory() + '/' + $(this).closest('tr').data('file');
03e52840d   Kload   Init
431

6d9380f96   Cédric Dupont   Update sources OC...
432
433
434
435
  		var files = FileList.getSelectedFiles();
  		if (files.length === 0) {
  			// single one selected without checkbox?
  			files = _.map(ui.helper.find('tr'), FileList.elementToFile);
03e52840d   Kload   Init
436
  		}
6d9380f96   Cédric Dupont   Update sources OC...
437
438
  
  		FileList.move(_.pluck(files, 'name'), targetPath);
03e52840d   Kload   Init
439
440
  	},
  	tolerance: 'pointer'
31b7f2792   Kload   Upgrade to ownclo...
441
  };
03e52840d   Kload   Init
442

6d9380f96   Cédric Dupont   Update sources OC...
443
444
445
  // override core's fileDownloadPath (legacy)
  function fileDownloadPath(dir, file) {
  	return OCA.Files.Files.getDownloadUrl(file, dir);
31b7f2792   Kload   Upgrade to ownclo...
446
  }
6d9380f96   Cédric Dupont   Update sources OC...
447
448
  // for backward compatibility
  window.Files = OCA.Files.Files;
31b7f2792   Kload   Upgrade to ownclo...
449