diff --git a/app/Http/Controllers/Admin/PhotoController.php b/app/Http/Controllers/Admin/PhotoController.php index 1a12be0..885ec68 100644 --- a/app/Http/Controllers/Admin/PhotoController.php +++ b/app/Http/Controllers/Admin/PhotoController.php @@ -431,25 +431,43 @@ class PhotoController extends Controller private function applyBulkActions(Request $request, Album $album) { - $photoIds = $request->get('select-photo'); - if (is_null($photoIds) || !is_array($photoIds) || count($photoIds) == 0) + $selectAllInAlbum = boolval($request->get('select-all-album')); + $photosToProcess = []; + + if ($selectAllInAlbum) { - $request->session()->flash('warning', trans('admin.no_photo_selected_message')); - return 0; + foreach ($album->photos as $photo) + { + $photosToProcess[] = $photo; + } + } + else + { + $photoIds = $request->get('select-photo'); + if (is_null($photoIds) || !is_array($photoIds) || count($photoIds) == 0) + { + $request->session()->flash('warning', trans('admin.no_photo_selected_message')); + return 0; + } + + foreach ($photoIds as $photoId) + { + /** @var Photo $photo */ + $photo = $album->photos()->where('id', intval($photoId))->first(); + if (is_null($photo)) + { + continue; + } + + $photosToProcess[] = $photo; + } } $action = $request->get('bulk-action'); $numberChanged = 0; - foreach ($photoIds as $photoId) + foreach ($photosToProcess as $photo) { - /** @var Photo $photo */ - $photo = $album->photos()->where('id', intval($photoId))->first(); - if (is_null($photo)) - { - continue; - } - $photoService = new PhotoService($photo); $doNotSave = false; switch (strtolower($action)) diff --git a/public/themes/base/js/app.js b/public/themes/base/js/app.js index 40ad6c5..1b2c732 100644 --- a/public/themes/base/js/app.js +++ b/public/themes/base/js/app.js @@ -116,7 +116,9 @@ function EditPhotosViewModel(album_id, language, urls) { self.albums = ko.observableArray(); self.bulkModifyMethod = ko.observable(); self.photoIDs = ko.observableArray(); + self.photoIDsAvailable = ko.observableArray(); self.isSubmitting = false; + self.selectAllInAlbum = ko.observable(0); /* Called when the Apply button on the "bulk apply selected actions" form is clicked */ self.bulkModifySelected = function() @@ -146,8 +148,8 @@ function EditPhotosViewModel(album_id, language, urls) { { // Prompt for a confirmation - are you sure?! bootbox.dialog({ - message: language.delete_bulk_confirm_message.replace(':number', self.photoIDs().length), - title: language.delete_bulk_confirm_title.replace(':number', self.photoIDs().length), + message: language.delete_bulk_confirm_message, + title: language.delete_bulk_confirm_title, buttons: { cancel: { label: language.action_cancel, @@ -385,6 +387,48 @@ function EditPhotosViewModel(album_id, language, urls) { return false; }; + self.selectAll = function() { + bootbox.dialog({ + title: language.select_all_choice_title, + message: language.select_all_choice_message, + buttons: { + select_all: { + label: language.select_all_choice_all_action, + className: 'btn-default', + callback: function() + { + self.selectAllInAlbum(1); + for (i = 0; i < self.photoIDsAvailable().length; i++) + { + self.photoIDs.push(self.photoIDsAvailable()[i]); + } + } + }, + select_visible: { + label: language.select_all_choice_visible_action, + className: 'btn-primary', + callback: function() + { + self.selectAllInAlbum(0); + for (i = 0; i < self.photoIDsAvailable().length; i++) + { + self.photoIDs.push(self.photoIDsAvailable()[i]); + } + } + } + } + }); + + return false; + }; + + self.selectNone = function() { + self.photoIDs.removeAll(); + self.selectAllInAlbum(0); + + return false; + }; + self.selectPhotoSingle = function (link_item) { // Get the photo ID from the clicked link var parent = $(link_item).parents('.photo'); diff --git a/resources/lang/en/admin.php b/resources/lang/en/admin.php index 2373e13..65217a2 100644 --- a/resources/lang/en/admin.php +++ b/resources/lang/en/admin.php @@ -42,8 +42,8 @@ return [ 'delete_album' => 'Delete album :name', 'delete_album_confirm' => 'Are you sure you want to permanently delete this album and all its contents?', 'delete_album_warning' => 'This is a permanent action that cannot be undone!', - 'delete_bulk_photos_message' => 'Are you sure you want to delete the :number selected photos? This action cannot be undone!', - 'delete_bulk_photos_title' => 'Delete :number photos', + 'delete_bulk_photos_message' => 'Are you sure you want to delete the selected photos? This action cannot be undone!', + 'delete_bulk_photos_title' => 'Delete selected photos', 'delete_photo_message' => 'Are you sure you want to delete this photo? This action cannot be undone!', 'delete_photo_successful_message' => 'The photo ":name" was deleted successfully.', 'delete_photo_title' => 'Delete photo', @@ -90,6 +90,15 @@ return [ ], 'save_changes_heading' => 'Save changes', 'save_changes_intro' => 'If you have made any changes to the above fields, you\'ll need to hit the Save Changes button below.', + 'select_all_action' => 'Select all', + 'select_all_album_active' => 'Any action you select in the list below will apply to all photos in this album.', + 'select_all_choice' => [ + 'all_action' => 'All in this album', + 'message' => 'Do you want to select all the photos in the album, or just those that are visible on this page?', + 'title' => 'Select all in album?', + 'visible_action' => 'Only those visible' + ], + 'select_none_action' => 'Clear selection', 'settings_image_protection' => 'Image Protection', 'settings_recaptcha' => 'reCAPTCHA settings', 'settings_save_action' => 'Update Settings', diff --git a/resources/views/themes/base/admin/show_album.blade.php b/resources/views/themes/base/admin/show_album.blade.php index 7785563..1a650fc 100644 --- a/resources/views/themes/base/admin/show_album.blade.php +++ b/resources/views/themes/base/admin/show_album.blade.php @@ -48,6 +48,16 @@ @endforeach
+

+ + +

+ + +
+

@lang('admin.select_all_album_active')

+
+

{!! Form::label('bulk-action', trans('forms.bulk_edit_photos_label'), ['class' => 'control-label']) !!}

{!! Form::hidden('new-album-id', $album->id) !!} {!! Form::select('bulk-action', $bulk_actions, null, ['placeholder' => trans('forms.bulk_edit_photos_placeholder'), 'id' => 'bulk-action-apply', 'data-bind' => 'value: bulkModifyMethod, enable: photoIDs().length > 0']) !!} @@ -247,6 +257,10 @@ language.delete_bulk_confirm_title = '{!! addslashes(trans('admin.delete_bulk_photos_title')) !!}'; language.delete_confirm_message = '{!! addslashes(trans('admin.delete_photo_message')) !!}'; language.delete_confirm_title = '{!! addslashes(trans('admin.delete_photo_title')) !!}'; + language.select_all_choice_all_action = '{!! addslashes(trans('admin.select_all_choice.all_action')) !!}'; + language.select_all_choice_message = '{!! addslashes(trans('admin.select_all_choice.message')) !!}'; + language.select_all_choice_title = '{!! addslashes(trans('admin.select_all_choice.title')) !!}'; + language.select_all_choice_visible_action = '{!! addslashes(trans('admin.select_all_choice.visible_action')) !!}'; language.image_failed = '{!! addslashes(trans('admin.upload_file_status_failed')) !!}'; language.image_uploaded = '{!! addslashes(trans('admin.upload_file_status_success')) !!}'; language.upload_status = '{!! addslashes(trans('admin.upload_file_status_progress')) !!}'; @@ -262,6 +276,10 @@ var viewModel = new UploadPhotosViewModel('{{ $album->id }}', '{{ $queue_token }}', language, urls); var editViewModel = new EditPhotosViewModel('{{ $album->id }}', language, urls); + @foreach ($photos as $photo) + editViewModel.photoIDsAvailable.push('{{ $photo->id }}'); + @endforeach + // Populate the list of albums in the view model @foreach ($albums as $album) editViewModel.albums.push({