From 6280766d70ac7d74828fa30c308b9dc8f2d1c190 Mon Sep 17 00:00:00 2001 From: Andy Heathershaw Date: Sun, 10 Sep 2017 09:07:56 +0100 Subject: [PATCH] #29: Labels can now be added and managed through the admin panel --- .../Controllers/Admin/DefaultController.php | 3 + .../Controllers/Admin/LabelController.php | 92 +++++++++++++++++++ app/Http/Requests/StoreLabelRequest.php | 28 ++++++ app/Label.php | 22 +++++ app/Providers/AuthServiceProvider.php | 4 + config/app.php | 2 +- ...09_10_080152_create_photo_labels_table.php | 47 ++++++++++ database/seeds/PermissionsSeeder.php | 8 ++ resources/lang/en/admin.php | 11 +++ resources/lang/en/navigation.php | 2 + resources/lang/en/permissions.php | 1 + .../themes/base/admin/delete_label.blade.php | 34 +++++++ .../themes/base/admin/edit_group.blade.php | 4 + .../themes/base/admin/list_labels.blade.php | 73 +++++++++++++++ .../partials/admin_manage_widget.blade.php | 4 + .../partials/admin_stats_widget.blade.php | 5 +- routes/web.php | 4 + 17 files changed, 341 insertions(+), 3 deletions(-) create mode 100644 app/Http/Controllers/Admin/LabelController.php create mode 100644 app/Http/Requests/StoreLabelRequest.php create mode 100644 app/Label.php create mode 100644 database/migrations/2017_09_10_080152_create_photo_labels_table.php create mode 100644 resources/views/themes/base/admin/delete_label.blade.php create mode 100644 resources/views/themes/base/admin/list_labels.blade.php diff --git a/app/Http/Controllers/Admin/DefaultController.php b/app/Http/Controllers/Admin/DefaultController.php index 49e39ed..16fdd9c 100644 --- a/app/Http/Controllers/Admin/DefaultController.php +++ b/app/Http/Controllers/Admin/DefaultController.php @@ -11,6 +11,7 @@ use App\Helpers\ConfigHelper; use App\Helpers\DbHelper; use App\Http\Controllers\Controller; use App\Http\Requests\SaveSettingsRequest; +use App\Label; use App\Mail\TestMailConfig; use App\Photo; use App\User; @@ -36,12 +37,14 @@ class DefaultController extends Controller $albumCount = DbHelper::getAlbumsForCurrentUser()->count(); $photoCount = Photo::all()->count(); $groupCount = Group::all()->count(); + $labelCount = Label::all()->count(); $userCount = User::where('is_activated', true)->count(); return Theme::render('admin.index', [ 'album_count' => $albumCount, 'app_version' => config('app.version'), 'group_count' => $groupCount, + 'label_count' => $labelCount, 'memory_limit' => ini_get('memory_limit'), 'photo_count' => $photoCount, 'php_version' => phpversion(), diff --git a/app/Http/Controllers/Admin/LabelController.php b/app/Http/Controllers/Admin/LabelController.php new file mode 100644 index 0000000..99e2fdf --- /dev/null +++ b/app/Http/Controllers/Admin/LabelController.php @@ -0,0 +1,92 @@ +middleware(['auth', 'max_post_size_exceeded']); + View::share('is_admin', true); + } + + public function delete($id) + { + $this->authorizeAccessToAdminPanel(); + + $label = $this->loadLabel($id); + return Theme::render('admin.delete_label', ['label' => $label]); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy(Request $request, $id) + { + $this->authorizeAccessToAdminPanel('admin:manage-labels'); + + $label = $this->loadLabel($id); + $label->delete(); + + $request->session()->flash('success', trans('admin.delete_label_success_message', ['name' => $label->name])); + + return redirect(route('labels.index')); + } + + /** + * Display a listing of the resource. + * + * @return \Illuminate\Http\Response + */ + public function index() + { + $labels = Label::withCount('photos')->get(); + return Theme::render('admin.list_labels', [ + 'labels' => $labels + ]); + } + + /** + * Store a newly created resource in storage. + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(StoreLabelRequest $request) + { + $this->authorizeAccessToAdminPanel('admin:manage-labels'); + + $label = new Label(); + $label->fill($request->only(['name'])); + $label->save(); + + return redirect(route('labels.index')); + } + + /** + * @param $id + * @return Album + */ + private function loadLabel($id) + { + $label = Label::where('id', intval($id))->first(); + if (is_null($label)) + { + App::abort(404); + return null; + } + + return $label; + } +} \ No newline at end of file diff --git a/app/Http/Requests/StoreLabelRequest.php b/app/Http/Requests/StoreLabelRequest.php new file mode 100644 index 0000000..1284abc --- /dev/null +++ b/app/Http/Requests/StoreLabelRequest.php @@ -0,0 +1,28 @@ + 'required:max:255|unique:labels,name']; + } +} \ No newline at end of file diff --git a/app/Label.php b/app/Label.php new file mode 100644 index 0000000..9a1d6a4 --- /dev/null +++ b/app/Label.php @@ -0,0 +1,22 @@ +belongsToMany(Photo::class, 'photo_labels'); + } +} \ No newline at end of file diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 007916c..fc50d91 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -56,6 +56,10 @@ class AuthServiceProvider extends ServiceProvider { return $this->userHasAdminPermission($user, 'manage-groups'); }); + Gate::define('admin:manage-labels', function ($user) + { + return $this->userHasAdminPermission($user, 'manage-labels'); + }); Gate::define('admin:manage-storage', function ($user) { return $this->userHasAdminPermission($user, 'manage-storage'); diff --git a/config/app.php b/config/app.php index 88d4ce7..d31c8ce 100644 --- a/config/app.php +++ b/config/app.php @@ -2,7 +2,7 @@ return [ // Version number of Blue Twilight - 'version' => '2.0.1', + 'version' => '2.1.0-beta.1', /* |-------------------------------------------------------------------------- diff --git a/database/migrations/2017_09_10_080152_create_photo_labels_table.php b/database/migrations/2017_09_10_080152_create_photo_labels_table.php new file mode 100644 index 0000000..1225264 --- /dev/null +++ b/database/migrations/2017_09_10_080152_create_photo_labels_table.php @@ -0,0 +1,47 @@ +increments('id'); + $table->string('name'); + $table->timestamps(); + }); + + Schema::create('photo_labels', function ($table) { + $table->unsignedBigInteger('photo_id'); + $table->unsignedInteger('label_id'); + + $table->foreign('photo_id') + ->references('id')->on('photos') + ->onDelete('cascade'); + $table->foreign('label_id') + ->references('id')->on('labels') + ->onDelete('cascade'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('photo_labels'); + Schema::dropIfExists('labels'); + } +} diff --git a/database/seeds/PermissionsSeeder.php b/database/seeds/PermissionsSeeder.php index c1f6814..23a7df0 100644 --- a/database/seeds/PermissionsSeeder.php +++ b/database/seeds/PermissionsSeeder.php @@ -64,6 +64,14 @@ class PermissionsSeeder extends Seeder 'is_default' => false, 'sort_order' => 0 ]); + + // admin:manage-labels = controls if photo labels can be managed + DatabaseSeeder::createOrUpdate('permissions', [ + 'section' => 'admin', + 'description' => 'manage-labels', + 'is_default' => false, + 'sort_order' => 0 + ]); } private function seedAlbumPermissions() diff --git a/resources/lang/en/admin.php b/resources/lang/en/admin.php index 2c67ba7..3d39cff 100644 --- a/resources/lang/en/admin.php +++ b/resources/lang/en/admin.php @@ -46,6 +46,8 @@ return [ 'create_album_no_storage' => 'There are currently no storage locations set up. Please create a location to store your photos before creating an album.', 'create_group' => 'Create a group', 'create_group_intro' => 'Complete the form below to create a group in which to organise your users.', + 'create_label_intro' => 'Use the form below to add a new label that can be added to your photos.', + 'create_label_title' => 'Create a label', 'create_redirect_heading' => 'Add a Redirect', 'create_redirect_success_message' => 'The redirect was added successfully.', 'create_redirect_text' => 'Enter the source address you would like to redirect and click the Create button to add a new redirect to this album.', @@ -66,6 +68,9 @@ return [ 'delete_group' => 'Delete group: :name', 'delete_group_confirm' => 'Are you sure you want to permanently remove the ":name" group? Users who are members of this group may lose permissions.', 'delete_group_warning' => 'This is a permanent action that cannot be reversed!', + 'delete_label' => 'Delete label: :name', + 'delete_label_confirm' => 'Are you sure you want to permanently remove the ":name" label?', + 'delete_label_success_message' => 'The :name label was deleted successfully.', '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', @@ -103,11 +108,14 @@ return [ 'group_users_tab' => 'Users', 'inactive_storage_legend' => 'Inactive storage location that cannot be used for new albums.', 'is_uploading' => 'Uploading in progress...', + 'labels_intro' => 'Your labels are displayed below. The number in brackets indicates the number of photos linked to that label. Click a label to delete it.', 'legend' => 'Legend/Key', 'list_albums_intro' => 'Albums contain collections of individual photographs in the same way as a physical photo album or memory book.', 'list_albums_title' => 'Albums', 'list_groups_intro' => 'Organise your users into categories or types by using groups. You can assign permissions on albums to groups of users to make administration and management easier.', 'list_groups_title' => 'Groups', + 'list_labels_intro' => 'Organise your photos differently using labels. Assign one or more labels to your photos and your visitors can view all photos with a specific tag in a single view.', + 'list_labels_title' => 'Labels', 'list_storages_intro' => 'Storage locations specify the physical location where your photograph files are held. This may be on your local server\'s filesystem, or on a cloud storage provider such as Rackspace or Amazon S3.', 'list_storages_title' => 'Storage Locations', 'list_users_intro' => 'User accounts allow people to login to your gallery to manage your albums. If you have disabled self-registration, you can create user accounts here to allow people to login.', @@ -121,6 +129,8 @@ return [ 'no_albums_title' => 'No Photo Albums', 'no_groups_text' => 'You have no groups yet. Click the button below to create one.', 'no_groups_title' => 'No Groups', + 'no_labels_text' => 'You have no labels yet. Use the form below to create one.', + 'no_labels_title' => 'No Labels', 'no_photo_selected_message' => 'Please select at least one photo.', 'no_storages_text' => 'You need a storage location to store your uploaded photographs.', 'no_storages_text2' => 'This can be on your server\'s local filesystem or a cloud location such as Amazon S3 or Rackspace.', @@ -182,6 +192,7 @@ return [ 'stats_widget' => [ 'albums' => 'album|albums', 'groups' => 'group|groups', + 'labels' => 'label|labels', 'panel_header' => 'Statistics', 'photos' => 'photo|photos', 'users' => 'user|users', diff --git a/resources/lang/en/navigation.php b/resources/lang/en/navigation.php index a3af3ed..76020c1 100644 --- a/resources/lang/en/navigation.php +++ b/resources/lang/en/navigation.php @@ -9,6 +9,7 @@ return [ 'create_user' => 'Create user', 'delete_album' => 'Delete album', 'delete_group' => 'Delete group', + 'delete_label' => 'Delete label', 'delete_storage' => 'Delete storage location', 'delete_user' => 'Delete user', 'edit_album' => 'Edit album', @@ -16,6 +17,7 @@ return [ 'edit_storage' => 'Edit storage location', 'edit_user' => 'Edit user', 'groups' => 'Groups', + 'labels' => 'Labels', 'home' => 'Gallery', 'settings' => 'Settings', 'storage' => 'Storage', diff --git a/resources/lang/en/permissions.php b/resources/lang/en/permissions.php index 7413fb2..1844f8a 100644 --- a/resources/lang/en/permissions.php +++ b/resources/lang/en/permissions.php @@ -5,6 +5,7 @@ return [ 'configure' => 'Configure the application', 'manage-albums' => 'Manage photo albums', 'manage-groups' => 'Manage user groups', + 'manage-labels' => 'Manage photo labels', 'manage-storage' => 'Manage storage locations', 'manage-users' => 'Manage users' ], diff --git a/resources/views/themes/base/admin/delete_label.blade.php b/resources/views/themes/base/admin/delete_label.blade.php new file mode 100644 index 0000000..bc2f768 --- /dev/null +++ b/resources/views/themes/base/admin/delete_label.blade.php @@ -0,0 +1,34 @@ +@extends('themes.base.layout') +@section('title', trans('admin.delete_label', ['name' => $label->name])) + +@section('breadcrumb') + + + + +@endsection + +@section('content') +
+
+
+
+
@yield('title')
+
+

