229 lines
11 KiB
PHP
229 lines
11 KiB
PHP
@extends(Theme::viewName('layout'))
|
|
@section('title', $album->name)
|
|
|
|
@section('breadcrumb')
|
|
<li class="breadcrumb-item"><a href="{{ route('home') }}"><i class="fa fa-fw fa-home"></i></a></li>
|
|
<li class="breadcrumb-item"><a href="{{ route('admin') }}">@lang('navigation.breadcrumb.admin')</a></li>
|
|
<li class="breadcrumb-item"><a href="{{ route('albums.index') }}">@lang('navigation.breadcrumb.albums')</a></li>
|
|
@foreach ($album->albumParentTree() as $parentAlbum)
|
|
@if ($parentAlbum->id == $album->id)
|
|
<li class="breadcrumb-item active">{{ $album->name }}</li>
|
|
@else
|
|
<li class="breadcrumb-item"><a href="{{ route('albums.show', ['album' => $parentAlbum->id]) }}">{{ $parentAlbum->name }}</a></li>
|
|
@endif
|
|
@endforeach
|
|
@endsection
|
|
|
|
@section('content')
|
|
<div class="container">
|
|
<div class="row">
|
|
<div class="col">
|
|
<a class="float-right btn btn-secondary" href="{{ $album->url() }}"><i class="fa fa-fw fa-eye"></i> @lang('admin.open_album')</a>
|
|
|
|
<h1 class="page-title">{{ $album->name }}</h1>
|
|
<p>{!! nl2br(e($album->description)) !!}</p>
|
|
|
|
<div class="mt-4">
|
|
<ul class="nav nav-tabs" role="tablist">
|
|
@include(Theme::viewName('partials.tab'), ['tab_name' => 'photos', 'tab_icon' => 'images', 'tab_text' => trans('admin.album_photos_tab')])
|
|
@can('upload-photos', $album)
|
|
@include(Theme::viewName('partials.tab'), ['tab_name' => 'upload', 'tab_icon' => 'upload', 'tab_text' => trans('admin.album_upload_tab')])
|
|
@endcan
|
|
@include(Theme::viewName('partials.tab'), ['tab_name' => 'cameras', 'tab_icon' => 'camera', 'tab_text' => trans('admin.album_cameras_tab')])
|
|
@can('change-permissions', $album)
|
|
@include(Theme::viewName('partials.tab'), ['tab_name' => 'permissions', 'tab_icon' => 'lock', 'tab_text' => trans('admin.album_security_tab')])
|
|
@endcan
|
|
@include(Theme::viewName('partials.tab'), ['tab_name' => 'redirects', 'tab_icon' => 'retweet', 'tab_text' => trans('admin.album_redirects_tab')])
|
|
@include(Theme::viewName('partials.tab'), ['tab_name' => 'settings', 'tab_icon' => 'cog', 'tab_text' => trans('admin.album_settings_tab')])
|
|
</ul>
|
|
|
|
<div class="tab-content">
|
|
{{-- Photos --}}
|
|
@include(Theme::viewName('partials.album_photos_tab'))
|
|
@can('upload-photos', $album)
|
|
{{-- Upload --}}
|
|
@include(Theme::viewName('partials.album_upload_tab'))
|
|
@endcan
|
|
{{-- Cameras --}}
|
|
@include(Theme::viewName('partials.album_cameras_tab'))
|
|
@can('change-permissions', $album)
|
|
{{-- Permissions --}}
|
|
@include(Theme::viewName('partials.album_permissions_tab'))
|
|
@endcan
|
|
{{-- Redirects --}}
|
|
@include(Theme::viewName('partials.album_redirects_tab'))
|
|
{{-- Settings --}}
|
|
@include(Theme::viewName('partials.album_settings_tab'))
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Form used for the replace image popup -->
|
|
<form id="replace-image-form" method="post" action="{{ route('photos.store') }}" enctype="multipart/form-data" style="display: none;">
|
|
{{ csrf_field() }}
|
|
<input type="hidden" name="album_id" value="{{ $album->id }}"/>
|
|
<input type="hidden" name="photo_id" value=""/>
|
|
<input type="hidden" name="queue_token" value="{{ $queue_token }}"/>
|
|
<div class="form-group">
|
|
<input type="file" class="form-control" name="photo[]"/>
|
|
</div>
|
|
</form>
|
|
@endsection
|
|
|
|
@push('scripts')
|
|
<script type="text/javascript">
|
|
var language = [];
|
|
language.action_cancel = '{!! addslashes(trans('forms.cancel_action')) !!}';
|
|
language.action_continue = '{!! addslashes(trans('forms.continue_action')) !!}';
|
|
language.action_delete = '{!! addslashes(trans('forms.delete_action')) !!}';
|
|
language.change_album_message = '{!! addslashes(trans('admin.change_album_message')) !!}';
|
|
language.change_album_title = '{!! addslashes(trans('admin.change_album_title')) !!}';
|
|
language.delete_bulk_confirm_message = '{!! addslashes(trans('admin.delete_bulk_photos_message')) !!}';
|
|
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.not_an_image_file = '{!! addslashes(trans('admin.upload_file_not_image_messages')) !!}';
|
|
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.no_file_selected = '{!! addslashes(trans('admin.upload_no_file')) !!}';
|
|
language.replace_image_message = '{!! addslashes(trans('admin.replace_image_message')) !!}';
|
|
language.replace_image_title = '{!! addslashes(trans('admin.replace_image_title')) !!}';
|
|
language.upload_status = '{!! addslashes(trans('admin.upload_file_status_progress')) !!}';
|
|
|
|
var urls = [];
|
|
urls.analyse = '{{ route('albums.analyse', ['album' => $album->id, 'queue_token' => $queue_token]) }}';
|
|
urls.delete_photo = '{{ route('photos.destroy', ['photo' => 0]) }}';
|
|
urls.flip_photo = '{{ route('photos.flip', ['photo' => 0, 'horizontal' => -1, 'vertical' => -2]) }}';
|
|
urls.move_photo = '{{ route('photos.move', ['photo' => 0]) }}';
|
|
urls.regenerate_thumbnails = '{{ route('photos.regenerateThumbnails', ['photo' => 0]) }}';
|
|
urls.rotate_photo = '{{ route('photos.rotate', ['photo' => 0, 'angle' => 1]) }}';
|
|
|
|
var viewModel = new UploadPhotosViewModel('{{ $album->id }}', '{{ $queue_token }}', language, urls);
|
|
var editViewModel = new EditPhotosViewModel('{{ $album->id }}', language, urls);
|
|
|
|
@foreach ($photos as $photo)
|
|
editViewModel.data.photoIDsAvailable.push({{ $photo->id }});
|
|
@endforeach
|
|
|
|
// Populate the list of albums in the view model
|
|
@foreach ($g_albums as $album)
|
|
@if(Gate::check('edit', $album) && Gate::check('upload-photos', $album))
|
|
editViewModel.data.albums.push({
|
|
'id': '{{ $album->id }}',
|
|
'name': '{!! addslashes($album->name) !!}'
|
|
});
|
|
@endif
|
|
@endforeach
|
|
|
|
function renderLabelsFields()
|
|
{
|
|
$('.labels-field').selectize({
|
|
plugins: ['remove_button'],
|
|
delimiter: ',',
|
|
persist: false,
|
|
options: [
|
|
@foreach ($labels as $label)
|
|
{
|
|
value: '{{ $label->id }}',
|
|
text: '{{ $label->name}}'
|
|
},
|
|
@endforeach
|
|
],
|
|
create: function(input) {
|
|
return {
|
|
value: input,
|
|
text: input
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
$(document).ready(function() {
|
|
{{-- Photo uploads using AJAX --}}
|
|
if (window.FormData)
|
|
{
|
|
$('#bulk-upload-form').submit(function(event) {
|
|
// Set the in progress flag - no need to unset it as this is a synchronous process so the browser
|
|
// will reload the page in some way after completion
|
|
if (!viewModel.isBulkUploadInProgress())
|
|
{
|
|
viewModel.isBulkUploadInProgress(true);
|
|
|
|
// Wait a minute to give KnockoutJS chance to update the UI
|
|
window.setTimeout(function() {
|
|
$('#bulk-upload-form').submit();
|
|
}, 1000);
|
|
|
|
return false;
|
|
}
|
|
|
|
// Already set the flag, let the upload commence
|
|
return true;
|
|
});
|
|
}
|
|
|
|
{{-- Select All/None links on the permissions tab --}}
|
|
$('a.select-all').click(function() {
|
|
$('input:checkbox', $(this).closest('.card-body')).prop('checked', true);
|
|
return false;
|
|
});
|
|
$('a.select-none').click(function() {
|
|
$('input:checkbox', $(this).closest('.card-body')).prop('checked', false);
|
|
return false;
|
|
});
|
|
|
|
{{-- Type-ahead support for users textbox on the permissions tab --}}
|
|
var userDataSource = new Bloodhound({
|
|
datumTokenizer: Bloodhound.tokenizers.obj.whitespace('value'),
|
|
queryTokenizer: Bloodhound.tokenizers.whitespace,
|
|
remote: {
|
|
url: '{{ route('users.searchJson') }}?q=%QUERY',
|
|
wildcard: '%QUERY'
|
|
}
|
|
});
|
|
|
|
$('#user-search-textbox').typeahead(null, {
|
|
name: 'user-search',
|
|
display: 'name',
|
|
source: userDataSource
|
|
});
|
|
$('#user-search-textbox').bind('typeahead:select', function(ev, suggestion) {
|
|
$('#user-id-field').val(suggestion.id);
|
|
});
|
|
|
|
{{-- Selectize support for photo labelling --}}
|
|
$('a[data-toggle="tab"]').on('shown.bs.tab', function (e)
|
|
{
|
|
var target = $(e.target).attr('href');
|
|
if (target === '#photos-tab') {
|
|
renderLabelsFields();
|
|
}
|
|
});
|
|
window.setTimeout(renderLabelsFields, 500);
|
|
|
|
// Bind the view models to the relevant tab
|
|
var appEdit = new Vue(editViewModel);
|
|
|
|
var appUpload = new Vue(viewModel);
|
|
appUpload.$watch('isUploadInProgress', function(value) {
|
|
if (value)
|
|
{
|
|
$('#upload-progress-modal').modal('show');
|
|
}
|
|
else if (this.statusMessages.length === 0)
|
|
{
|
|
$('#upload-progress-modal').modal('hide');
|
|
}
|
|
});
|
|
appUpload.$watch('statusMessages', function($value) {
|
|
$('#upload-progress-modal').modal('handleUpdate');
|
|
})
|
|
});
|
|
</script>
|
|
@endpush |