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') +
@lang('admin.delete_label_confirm', ['name' => $label->name])
+@lang('admin.delete_group_warning')
+ +@lang('admin.no_labels_text')
+@lang('admin.labels_intro')
+ + @endif + +@lang('admin.create_label_intro')
+ + +