@lang('admin.delete_label_confirm', ['name' => $label->name])

+

@lang('admin.delete_group_warning')

+ +
+
+ {{ csrf_field() }} + {{ method_field('DELETE') }} + @lang('forms.cancel_action') + +
+
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/themes/base/admin/edit_group.blade.php b/resources/views/themes/base/admin/edit_group.blade.php index 0277d17..4674147 100644 --- a/resources/views/themes/base/admin/edit_group.blade.php +++ b/resources/views/themes/base/admin/edit_group.blade.php @@ -83,6 +83,10 @@ 'permission' => Theme::getPermission($all_permissions, 'admin', 'manage-albums') ]) + @include(Theme::viewName('partials.permission_checkbox'), [ + 'permission' => Theme::getPermission($all_permissions, 'admin', 'manage-labels') + ]) + @include(Theme::viewName('partials.permission_checkbox'), [ 'permission' => Theme::getPermission($all_permissions, 'admin', 'manage-users') ]) diff --git a/resources/views/themes/base/admin/list_labels.blade.php b/resources/views/themes/base/admin/list_labels.blade.php new file mode 100644 index 0000000..c081472 --- /dev/null +++ b/resources/views/themes/base/admin/list_labels.blade.php @@ -0,0 +1,73 @@ +@extends('themes.base.layout') +@section('title', trans('admin.list_labels_title')) + +@section('breadcrumb') + + + +@endsection + +@section('content') +
+
+
+

