Storage locations can now be edited. Added the rotate photo left/right to the max post size exclusion list
This commit is contained in:
parent
48b43c3dd2
commit
6635d20ead
@ -3,7 +3,7 @@
|
|||||||
<component name="WebServers">
|
<component name="WebServers">
|
||||||
<option name="servers">
|
<option name="servers">
|
||||||
<webServer id="b14a34b0-0127-4886-964a-7be75a2281ac" name="Development" url="http://blue-twilight-dev.andys.eu">
|
<webServer id="b14a34b0-0127-4886-964a-7be75a2281ac" name="Development" url="http://blue-twilight-dev.andys.eu">
|
||||||
<fileTransfer host="miami.andys.eu" port="22" rootFolder="/srv/www/blue-twilight-dev" accessType="SFTP">
|
<fileTransfer host="orlando.andys.eu" port="22" rootFolder="/srv/www/blue-twilight-dev" accessType="SFTP">
|
||||||
<advancedOptions>
|
<advancedOptions>
|
||||||
<advancedOptions dataProtectionLevel="Private" />
|
<advancedOptions dataProtectionLevel="Private" />
|
||||||
</advancedOptions>
|
</advancedOptions>
|
||||||
|
@ -40,8 +40,14 @@ class Album extends Model
|
|||||||
*/
|
*/
|
||||||
public function getAlbumSource()
|
public function getAlbumSource()
|
||||||
{
|
{
|
||||||
// TODO allow albums to specify different storage locations - e.g. Amazon S3, SFTP/FTP, OpenStack
|
$fullClassName = sprintf('App\AlbumSources\%s', $this->storage->source);
|
||||||
return new LocalFilesystemSource($this, dirname(__DIR__) . '/storage/app/albums');
|
|
||||||
|
/** @var IAlbumSource $source */
|
||||||
|
$source = new $fullClassName;
|
||||||
|
$source->setAlbum($this);
|
||||||
|
$source->setConfiguration($this->storage);
|
||||||
|
|
||||||
|
return $source;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function photos()
|
public function photos()
|
||||||
@ -49,6 +55,11 @@ class Album extends Model
|
|||||||
return $this->hasMany(Photo::class);
|
return $this->hasMany(Photo::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function storage()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Storage::class);
|
||||||
|
}
|
||||||
|
|
||||||
public function thumbnailUrl($thumbnailName)
|
public function thumbnailUrl($thumbnailName)
|
||||||
{
|
{
|
||||||
$photo = $this->photos()
|
$photo = $this->photos()
|
||||||
|
@ -4,6 +4,7 @@ namespace App\AlbumSources;
|
|||||||
|
|
||||||
use App\Album;
|
use App\Album;
|
||||||
use App\Photo;
|
use App\Photo;
|
||||||
|
use App\Storage;
|
||||||
use Symfony\Component\HttpFoundation\File\File;
|
use Symfony\Component\HttpFoundation\File\File;
|
||||||
|
|
||||||
interface IAlbumSource
|
interface IAlbumSource
|
||||||
@ -59,4 +60,16 @@ interface IAlbumSource
|
|||||||
* @return File
|
* @return File
|
||||||
*/
|
*/
|
||||||
function saveUploadedPhoto(File $uploadedFile);
|
function saveUploadedPhoto(File $uploadedFile);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Album $album
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function setAlbum(Album $album);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Storage $configuration
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
function setConfiguration(Storage $configuration);
|
||||||
}
|
}
|
@ -9,6 +9,7 @@ use Illuminate\Http\Request;
|
|||||||
|
|
||||||
use App\Http\Requests;
|
use App\Http\Requests;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
|
use Illuminate\Support\Facades\App;
|
||||||
|
|
||||||
class StorageController extends Controller
|
class StorageController extends Controller
|
||||||
{
|
{
|
||||||
@ -63,24 +64,12 @@ class StorageController extends Controller
|
|||||||
|
|
||||||
$storage = new Storage();
|
$storage = new Storage();
|
||||||
$storage->fill($request->only(['name', 'source', 'location']));
|
$storage->fill($request->only(['name', 'source', 'location']));
|
||||||
|
|
||||||
$storage->is_default = (strtolower($request->get('is_default')) == 'on');
|
$storage->is_default = (strtolower($request->get('is_default')) == 'on');
|
||||||
$storage->save();
|
$storage->save();
|
||||||
|
|
||||||
if ($storage->is_default)
|
if ($storage->is_default)
|
||||||
{
|
{
|
||||||
// If this storage is flagged as default, remove all others
|
$this->unsetIsDefaultFromOthers($storage);
|
||||||
foreach (Storage::all() as $otherStorage)
|
|
||||||
{
|
|
||||||
if ($otherStorage->id == $storage->id)
|
|
||||||
{
|
|
||||||
// Ignore the one just created
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
$otherStorage->is_default = false;
|
|
||||||
$otherStorage->save();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return redirect(route('storage.index'));
|
return redirect(route('storage.index'));
|
||||||
@ -105,7 +94,15 @@ class StorageController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function edit($id)
|
public function edit($id)
|
||||||
{
|
{
|
||||||
//
|
$this->authorize('admin-access');
|
||||||
|
|
||||||
|
$storage = Storage::where('id', intval($id))->first();
|
||||||
|
if (is_null($storage))
|
||||||
|
{
|
||||||
|
App::abort(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Theme::render('admin.edit_storage', ['storage' => $storage]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -115,9 +112,26 @@ class StorageController extends Controller
|
|||||||
* @param int $id
|
* @param int $id
|
||||||
* @return \Illuminate\Http\Response
|
* @return \Illuminate\Http\Response
|
||||||
*/
|
*/
|
||||||
public function update(Request $request, $id)
|
public function update(Requests\StoreStorageRequest $request, $id)
|
||||||
{
|
{
|
||||||
//
|
$this->authorize('admin-access');
|
||||||
|
|
||||||
|
$storage = Storage::where('id', intval($id))->first();
|
||||||
|
if (is_null($storage))
|
||||||
|
{
|
||||||
|
App::abort(404);
|
||||||
|
}
|
||||||
|
|
||||||
|
$storage->fill($request->only(['name']));
|
||||||
|
$storage->is_default = (strtolower($request->get('is_default')) == 'on');
|
||||||
|
$storage->save();
|
||||||
|
|
||||||
|
if ($storage->is_default)
|
||||||
|
{
|
||||||
|
$this->unsetIsDefaultFromOthers($storage);
|
||||||
|
}
|
||||||
|
|
||||||
|
return redirect(route('storage.index'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -130,4 +144,20 @@ class StorageController extends Controller
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function unsetIsDefaultFromOthers(Storage $storage)
|
||||||
|
{
|
||||||
|
// If this storage is flagged as default, remove all others
|
||||||
|
foreach (Storage::all() as $otherStorage)
|
||||||
|
{
|
||||||
|
if ($otherStorage->id == $storage->id)
|
||||||
|
{
|
||||||
|
// Ignore the one just created
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$otherStorage->is_default = false;
|
||||||
|
$otherStorage->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,8 @@ class CheckMaxPostSizeExceeded
|
|||||||
|
|
||||||
protected $exclude = [
|
protected $exclude = [
|
||||||
'/admin/photos/analyse/*',
|
'/admin/photos/analyse/*',
|
||||||
'/admin/photos/regenerate-thumbnails/*'
|
'/admin/photos/regenerate-thumbnails/*',
|
||||||
|
'/admin/photos/rotate/*'
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Http\Requests;
|
namespace App\Http\Requests;
|
||||||
|
|
||||||
|
use App\Storage;
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
|
|
||||||
class StoreStorageRequest extends FormRequest
|
class StoreStorageRequest extends FormRequest
|
||||||
@ -23,9 +24,22 @@ class StoreStorageRequest extends FormRequest
|
|||||||
*/
|
*/
|
||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
return [
|
switch ($this->method())
|
||||||
'name' => 'required|unique:storages|max:255',
|
{
|
||||||
'source' => 'required|max:255',
|
case 'POST':
|
||||||
];
|
return [
|
||||||
|
'name' => 'required|unique:storages|max:255',
|
||||||
|
'source' => 'required|max:255',
|
||||||
|
];
|
||||||
|
|
||||||
|
case 'PATCH':
|
||||||
|
case 'PUT':
|
||||||
|
$storageId = intval($this->segment(3));
|
||||||
|
|
||||||
|
return [
|
||||||
|
'name' => 'required|max:255|unique:storages,name,' . $storageId
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -22,6 +22,8 @@ return [
|
|||||||
'edit_album' => 'Edit photo album: :album_name',
|
'edit_album' => 'Edit photo album: :album_name',
|
||||||
'edit_album_intro' => 'Photo albums contain individual photographs together in the same way as a physical photo album or memory book.',
|
'edit_album_intro' => 'Photo albums contain individual photographs together in the same way as a physical photo album or memory book.',
|
||||||
'edit_album_intro2' => 'Complete the form below to edit the properties of the album: :album_name.',
|
'edit_album_intro2' => 'Complete the form below to edit the properties of the album: :album_name.',
|
||||||
|
'edit_storage' => 'Edit storage location: :storage_name',
|
||||||
|
'edit_storage_intro' => 'Use the form below to update the details of the :storage_name storage location.',
|
||||||
'is_uploading' => 'Uploading in progress...',
|
'is_uploading' => 'Uploading in progress...',
|
||||||
'manage_widget' => [
|
'manage_widget' => [
|
||||||
'panel_header' => 'Manage'
|
'panel_header' => 'Manage'
|
||||||
|
63
resources/views/themes/base/admin/edit_storage.blade.php
Normal file
63
resources/views/themes/base/admin/edit_storage.blade.php
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
@extends('themes.base.layout')
|
||||||
|
@section('title', trans('admin.edit_storage', ['storage_name' => $storage->name]))
|
||||||
|
|
||||||
|
@section('breadcrumb')
|
||||||
|
<div class="breadcrumb">
|
||||||
|
<div class="container">
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li><a href="{{ route('home') }}">@lang('navigation.breadcrumb.home')</a></li>
|
||||||
|
<li><a href="{{ route('admin') }}">@lang('navigation.breadcrumb.admin')</a></li>
|
||||||
|
<li><a href="{{ route('storage.index') }}">@lang('navigation.breadcrumb.storage')</a></li>
|
||||||
|
<li class="active">@lang('navigation.breadcrumb.create_storage')</li>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xs-12">
|
||||||
|
<h1>@yield('title')</h1>
|
||||||
|
<p>@lang('admin.edit_storage_intro', ['storage_name' => $storage->name])</p>
|
||||||
|
<hr/>
|
||||||
|
|
||||||
|
@if (count($errors) > 0)
|
||||||
|
<div class="alert alert-danger">
|
||||||
|
<ul>
|
||||||
|
@foreach ($errors->all() as $formError)
|
||||||
|
<li>{{ $formError }}</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
{!! Form::model($storage, ['route' => ['storage.update', $storage->id], 'method' => 'PUT']) !!}
|
||||||
|
<div class="form-group">
|
||||||
|
{!! Form::label('name', trans('forms.name_label'), ['class' => 'control-label']) !!}
|
||||||
|
{!! Form::text('name', old('name'), ['class' => 'form-control']) !!}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="checkbox">
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" name="is_default"@if ($storage->is_default) checked="checked"@endif>
|
||||||
|
<strong>@lang('forms.default_storage_label')</strong>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-actions">
|
||||||
|
<a href="{{ route('storage.index') }}" class="btn btn-default">@lang('forms.cancel_action')</a>
|
||||||
|
{!! Form::submit(trans('forms.save_action'), ['class' => 'btn btn-success']) !!}
|
||||||
|
</div>
|
||||||
|
{!! Form::close() !!}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script type="text/javascript">
|
||||||
|
var viewModel = new StorageLocationsViewModel();
|
||||||
|
ko.applyBindings(viewModel);
|
||||||
|
</script>
|
||||||
|
@endpush
|
Loading…
Reference in New Issue
Block a user