From ef7efabb87863065392dab888860326c11a0cfa4 Mon Sep 17 00:00:00 2001 From: "Adrian P. Blunier" Date: Fri, 28 Oct 2016 14:20:03 +0200 Subject: [PATCH 01/14] image selector from uploads WIP --- .../ViewComposersServiceProvider.php | 1 + src/View/Composers/FormFieldComposer.php | 28 +++++++++++++++++++ views/atoms/forms/field.blade.php | 22 +++++++++++---- 3 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 src/View/Composers/FormFieldComposer.php diff --git a/src/Providers/ViewComposersServiceProvider.php b/src/Providers/ViewComposersServiceProvider.php index 3737143..2eafd2c 100644 --- a/src/Providers/ViewComposersServiceProvider.php +++ b/src/Providers/ViewComposersServiceProvider.php @@ -22,5 +22,6 @@ public function boot() public function register() { $this->app->view->composer('anavel-crud::molecules.sidebar.default', 'Anavel\Crud\View\Composers\SidebarComposer'); + $this->app->view->composer('anavel-crud::atoms.forms.field', 'Anavel\Crud\View\Composers\FormFieldComposer'); } } diff --git a/src/View/Composers/FormFieldComposer.php b/src/View/Composers/FormFieldComposer.php new file mode 100644 index 0000000..6659924 --- /dev/null +++ b/src/View/Composers/FormFieldComposer.php @@ -0,0 +1,28 @@ +anavel = $anavel; + } + + public function compose($view) + { + $uploadsModuleIsInstalled = $this->anavel->hasModule('Anavel\Uploads\UploadsModuleProvider'); + + $view->with([ + 'canTakeFileFromUploads' => $uploadsModuleIsInstalled + ]); + } +} \ No newline at end of file diff --git a/views/atoms/forms/field.blade.php b/views/atoms/forms/field.blade.php index 2e5b938..1fc15a6 100644 --- a/views/atoms/forms/field.blade.php +++ b/views/atoms/forms/field.blade.php @@ -34,12 +34,24 @@ class="col-sm-2 control-label">{{ $field->label->html() }}{{ $field->attr('requi {!! $field->input !!} - @if($field instanceof FormManager\Fields\File && ! empty($field->val())) - - + @if($field instanceof FormManager\Fields\File) + + @if (empty($field->val()) && $canTakeFileFromUploads) + + + + @else + @if ($canTakeFileFromUploads) + + + + @endif + + + + @endif + @endif @endif \ No newline at end of file From 71062d37c4de60815622e336bc397fe62ed75b24 Mon Sep 17 00:00:00 2001 From: Eduardo Salguero Date: Wed, 9 Nov 2016 14:47:31 +0100 Subject: [PATCH 02/14] Added the ability to select a file from uploads module Using a modal with an iframe the user could select a previously uploaded file. --- src/Abstractor/Eloquent/Model.php | 24 +++++- src/Abstractor/Eloquent/ModelFactory.php | 23 +++++- src/Abstractor/Eloquent/Relation/MiniCrud.php | 3 +- .../Eloquent/Traits/HandleFiles.php | 29 ++++++- src/Contracts/Abstractor/Model.php | 5 ++ src/CrudModuleProvider.php | 3 +- views/atoms/forms/field.blade.php | 53 ++++++------ views/molecules/forms/edit-main.blade.php | 80 ++++++++++++++++++- 8 files changed, 185 insertions(+), 35 deletions(-) diff --git a/src/Abstractor/Eloquent/Model.php b/src/Abstractor/Eloquent/Model.php index eb0bda5..cc84da4 100644 --- a/src/Abstractor/Eloquent/Model.php +++ b/src/Abstractor/Eloquent/Model.php @@ -38,12 +38,18 @@ class Model implements ModelAbstractorContract protected $name; protected $instance; + /** + * @var bool + */ + protected $mustDeleteFilesInFilesystem; + public function __construct( $config, AbstractionLayer $dbal, RelationFactoryContract $relationFactory, FieldFactoryContract $fieldFactory, - FormGenerator $generator + FormGenerator $generator, + $mustDeleteFilesInFilesystem = false ) { if (is_array($config)) { $this->model = $config['model']; @@ -57,6 +63,7 @@ public function __construct( $this->relationFactory = $relationFactory; $this->fieldFactory = $fieldFactory; $this->generator = $generator; + $this->mustDeleteFilesInFilesystem = $mustDeleteFilesInFilesystem; } public function setSlug($slug) @@ -442,7 +449,7 @@ public function persist(Request $request) } if (get_class($field->getFormField()) === \FormManager\Fields\File::class) { - $handleResult = $this->handleField($request, $item, $fields['main'], 'main', $fieldName); + $handleResult = $this->handleField($request, $item, $fields['main'], 'main', $fieldName,$this->mustDeleteFilesInFilesystem); if (! empty($handleResult['skip'])) { $skip = $handleResult['skip']; } @@ -474,8 +481,11 @@ public function persist(Request $request) foreach ($relations as $relationKey => $relation) { if ($relation instanceof Collection) { $input = $request->input($relationKey); - $relation->get('relation')->persist($input, $request); + /** @var $relationInstance Relation */ + $relationInstance = $relation->get('relation'); + $relationInstance->persist($input, $request); } else { + /** @var $relation Relation */ $relation->persist($request->input($relationKey), $request); } } @@ -546,4 +556,12 @@ public function getFieldValue($item, $fieldName) return $value; } + + /** + * @return boolean + */ + public function mustDeleteFilesInFilesystem() + { + return $this->mustDeleteFilesInFilesystem; + } } diff --git a/src/Abstractor/Eloquent/ModelFactory.php b/src/Abstractor/Eloquent/ModelFactory.php index ba465b0..eb1f3bf 100644 --- a/src/Abstractor/Eloquent/ModelFactory.php +++ b/src/Abstractor/Eloquent/ModelFactory.php @@ -5,6 +5,7 @@ use Anavel\Crud\Contracts\Abstractor\RelationFactory as RelationAbstractorFactoryContract; use Anavel\Crud\Contracts\Abstractor\FieldFactory as FieldAbstractorFactoryContract; use ANavallaSuiza\Laravel\Database\Contracts\Manager\ModelManager; +use Anavel\Foundation\Contracts\Anavel; use EasySlugger\Slugger; use Anavel\Crud\Contracts\Form\Generator as FormGenerator; use Anavel\Crud\Abstractor\Exceptions\FactoryException; @@ -18,17 +19,32 @@ class ModelFactory implements ModelAbstractorFactoryContract protected $slugger; protected $allConfiguredModels; + + /** + * @var Anavel + */ + protected $anavel; /** * @var FormGenerator */ private $generator; + /** + * ModelFactory constructor. + * @param array $allConfiguredModels + * @param ModelManager $modelManager + * @param RelationAbstractorFactoryContract $relationFactory + * @param FieldAbstractorFactoryContract $fieldFactory + * @param FormGenerator $generator + * @param Anavel $anavel + */ public function __construct( array $allConfiguredModels, ModelManager $modelManager, RelationAbstractorFactoryContract $relationFactory, FieldAbstractorFactoryContract $fieldFactory, - FormGenerator $generator + FormGenerator $generator, + Anavel $anavel ) { $this->allConfiguredModels = $allConfiguredModels; $this->modelManager = $modelManager; @@ -36,6 +52,7 @@ public function __construct( $this->fieldFactory = $fieldFactory; $this->slugger = new Slugger(); $this->generator = $generator; + $this->anavel = $anavel; } /** @@ -58,7 +75,9 @@ public function getBySlug($slug, $id = null) $modelNamespace = $config; } - $model = new Model($config, $this->modelManager->getAbstractionLayer($modelNamespace), $this->relationFactory, $this->fieldFactory, $this->generator); + $model = new Model($config, $this->modelManager->getAbstractionLayer($modelNamespace), + $this->relationFactory, $this->fieldFactory, $this->generator, + !$this->anavel->hasModule('Anavel\Uploads\UploadsModuleProvider')); $model->setSlug($modelSlug) ->setName($modelName); diff --git a/src/Abstractor/Eloquent/Relation/MiniCrud.php b/src/Abstractor/Eloquent/Relation/MiniCrud.php index a2320c5..4e58886 100644 --- a/src/Abstractor/Eloquent/Relation/MiniCrud.php +++ b/src/Abstractor/Eloquent/Relation/MiniCrud.php @@ -220,7 +220,8 @@ public function persist(array $relationArray = null, Request $request) $fieldName = $field->getName(); if (get_class($field->getFormField()) === \FormManager\Fields\File::class) { - $handleResult = $this->handleField($request, $relationModel, $fieldsBase, $this->name . ".$relationIndex", $fieldName); + $handleResult = $this->handleField($request, $relationModel, $fieldsBase, + $this->name . ".$relationIndex", $fieldName, $this->modelAbstractor->mustDeleteFilesInFilesystem()); if (! empty($handleResult['skip'])) { $skip = $handleResult['skip']; unset($relationArray[$relationIndex][$skip]); diff --git a/src/Abstractor/Eloquent/Traits/HandleFiles.php b/src/Abstractor/Eloquent/Traits/HandleFiles.php index 2a127d4..18eb592 100644 --- a/src/Abstractor/Eloquent/Traits/HandleFiles.php +++ b/src/Abstractor/Eloquent/Traits/HandleFiles.php @@ -3,19 +3,37 @@ namespace Anavel\Crud\Abstractor\Eloquent\Traits; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\App; use League\Flysystem\Adapter\Local; use League\Flysystem\Filesystem; use Illuminate\Http\Request; trait HandleFiles { - protected function handleField(Request $request, $item, array $fields, $groupName, $fieldName) + /** + * @param Request $request + * @param Model $item + * @param array $fields + * @param $groupName + * @param $fieldName + * @param bool $mustDeleteFilesInFilesystem + * @return array + * @throws \Exception + */ + protected function handleField(Request $request, $item, array $fields, $groupName, $fieldName, $mustDeleteFilesInFilesystem=false) { + + + $normalizeGroupName = str_replace('.','#',$groupName); + $contentFromUploadedField="uploaded-content.{$normalizeGroupName}#{$fieldName}#"; $modelFolder = $this->slug . DIRECTORY_SEPARATOR; $basePath = base_path(DIRECTORY_SEPARATOR . 'public' . DIRECTORY_SEPARATOR .config('anavel-crud.uploads_path')); $modelPath = $basePath . $modelFolder; $skip = null; $requestValue = null; + + if (! empty($fields["{$fieldName}__delete"])) { //We never want to save this field, it doesn't exist in the DB $skip = "{$fieldName}__delete"; @@ -25,7 +43,7 @@ protected function handleField(Request $request, $item, array $fields, $groupNam if (! empty($request->input("{$groupName}.{$fieldName}__delete"))) { $adapter = new Local($basePath); $filesystem = new Filesystem($adapter); - if ($filesystem->has($item->$fieldName)) { + if ($filesystem->has($item->$fieldName) && $mustDeleteFilesInFilesystem) { $filesystem->delete($item->$fieldName); } @@ -39,7 +57,12 @@ protected function handleField(Request $request, $item, array $fields, $groupNam ]; } } - if ($request->hasFile($groupName .'.'.$fieldName)) { + + if($request->has($contentFromUploadedField)) + { + $requestValue = $request->input($contentFromUploadedField); + + }elseif ($request->hasFile($groupName .'.'.$fieldName)) { $fileName = pathinfo($request->file($groupName .'.'.$fieldName)->getClientOriginalName(), PATHINFO_FILENAME); $extension = pathinfo($request->file($groupName .'.'.$fieldName)->getClientOriginalName(), PATHINFO_EXTENSION); diff --git a/src/Contracts/Abstractor/Model.php b/src/Contracts/Abstractor/Model.php index 6ec043f..f7e2af0 100644 --- a/src/Contracts/Abstractor/Model.php +++ b/src/Contracts/Abstractor/Model.php @@ -76,4 +76,9 @@ public function getValidationRules(); * @return array */ public function getColumns($action, $withForeignKeys = false); + + /** + * @return bool + */ + public function mustDeleteFilesInFilesystem(); } diff --git a/src/CrudModuleProvider.php b/src/CrudModuleProvider.php index 53ea03c..f80f9ec 100644 --- a/src/CrudModuleProvider.php +++ b/src/CrudModuleProvider.php @@ -71,7 +71,8 @@ function () { $this->app['ANavallaSuiza\Laravel\Database\Contracts\Manager\ModelManager'], $this->app['Anavel\Crud\Contracts\Abstractor\RelationFactory'], $this->app['Anavel\Crud\Contracts\Abstractor\FieldFactory'], - $this->app['Anavel\Crud\Contracts\Form\Generator'] + $this->app['Anavel\Crud\Contracts\Form\Generator'], + $this->app['Anavel\Foundation\Contracts\Anavel'] ); } ); diff --git a/views/atoms/forms/field.blade.php b/views/atoms/forms/field.blade.php index 1fc15a6..5f3b52d 100644 --- a/views/atoms/forms/field.blade.php +++ b/views/atoms/forms/field.blade.php @@ -24,34 +24,41 @@ @endif @else -
+ +
@if($field->attr('type') != 'hidden') +
+ class="control-label">{{ $field->label->html() }}{{ $field->attr('required') ? ' *' : '' }} +
@endif + @if($field instanceof FormManager\Fields\File) +
+ {!! $field->input !!} +
+
-
- {!! $field->input !!} -
- - @if($field instanceof FormManager\Fields\File) + + @if ($canTakeFileFromUploads) + + {{_('Get from uploads')}} + - - @if (empty($field->val()) && $canTakeFileFromUploads) - - - - @else - @if ($canTakeFileFromUploads) - - - + @endif + @if (!empty($field->val())) + + Ver + @endif - - - + +
+ @else +
+ {!! $field->input !!} +
+ @endif - - @endif +
-@endif \ No newline at end of file +@endif + diff --git a/views/molecules/forms/edit-main.blade.php b/views/molecules/forms/edit-main.blade.php index 5b866b8..3af2106 100644 --- a/views/molecules/forms/edit-main.blade.php +++ b/views/molecules/forms/edit-main.blade.php @@ -13,7 +13,7 @@ @empty @endforelse -
+
@unless(empty($form['main'])) @foreach($form['main'] as $field) @@ -59,4 +59,80 @@ @endif @empty @endforelse -
\ No newline at end of file +
+ + + +@section('footer-scripts') + @parent + + +@stop From 8c3e7ae6e05ab75acafd1c9092dea26c4314f16e Mon Sep 17 00:00:00 2001 From: Eduardo Salguero Date: Wed, 9 Nov 2016 15:27:33 +0100 Subject: [PATCH 03/14] anavel-crud.models config key is a must --- tests/TestBase.php | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/TestBase.php b/tests/TestBase.php index b8b7848..2c8d128 100644 --- a/tests/TestBase.php +++ b/tests/TestBase.php @@ -37,6 +37,7 @@ protected function getEnvironmentSetUp($app) ]); $app['config']->set('anavel.translation_languages', ['gl', 'en', 'es']); + $app['config']->set('anavel-crud.models', []); \App::bind('ANavallaSuiza\Laravel\Database\Contracts\Manager\ModelManager', function ($app) { return \Mockery::mock('ANavallaSuiza\Laravel\Database\Manager\Eloquent\ModelManager'); From 3647e544d99b6a52301b9a68c5286c3c0a911bb5 Mon Sep 17 00:00:00 2001 From: Eduardo Salguero Date: Wed, 9 Nov 2016 15:30:29 +0100 Subject: [PATCH 04/14] Add Anavel mock and define its behave when hasModule method is called --- tests/Abstractor/Eloquent/ModelFactoryTest.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/Abstractor/Eloquent/ModelFactoryTest.php b/tests/Abstractor/Eloquent/ModelFactoryTest.php index 38c7b2d..9a9b2c9 100644 --- a/tests/Abstractor/Eloquent/ModelFactoryTest.php +++ b/tests/Abstractor/Eloquent/ModelFactoryTest.php @@ -19,6 +19,8 @@ class ModelFactoryTest extends TestBase protected $fieldMock; /** @var Mock */ protected $generatorMock; + /** @var Mock */ + protected $anavelMock; public function setUp() { @@ -30,8 +32,9 @@ public function setUp() $this->relationMock = $this->mock('Anavel\Crud\Contracts\Abstractor\RelationFactory'); $this->fieldMock = $this->mock('Anavel\Crud\Contracts\Abstractor\FieldFactory'); $this->generatorMock = $this->mock('Anavel\Crud\Contracts\Form\Generator'); - - $this->sut = new ModelFactory($config, $this->modelManagerMock, $this->relationMock, $this->fieldMock, $this->generatorMock); + $this->anavelMock = $this->mock('Anavel\Foundation\Contracts\Anavel'); + $this->anavelMock->shouldReceive('hasModule')->andReturn(false); + $this->sut = new ModelFactory($config, $this->modelManagerMock, $this->relationMock, $this->fieldMock, $this->generatorMock, $this->anavelMock); } public function test_implements_model__factory_interface() From b7a6a63fbc6e3c027805abcb8cead42adc747aa6 Mon Sep 17 00:00:00 2001 From: Eduardo Salguero Date: Thu, 10 Nov 2016 09:29:48 +0100 Subject: [PATCH 05/14] Set alias to try to fix an error with PHP7 in Travis --- tests/TestBase.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/TestBase.php b/tests/TestBase.php index 2c8d128..b821b19 100644 --- a/tests/TestBase.php +++ b/tests/TestBase.php @@ -36,6 +36,8 @@ protected function getEnvironmentSetUp($app) 'prefix' => '' ]); + $app['aliases'] = ['Route' => \Illuminate\Support\Facades\Route::class]; + $app['config']->set('anavel.translation_languages', ['gl', 'en', 'es']); $app['config']->set('anavel-crud.models', []); From 4402845e797ce775f93a0a4a9c47f51eeb9bc713 Mon Sep 17 00:00:00 2001 From: Eduardo Salguero Date: Thu, 10 Nov 2016 09:44:08 +0100 Subject: [PATCH 06/14] Another attempt --- src/Http/routes.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Http/routes.php b/src/Http/routes.php index 31a1e61..eb8ca55 100644 --- a/src/Http/routes.php +++ b/src/Http/routes.php @@ -1,4 +1,5 @@ Date: Thu, 10 Nov 2016 10:21:06 +0100 Subject: [PATCH 07/14] Remove import --- src/Http/routes.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Http/routes.php b/src/Http/routes.php index eb8ca55..31a1e61 100644 --- a/src/Http/routes.php +++ b/src/Http/routes.php @@ -1,5 +1,4 @@ Date: Thu, 10 Nov 2016 10:52:12 +0100 Subject: [PATCH 08/14] Update phpunit version --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 9eb0d4c..34c4078 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "require-dev": { "illuminate/database": "^5.1", "orchestra/testbench": "~3.1", - "phpunit/phpunit": "~4.0", + "phpunit/phpunit": "~5.4", "mockery/mockery": "0.9.*", "whatthejeff/nyancat-phpunit-resultprinter": "~1.2", "php-mock/php-mock-mockery": "^1.1" From 4b6aef91c1ae1bf35e7c039eb2fd1a5b46fc3a6e Mon Sep 17 00:00:00 2001 From: Eduardo Salguero Date: Thu, 10 Nov 2016 11:08:34 +0100 Subject: [PATCH 09/14] Set php 7 version to local version --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 34a0767..4991569 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,7 @@ language: php php: - 5.5 - 5.6 - - 7.0 + - 7.0.8 - hhvm before_script: From 7b8850bb7e32f13dbc9d09f42110d87241e4072b Mon Sep 17 00:00:00 2001 From: Eduardo Salguero Date: Thu, 10 Nov 2016 11:19:02 +0100 Subject: [PATCH 10/14] Fix php unit erro in php 5.5 --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 34c4078..6851d86 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "require-dev": { "illuminate/database": "^5.1", "orchestra/testbench": "~3.1", - "phpunit/phpunit": "~5.4", + "phpunit/phpunit": ">=4.0", "mockery/mockery": "0.9.*", "whatthejeff/nyancat-phpunit-resultprinter": "~1.2", "php-mock/php-mock-mockery": "^1.1" From d989b0eb67c84eea53b05ff969c3e7dc6fdf891d Mon Sep 17 00:00:00 2001 From: Eduardo Salguero Date: Thu, 10 Nov 2016 11:29:27 +0100 Subject: [PATCH 11/14] phpunit versions --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 6851d86..f97f410 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "require-dev": { "illuminate/database": "^5.1", "orchestra/testbench": "~3.1", - "phpunit/phpunit": ">=4.0", + "phpunit/phpunit": ">=4.0 <=5.6.1", "mockery/mockery": "0.9.*", "whatthejeff/nyancat-phpunit-resultprinter": "~1.2", "php-mock/php-mock-mockery": "^1.1" From 23f3af80c70c098dbd1628857018eac3e8c18dce Mon Sep 17 00:00:00 2001 From: Eduardo Salguero Date: Thu, 10 Nov 2016 11:43:43 +0100 Subject: [PATCH 12/14] Revert changes --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index f97f410..9eb0d4c 100644 --- a/composer.json +++ b/composer.json @@ -32,7 +32,7 @@ "require-dev": { "illuminate/database": "^5.1", "orchestra/testbench": "~3.1", - "phpunit/phpunit": ">=4.0 <=5.6.1", + "phpunit/phpunit": "~4.0", "mockery/mockery": "0.9.*", "whatthejeff/nyancat-phpunit-resultprinter": "~1.2", "php-mock/php-mock-mockery": "^1.1" From 6f0ae21c13caae9199a6adf1fdfeeae112612121 Mon Sep 17 00:00:00 2001 From: Eduardo Salguero Date: Thu, 10 Nov 2016 12:05:29 +0100 Subject: [PATCH 13/14] Remove php 7 --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4991569..e46d3d2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,6 @@ language: php php: - 5.5 - 5.6 - - 7.0.8 - hhvm before_script: From 6cc863dd598af3a66766baa420dc360e56c49f58 Mon Sep 17 00:00:00 2001 From: Eduardo Salguero Date: Mon, 14 Nov 2016 09:55:32 +0100 Subject: [PATCH 14/14] File path begins after uploads path --- views/molecules/forms/edit-main.blade.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/views/molecules/forms/edit-main.blade.php b/views/molecules/forms/edit-main.blade.php index 3af2106..57b6ba9 100644 --- a/views/molecules/forms/edit-main.blade.php +++ b/views/molecules/forms/edit-main.blade.php @@ -111,7 +111,9 @@ var inputFile = $('#'+ inputId); var inputName = inputFile.attr('name').replace(/[\[\]']+/g,'#'); var name = 'uploaded-content['+inputName+']'; - var filePath = url.replace(/.*\/\/[^\/]*/, '').replace('{{config('anavel-crud.uploads_path')}}',''); + var filePath = url; + var n = filePath.indexOf('{{config('anavel-crud.uploads_path')}}') + '{{config('anavel-crud.uploads_path')}}'.length; + filePath = filePath.substr(n); inputFile.parent().find('.selected-from-uploads').remove(); var tpl = '
' + ' ' +