@yield('title')

+
+ @lang('admin.list_labels_intro') +
+ + @if (count($labels) == 0) +
+

@lang('admin.no_labels_title')

+

@lang('admin.no_labels_text')

+
+ @else +

@lang('admin.labels_intro')

+ + @endif + +
+

@lang('admin.create_label_title')

+

@lang('admin.create_label_intro')

+ +
+ {{ csrf_field() }} +
+ +
+ + + @if ($errors->has('name')) +
+ {{ $errors->first('name') }} +
+ @endif +
+ +
+ +
+
+
+
+
+
+@endsection + +@push('scripts') + +@endpush \ No newline at end of file diff --git a/resources/views/themes/base/partials/admin_manage_widget.blade.php b/resources/views/themes/base/partials/admin_manage_widget.blade.php index fc92260..082dcf2 100644 --- a/resources/views/themes/base/partials/admin_manage_widget.blade.php +++ b/resources/views/themes/base/partials/admin_manage_widget.blade.php @@ -2,6 +2,7 @@ $canConfigure = Auth::user()->can('admin:configure'); $canManageAlbums = Auth::user()->can('admin:manage-albums'); $canManageGroups = Auth::user()->can('admin:manage-groups'); + $canManageLabels = Auth::user()->can('admin:manage-labels'); $canManageStorage = Auth::user()->can('admin:manage-storage'); $canManageUsers = Auth::user()->can('admin:manage-users'); @endphp @@ -13,6 +14,9 @@ @if ($canManageAlbums) @lang('navigation.breadcrumb.albums') @endif + @if ($canManageLabels) + @lang('navigation.breadcrumb.labels') + @endif @if ($canManageUsers) @lang('navigation.breadcrumb.users') @endif diff --git a/resources/views/themes/base/partials/admin_stats_widget.blade.php b/resources/views/themes/base/partials/admin_stats_widget.blade.php index 744b273..3f45961 100644 --- a/resources/views/themes/base/partials/admin_stats_widget.blade.php +++ b/resources/views/themes/base/partials/admin_stats_widget.blade.php @@ -1,8 +1,9 @@
@lang('admin.stats_widget.panel_header')
- {{ $album_count }} {{ trans_choice('admin.stats_widget.albums', $album_count) }}
- {{ $photo_count }} {{ trans_choice('admin.stats_widget.photos', $photo_count) }} + {{ $album_count }} {{ trans_choice('admin.stats_widget.albums', $album_count) }} · + {{ $photo_count }} {{ trans_choice('admin.stats_widget.photos', $photo_count) }}
+ {{ $label_count }} {{ trans_choice('admin.stats_widget.labels', $label_count) }} @can('admin:access')
{{ $user_count }} {{ trans_choice('admin.stats_widget.users', $user_count) }} / {{ $group_count }} {{ trans_choice('admin.stats_widget.groups', $group_count) }} diff --git a/routes/web.php b/routes/web.php index 851f156..129a62c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -39,6 +39,10 @@ Route::group(['prefix' => 'admin'], function () { Route::put('photos/update-bulk/{albumId}', 'Admin\PhotoController@updateBulk')->name('photos.updateBulk'); Route::resource('photos', 'Admin\PhotoController'); + // Label management + Route::get('labels/{id}/delete', 'Admin\LabelController@delete')->name('labels.delete'); + Route::resource('labels', 'Admin\LabelController'); + // Storage management Route::get('storage/{id}/delete', 'Admin\StorageController@delete')->name('storage.delete'); Route::resource('storage', 'Admin\StorageController');