Skip to content

Commit c80e007

Browse files
authored
Merge pull request #25055 from nina-py/18439-add-crop-image-previews-setting
Add "Crop image previews" setting to files
2 parents 7958817 + c146388 commit c80e007

File tree

9 files changed

+85
-2
lines changed

9 files changed

+85
-2
lines changed

apps/files/appinfo/routes.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,11 @@
7676
'url' => '/api/v1/showhidden',
7777
'verb' => 'POST'
7878
],
79+
[
80+
'name' => 'API#cropImagePreviews',
81+
'url' => '/api/v1/cropimagepreviews',
82+
'verb' => 'POST'
83+
],
7984
[
8085
'name' => 'API#showGridView',
8186
'url' => '/api/v1/showgridview',

apps/files/js/app.js

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,18 @@
5656
var showHidden = $('#showHiddenFiles').val() === "1";
5757
this.$showHiddenFiles.prop('checked', showHidden);
5858

59+
// crop image previews
60+
this.$cropImagePreviews = $('input#cropimagepreviewsToggle');
61+
var cropImagePreviews = $('#cropImagePreviews').val() === "1";
62+
this.$cropImagePreviews.prop('checked', cropImagePreviews);
5963

6064
if ($('#fileNotFound').val() === "1") {
6165
OC.Notification.show(t('files', 'File could not be found'), {type: 'error'});
6266
}
6367

6468
this._filesConfig = new OC.Backbone.Model({
65-
showhidden: showHidden
69+
showhidden: showHidden,
70+
cropimagepreviews: cropImagePreviews,
6671
});
6772

6873
var urlParams = OC.Util.History.parseUrlQuery();
@@ -132,6 +137,7 @@
132137
});
133138

134139
this._debouncedPersistShowHiddenFilesState = _.debounce(this._persistShowHiddenFilesState, 1200);
140+
this._debouncedPersistCropImagePreviewsState = _.debounce(this._persistCropImagePreviewsState, 1200);
135141

136142
if (sessionStorage.getItem('WhatsNewServerCheck') < (Date.now() - 3600*1000)) {
137143
OCP.WhatsNew.query(); // for Nextcloud server
@@ -231,6 +237,7 @@
231237

232238
$('#app-navigation').on('itemChanged', _.bind(this._onNavigationChanged, this));
233239
this.$showHiddenFiles.on('change', _.bind(this._onShowHiddenFilesChange, this));
240+
this.$cropImagePreviews.on('change', _.bind(this._onCropImagePreviewsChange, this));
234241
},
235242

236243
/**
@@ -256,6 +263,29 @@
256263
});
257264
},
258265

266+
/**
267+
* Toggle cropping image previews according to the settings checkbox
268+
*
269+
* @returns void
270+
*/
271+
_onCropImagePreviewsChange: function() {
272+
var crop = this.$cropImagePreviews.is(':checked');
273+
this._filesConfig.set('cropimagepreviews', crop);
274+
this._debouncedPersistCropImagePreviewsState();
275+
},
276+
277+
/**
278+
* Persist crop image previews preference on the server
279+
*
280+
* @returns void
281+
*/
282+
_persistCropImagePreviewsState: function() {
283+
var crop = this._filesConfig.get('cropimagepreviews');
284+
$.post(OC.generateUrl('/apps/files/api/v1/cropimagepreviews'), {
285+
crop: crop
286+
});
287+
},
288+
259289
/**
260290
* Event handler for when the current navigation item has changed
261291
*/

apps/files/js/filelist.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,8 @@
252252
this._filesConfig = OCA.Files.App.getFilesConfig();
253253
} else {
254254
this._filesConfig = new OC.Backbone.Model({
255-
'showhidden': false
255+
'showhidden': false,
256+
'cropimagepreviews': true
256257
});
257258
}
258259

@@ -291,6 +292,10 @@
291292
}
292293
});
293294

295+
this._filesConfig.on('change:cropimagepreviews', function() {
296+
self.reload();
297+
});
298+
294299
this.$el.toggleClass('hide-hidden-files', !this._filesConfig.get('showhidden'));
295300
}
296301

@@ -2215,6 +2220,12 @@
22152220
urlSpec.y = Math.ceil(urlSpec.y);
22162221
urlSpec.forceIcon = 0;
22172222

2223+
/**
2224+
* Images are cropped to a square by default. Append a=1 to the URL
2225+
* if the user wants to see images with original aspect ratio.
2226+
*/
2227+
urlSpec.a = this._filesConfig.get('cropimagepreviews') ? 0 : 1;
2228+
22182229
if (typeof urlSpec.fileId !== 'undefined') {
22192230
delete urlSpec.file;
22202231
return OC.generateUrl('/core/preview?') + $.param(urlSpec);

apps/files/lib/Controller/ApiController.php

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,20 @@ public function showHiddenFiles($show) {
280280
return new Response();
281281
}
282282

283+
/**
284+
* Toggle default for cropping preview images
285+
*
286+
* @NoAdminRequired
287+
*
288+
* @param bool $crop
289+
* @return Response
290+
* @throws \OCP\PreConditionNotMetException
291+
*/
292+
public function cropImagePreviews($crop) {
293+
$this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'crop_image_previews', (int)$crop);
294+
return new Response();
295+
}
296+
283297
/**
284298
* Toggle default for files grid view
285299
*

apps/files/lib/Controller/ViewController.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,8 @@ public function index($dir = '', $view = '', $fileid = null, $fileNotFound = fal
296296
$params['isIE'] = \OCP\Util::isIE();
297297
$showHidden = (bool) $this->config->getUserValue($this->userSession->getUser()->getUID(), 'files', 'show_hidden', false);
298298
$params['showHiddenFiles'] = $showHidden ? 1 : 0;
299+
$cropImagePreviews = (bool) $this->config->getUserValue($this->userSession->getUser()->getUID(), 'files', 'crop_image_previews', true);
300+
$params['cropImagePreviews'] = $cropImagePreviews ? 1 : 0;
299301
$params['fileNotFound'] = $fileNotFound ? 1 : 0;
300302
$params['appNavigation'] = $nav;
301303
$params['appContents'] = $contentItems;

apps/files/templates/appnavigation.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,11 @@
4444
checked="checked" type="checkbox">
4545
<label for="showhiddenfilesToggle"><?php p($l->t('Show hidden files')); ?></label>
4646
</div>
47+
<div id="files-setting-cropimagepreviews">
48+
<input class="checkbox" id="cropimagepreviewsToggle"
49+
checked="checked" type="checkbox">
50+
<label for="cropimagepreviewsToggle"><?php p($l->t('Crop image previews')); ?></label>
51+
</div>
4752
<label for="webdavurl"><?php p($l->t('WebDAV')); ?></label>
4853
<input id="webdavurl" type="text" readonly="readonly"
4954
value="<?php p($_['webdav_url']); ?>"/>

apps/files/templates/index.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
<input type="hidden" name="defaultFileSorting" id="defaultFileSorting" value="<?php p($_['defaultFileSorting']) ?>" />
2929
<input type="hidden" name="defaultFileSortingDirection" id="defaultFileSortingDirection" value="<?php p($_['defaultFileSortingDirection']) ?>" />
3030
<input type="hidden" name="showHiddenFiles" id="showHiddenFiles" value="<?php p($_['showHiddenFiles']); ?>" />
31+
<input type="hidden" name="cropImagePreviews" id="cropImagePreviews" value="<?php p($_['cropImagePreviews']); ?>" />
3132
<?php endif;
3233

3334
foreach ($_['hiddenFields'] as $name => $value) {?>

apps/files/tests/Controller/ApiControllerTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,4 +246,17 @@ public function testShowHiddenFiles() {
246246

247247
$this->assertEquals($expected, $actual);
248248
}
249+
250+
public function testCropImagePreviews() {
251+
$crop = true;
252+
253+
$this->config->expects($this->once())
254+
->method('setUserValue')
255+
->with($this->user->getUID(), 'files', 'crop_image_previews', $crop);
256+
257+
$expected = new Http\Response();
258+
$actual = $this->apiController->cropImagePreviews($crop);
259+
260+
$this->assertEquals($expected, $actual);
261+
}
249262
}

apps/files/tests/Controller/ViewControllerTest.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ public function testIndexWithRegularBrowser() {
135135
[$this->user->getUID(), 'files', 'file_sorting', 'name', 'name'],
136136
[$this->user->getUID(), 'files', 'file_sorting_direction', 'asc', 'asc'],
137137
[$this->user->getUID(), 'files', 'show_hidden', false, false],
138+
[$this->user->getUID(), 'files', 'crop_image_previews', true, true],
138139
[$this->user->getUID(), 'files', 'show_grid', true],
139140
]);
140141

@@ -316,6 +317,7 @@ public function testIndexWithRegularBrowser() {
316317
'defaultFileSorting' => 'name',
317318
'defaultFileSortingDirection' => 'asc',
318319
'showHiddenFiles' => 0,
320+
'cropImagePreviews' => 1,
319321
'fileNotFound' => 0,
320322
'allowShareWithLink' => 'yes',
321323
'appNavigation' => $nav,

0 commit comments

Comments
 (0)