diff --git a/.php_cs.dist b/.php_cs.dist index ab7058adc..0889a65ee 100644 --- a/.php_cs.dist +++ b/.php_cs.dist @@ -10,6 +10,7 @@ $finder = PhpCsFixer\Finder::create() 'bootstrap', 'tests', 'node_modules', + 'views', ]) ->notPath('server.php') ; diff --git a/Modules/Core/Blade/AsgardEditorDirective.php b/Modules/Core/Blade/AsgardEditorDirective.php new file mode 100644 index 000000000..128ac17a7 --- /dev/null +++ b/Modules/Core/Blade/AsgardEditorDirective.php @@ -0,0 +1,33 @@ +extractArguments($arguments); + + if ($this->lang !== null) { + return asgard_i18n_editor($this->fieldName, $this->labelName, $this->content, $this->lang); + } + return asgard_editor($this->fieldName, $this->labelName, $this->content); + } + + /** + * Extract the possible arguments as class properties + * @param array $arguments + */ + private function extractArguments(array $arguments) + { + $this->fieldName = array_get($arguments, 0); + $this->labelName = array_get($arguments, 1); + $this->content = array_get($arguments, 2); + $this->lang = array_get($arguments, 3); + } +} diff --git a/Modules/Core/Blade/Facades/AsgardEditorDirective.php b/Modules/Core/Blade/Facades/AsgardEditorDirective.php new file mode 100644 index 000000000..ad8db2a67 --- /dev/null +++ b/Modules/Core/Blade/Facades/AsgardEditorDirective.php @@ -0,0 +1,13 @@ +assetPipeline->requireCss(config('asgard.core.core.admin-required-assets.css')); $this->assetPipeline->requireJs(config('asgard.core.core.admin-required-assets.js')); + event($editor = new EditorIsRendering($this->assetPipeline)); + event(new CollectingAssets($this->assetPipeline)); + $view->with('cssFiles', $this->assetPipeline->allCss()); $view->with('jsFiles', $this->assetPipeline->allJs()); + $view->with('editor', $editor); } } diff --git a/Modules/Core/Config/config.php b/Modules/Core/Config/config.php index 65324c45b..317144b00 100644 --- a/Modules/Core/Config/config.php +++ b/Modules/Core/Config/config.php @@ -13,6 +13,9 @@ 'workshop', 'setting', 'media', + 'tag', + 'page', + 'translation', ], /* diff --git a/Modules/Core/Config/core.php b/Modules/Core/Config/core.php index d4b45263d..67ec2a105 100644 --- a/Modules/Core/Config/core.php +++ b/Modules/Core/Config/core.php @@ -32,6 +32,18 @@ */ 'skin' => 'skin-blue', + /* + |-------------------------------------------------------------------------- + | WYSIWYG Backend Editor + |-------------------------------------------------------------------------- + | Define which editor you would like to use for the backend wysiwygs. + | These classes are event handlers, listening to EditorIsRendering + | you can define your own handlers and use them here + | Options: + | - \Modules\Core\Events\Handlers\LoadCkEditor::class + | - \Modules\Core\Events\Handlers\LoadSimpleMde::class + */ + 'wysiwyg-handler' => \Modules\Core\Events\Handlers\LoadCkEditor::class, /* |-------------------------------------------------------------------------- | Custom CKeditor configuration file @@ -84,6 +96,7 @@ 'selectize-default.css' => ['module' => 'core:vendor/selectize/dist/css/selectize.default.css'], 'animate.css' => ['theme' => 'vendor/animate.css/animate.min.css'], 'pace.css' => ['theme' => 'vendor/admin-lte/plugins/pace/pace.min.css'], + 'simplemde.css' => ['theme' => 'vendor/simplemde/dist/simplemde.min.css'], // Javascript 'bootstrap.js' => ['theme' => 'vendor/bootstrap/dist/js/bootstrap.min.js'], 'mousetrap.js' => ['theme' => 'js/vendor/mousetrap.min.js'], @@ -110,6 +123,7 @@ 'pace.js' => ['theme' => 'vendor/admin-lte/plugins/pace/pace.min.js'], 'moment.js' => ['theme' => 'vendor/admin-lte/plugins/daterangepicker/moment.min.js'], 'clipboard.js' => ['theme' => 'vendor/clipboard/dist/clipboard.min.js'], + 'simplemde.js' => ['theme' => 'vendor/simplemde/dist/simplemde.min.js'], ], /* diff --git a/Modules/Core/Contracts/EntityIsChanging.php b/Modules/Core/Contracts/EntityIsChanging.php new file mode 100644 index 000000000..302efa549 --- /dev/null +++ b/Modules/Core/Contracts/EntityIsChanging.php @@ -0,0 +1,22 @@ +attributes = $attributes; + $this->original = $attributes; + } + + /** + * @return array + */ + public function getAttributes() + { + return $this->attributes; + } + + /** + * @param string $attribute + * @param null $default + * @return string|null + */ + public function getAttribute($attribute, $default = null) + { + return data_get($this->attributes, $attribute, $default); + } + + /** + * @param array $attributes + */ + public function setAttributes(array $attributes) + { + $this->attributes = array_replace_recursive($this->attributes, $attributes); + } + + /** + * @param string|null $key + * @param string|null $default + * @return array + */ + public function getOriginal($key = null, $default = null) + { + if ($key !== null) { + return data_get($this->original, $key, $default); + } + + return $this->original; + } +} diff --git a/Modules/Core/Events/CollectingAssets.php b/Modules/Core/Events/CollectingAssets.php new file mode 100644 index 000000000..c31827755 --- /dev/null +++ b/Modules/Core/Events/CollectingAssets.php @@ -0,0 +1,65 @@ +assetPipeline = $assetPipeline; + } + + /** + * @param string $asset + * @return AssetPipeline + */ + public function requireJs($asset) + { + return $this->assetPipeline->requireJs($asset); + } + + /** + * @param string $asset + * @return AssetPipeline + */ + public function requireCss($asset) + { + return $this->assetPipeline->requireCss($asset); + } + + /** + * Match a single route + * @param string|array $route + * @return bool + */ + public function onRoute($route) + { + $request = request(); + + return str_is($route, $request->route()->getName()); + } + + /** + * Match multiple routes + * @param array $routes + * @return bool + */ + public function onRoutes(array $routes) + { + $request = request(); + + foreach ($routes as $route) { + if (str_is($route, $request->route()->getName()) === true) { + return true; + } + } + return false; + } +} diff --git a/Modules/Core/Events/EditorIsRendering.php b/Modules/Core/Events/EditorIsRendering.php new file mode 100644 index 000000000..27bc9c0f7 --- /dev/null +++ b/Modules/Core/Events/EditorIsRendering.php @@ -0,0 +1,107 @@ + 'core::components.i18n.textarea', + 'normal' => 'core::components.textarea', + ]; + + public function __construct(AssetPipeline $assetPipeline) + { + $this->assetPipeline = $assetPipeline; + } + + public function addJs($asset) + { + $this->assetPipeline->requireJs($asset); + + return $this; + } + + public function addCss($asset) + { + $this->assetPipeline->requireCss($asset); + + return $this; + } + + /** + * @return mixed + */ + public function getEditorClass() + { + return $this->editorClass; + } + + /** + * @param mixed $editorClass + */ + public function setEditorClass($editorClass) + { + $this->editorClass = $editorClass; + } + + /** + * @return mixed + */ + public function getEditorJsPartial() + { + return $this->editorJsPartial; + } + + /** + * @param mixed $editorJsPartial + */ + public function setEditorJsPartial($editorJsPartial) + { + $this->editorJsPartial = $editorJsPartial; + } + + /** + * @return mixed + */ + public function getEditorCssPartial() + { + return $this->editorCssPartial; + } + + /** + * @param mixed $editorCssPartial + */ + public function setEditorCssPartial($editorCssPartial) + { + $this->editorCssPartial = $editorCssPartial; + } + + public function getI18nComponentName() + { + return $this->editorComponents['i18n']; + } + + public function setI18nComponentName($componentName) + { + $this->editorComponents['i18n'] = $componentName; + } + + public function getComponentName() + { + return $this->editorComponents['normal']; + } + + public function setComponentName($componentName) + { + $this->editorComponents['normal'] = $componentName; + } +} diff --git a/Modules/Core/Events/Handlers/LoadCkEditor.php b/Modules/Core/Events/Handlers/LoadCkEditor.php new file mode 100644 index 000000000..ae7bcac04 --- /dev/null +++ b/Modules/Core/Events/Handlers/LoadCkEditor.php @@ -0,0 +1,16 @@ +addJs('ckeditor.js'); + $editor->setEditorClass('ckeditor'); + + return false; + } +} diff --git a/Modules/Core/Events/Handlers/LoadSimpleMde.php b/Modules/Core/Events/Handlers/LoadSimpleMde.php new file mode 100644 index 000000000..01d71c4ad --- /dev/null +++ b/Modules/Core/Events/Handlers/LoadSimpleMde.php @@ -0,0 +1,17 @@ +addJs('simplemde.js')->addCss('simplemde.css'); + $editor->setEditorClass('simplemde'); + $editor->setEditorJsPartial('core::partials.simplemde'); + + return false; + } +} diff --git a/Modules/Core/Events/Handlers/RenderMarkdown.php b/Modules/Core/Events/Handlers/RenderMarkdown.php new file mode 100644 index 000000000..81a9b141e --- /dev/null +++ b/Modules/Core/Events/Handlers/RenderMarkdown.php @@ -0,0 +1,18 @@ +convertToHtml($event->getOriginal()); + + $event->setBody($html); + } +} diff --git a/Modules/Core/Providers/CoreServiceProvider.php b/Modules/Core/Providers/CoreServiceProvider.php index 11e82dcbb..ae42c5b5a 100644 --- a/Modules/Core/Providers/CoreServiceProvider.php +++ b/Modules/Core/Providers/CoreServiceProvider.php @@ -7,11 +7,13 @@ use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\DB; use Illuminate\Support\ServiceProvider; +use Modules\Core\Blade\AsgardEditorDirective; use Modules\Core\Console\DeleteModuleCommand; use Modules\Core\Console\DownloadModuleCommand; use Modules\Core\Console\InstallCommand; use Modules\Core\Console\PublishModuleAssetsCommand; use Modules\Core\Console\PublishThemeAssetsCommand; +use Modules\Core\Events\EditorIsRendering; use Modules\Core\Foundation\Theme\ThemeManager; use Modules\Core\Traits\CanPublishConfiguration; use Nwidart\Modules\Module; @@ -53,6 +55,7 @@ public function boot() $this->registerModuleResourceNamespaces(); $this->bladeDirectives(); + $this->app['events']->listen(EditorIsRendering::class, config('asgard.core.core.wysiwyg-handler')); } /** @@ -72,6 +75,10 @@ public function register() $this->registerCommands(); $this->registerServices(); $this->setLocalesConfigurations(); + + $this->app->bind('core.asgard.editor', function () { + return new AsgardEditorDirective(); + }); } /** @@ -305,6 +312,10 @@ private function getCentralisedTranslationPath(Module $module) */ public function bladeDirectives() { + if (app()->environment() === 'testing') { + return; + } + /** * Set variable. * Usage: @set($variable, value) @@ -314,6 +325,10 @@ public function bladeDirectives() return ""; }); + + $this->app['blade.compiler']->directive('editor', function ($value) { + return ""; + }); } /** diff --git a/Modules/Core/Resources/views/components/i18n/textarea-wrapper.blade.php b/Modules/Core/Resources/views/components/i18n/textarea-wrapper.blade.php new file mode 100644 index 000000000..c04f432b6 --- /dev/null +++ b/Modules/Core/Resources/views/components/i18n/textarea-wrapper.blade.php @@ -0,0 +1,3 @@ +@component($editor->getI18nComponentName(), compact('lang', 'fieldName', 'labelName')) + {!! $content !!} +@endcomponent diff --git a/Modules/Core/Resources/views/components/i18n/textarea.blade.php b/Modules/Core/Resources/views/components/i18n/textarea.blade.php new file mode 100644 index 000000000..bcc1a475a --- /dev/null +++ b/Modules/Core/Resources/views/components/i18n/textarea.blade.php @@ -0,0 +1,19 @@ +@if ($editor->getEditorCssPartial() !== null) + @if (Cache::store('array')->add('textareaCssLoaded', true, 100)) + @include($editor->getEditorCssPartial()) + @endif +@endif + +
+ {!! Form::label("{$lang}[{$fieldName}]", $labelName) !!} + + {!! $errors->first("{$lang}.{$fieldName}", ':message') !!} +
+ +@if ($editor->getEditorJsPartial() !== null) + @if (Cache::store('array')->add('textareaJsLoaded', true, 100)) + @include($editor->getEditorJsPartial()) + @endif +@endif + + diff --git a/Modules/Core/Resources/views/components/textarea-wrapper.blade.php b/Modules/Core/Resources/views/components/textarea-wrapper.blade.php new file mode 100644 index 000000000..d37506195 --- /dev/null +++ b/Modules/Core/Resources/views/components/textarea-wrapper.blade.php @@ -0,0 +1,3 @@ +@component($editor->getComponentName(), compact('fieldName', 'labelName')) + {!! $content !!} +@endcomponent diff --git a/Modules/Core/Resources/views/components/textarea.blade.php b/Modules/Core/Resources/views/components/textarea.blade.php new file mode 100644 index 000000000..c7413cef7 --- /dev/null +++ b/Modules/Core/Resources/views/components/textarea.blade.php @@ -0,0 +1,19 @@ +@if ($editor->getEditorCssPartial() !== null) + @if (Cache::store('array')->add('textareaCssLoaded', true, 100)) + @include($editor->getEditorCssPartial()) + @endif +@endif + +
+ {!! Form::label($fieldName, $labelName) !!} + + {!! $errors->first($fieldName, ':message') !!} +
+ +@if ($editor->getEditorJsPartial() !== null) + @if (Cache::store('array')->add('textareaJsLoaded', true, 100)) + @include($editor->getEditorJsPartial()) + @endif +@endif + + diff --git a/Modules/Core/Resources/views/partials/simplemde.blade.php b/Modules/Core/Resources/views/partials/simplemde.blade.php new file mode 100644 index 000000000..e760fe2de --- /dev/null +++ b/Modules/Core/Resources/views/partials/simplemde.blade.php @@ -0,0 +1,12 @@ +@push('js-stack') + +@endpush diff --git a/Modules/Core/changelog.yml b/Modules/Core/changelog.yml index 1b1840106..07fce4721 100644 --- a/Modules/Core/changelog.yml +++ b/Modules/Core/changelog.yml @@ -1,5 +1,15 @@ url: https://github.com/AsgardCms/Platform versions: + "2.5.0@unreleased": + added: + - Adding a EntityIsChanging interface to use on events which are triggered before a create / update action + - Create an AbstractEntityHook containing base logic for entity hooks + - Trigger the EditorIsRendering event on assets view composer and send editor variable to view + - New configuration value wysiwyg-handler in config/asgard/core/core.php to change the editor in backend + - New handler RenderMarkdown if you want to render markdown on a ContentIsRendering event + - New @editor('fieldname', 'fieldlabel, 'content', 'locale') blade directive to include a textarea. The last locale parameter is optional and can be omitted for non translatable textarea. + changed: + - Adding more core modules (tag, translation and page). Preventing them to be disabled. "2.3.0": added: - New command php artisan asgard:download:module asgardcms/contact --migrations --seeds --assets diff --git a/Modules/Core/composers.php b/Modules/Core/composers.php index 74283816a..500c20ed0 100644 --- a/Modules/Core/composers.php +++ b/Modules/Core/composers.php @@ -7,4 +7,4 @@ view()->composer('core::fields.select-locales', \Modules\Core\Composers\SettingLocalesComposer::class); view()->composer('*', \Modules\Core\Composers\LocaleComposer::class); view()->composer('*', \Modules\Core\Composers\CurrentUserViewComposer::class); -view()->composer('layouts.master', \Modules\Core\Composers\AssetsViewComposer::class); +view()->composer('*', \Modules\Core\Composers\AssetsViewComposer::class); diff --git a/Modules/Core/helpers.php b/Modules/Core/helpers.php index 251f4f821..bb44b7913 100644 --- a/Modules/Core/helpers.php +++ b/Modules/Core/helpers.php @@ -33,3 +33,18 @@ function is_core_module($module) return in_array(strtolower($module), app('asgard.ModulesList')); } } + +if (! function_exists('asgard_i18n_editor')) { + function asgard_i18n_editor($fieldName, $labelName, $content, $lang) + { + return view('core::components.i18n.textarea-wrapper', compact('fieldName','labelName', 'content', 'lang')); + } +} + + +if (! function_exists('asgard_editor')) { + function asgard_editor($fieldName, $labelName, $content) + { + return view('core::components.textarea-wrapper', compact('fieldName','labelName', 'content')); + } +} diff --git a/Modules/Core/module.json b/Modules/Core/module.json index c6a4d3685..9784cf347 100644 --- a/Modules/Core/module.json +++ b/Modules/Core/module.json @@ -4,7 +4,7 @@ "description": "The core module with all base classes and logic.", "keywords": [], "require": {}, - "version": "2.0.0", + "version": "2.5.0", "active": 1, "order": 0, "providers": [ @@ -20,7 +20,8 @@ "aliases": { "Form": "Collective\\Html\\FormFacade", "Flash": "Laracasts\\Flash\\Flash", - "LaravelLocalization": "Mcamara\\LaravelLocalization\\Facades\\LaravelLocalization" + "LaravelLocalization": "Mcamara\\LaravelLocalization\\Facades\\LaravelLocalization", + "AsgardEditorDirective": "Modules\\Core\\Blade\\Facades\\AsgardEditorDirective" }, "files": [ "start.php", diff --git a/Modules/Core/stylistPublishMix.js b/Modules/Core/stylistPublishMix.js deleted file mode 100644 index 541768f63..000000000 --- a/Modules/Core/stylistPublishMix.js +++ /dev/null @@ -1,12 +0,0 @@ -var gulp = require("gulp"); -var shell = require('gulp-shell'); -var elixir = require('laravel-elixir'); -var themeInfo = require('./theme.json'); - -var Task = elixir.Task; - -elixir.extend('stylistPublish', function() { - new Task('stylistPublish', function() { - return gulp.src("").pipe(shell("php ../../artisan stylist:publish " + themeInfo.name)); - }); -}); diff --git a/Modules/Dashboard/Resources/views/admin/dashboard.blade.php b/Modules/Dashboard/Resources/views/admin/dashboard.blade.php index aea76b944..b4485bb82 100644 --- a/Modules/Dashboard/Resources/views/admin/dashboard.blade.php +++ b/Modules/Dashboard/Resources/views/admin/dashboard.blade.php @@ -12,13 +12,13 @@
@stop -@section('styles') +@push('css-stack') -@stop +@endpush @section('content') @@ -46,7 +46,7 @@ @stop -@section('scripts') +@push('js-stack') @parent -@stop +@endpush diff --git a/Modules/Dashboard/changelog.yml b/Modules/Dashboard/changelog.yml index bb89aae5a..da22cc725 100644 --- a/Modules/Dashboard/changelog.yml +++ b/Modules/Dashboard/changelog.yml @@ -1,5 +1,9 @@ url: https://github.com/AsgardCms/Platform versions: + "2.5.0@unreleased": + changed: + - Using the @push js stacks over the scripts section + - Using the @push css stacks over the styles section "2.0.0": added: - Laravel 5.4 compatibility diff --git a/Modules/Dashboard/module.json b/Modules/Dashboard/module.json index bb72ac2be..c74160cff 100644 --- a/Modules/Dashboard/module.json +++ b/Modules/Dashboard/module.json @@ -3,7 +3,7 @@ "alias": "dashboard", "description": "The module responsible for the admin dashboard page.", "keywords": [], - "version": "2.0.0", + "version": "2.5.0", "active": 1, "order": 1, "providers": [ diff --git a/Modules/Media/Events/FileIsCreating.php b/Modules/Media/Events/FileIsCreating.php new file mode 100644 index 000000000..649e4a0e0 --- /dev/null +++ b/Modules/Media/Events/FileIsCreating.php @@ -0,0 +1,10 @@ +file = $file; + parent::__construct($attributes); + } + + /** + * @return File + */ + public function getFile() + { + return $this->file; + } +} diff --git a/Modules/Media/Events/FileWasCreated.php b/Modules/Media/Events/FileWasCreated.php new file mode 100644 index 000000000..4c2be45a5 --- /dev/null +++ b/Modules/Media/Events/FileWasCreated.php @@ -0,0 +1,18 @@ +file = $file; + } +} diff --git a/Modules/Media/Events/FileWasUpdated.php b/Modules/Media/Events/FileWasUpdated.php new file mode 100644 index 000000000..ab4f416fb --- /dev/null +++ b/Modules/Media/Events/FileWasUpdated.php @@ -0,0 +1,18 @@ +file = $file; + } +} diff --git a/Modules/Media/Repositories/Eloquent/EloquentFileRepository.php b/Modules/Media/Repositories/Eloquent/EloquentFileRepository.php index 4013e5dec..d925934d0 100644 --- a/Modules/Media/Repositories/Eloquent/EloquentFileRepository.php +++ b/Modules/Media/Repositories/Eloquent/EloquentFileRepository.php @@ -5,6 +5,10 @@ use Illuminate\Database\Eloquent\Collection; use Modules\Core\Repositories\Eloquent\EloquentBaseRepository; use Modules\Media\Entities\File; +use Modules\Media\Events\FileIsCreating; +use Modules\Media\Events\FileIsUpdating; +use Modules\Media\Events\FileWasCreated; +use Modules\Media\Events\FileWasUpdated; use Modules\Media\Helpers\FileHelper; use Modules\Media\Repositories\FileRepository; use Symfony\Component\HttpFoundation\File\UploadedFile; @@ -19,10 +23,13 @@ class EloquentFileRepository extends EloquentBaseRepository implements FileRepos */ public function update($file, $data) { - $file->update($data); + event($event = new FileIsUpdating($file, $data)); + $file->update($event->getAttributes()); $file->setTags(array_get($data, 'tags', [])); + event(new FileWasUpdated($file)); + return $file; } @@ -41,14 +48,21 @@ public function createFromFile(UploadedFile $file) $fileName = $this->getNewUniqueFilename($fileName); } - return $this->model->create([ + $data = [ 'filename' => $fileName, 'path' => config('asgard.media.config.files-path') . "{$fileName}", - 'extension' => substr(strrchr($fileName, "."), 1), + 'extension' => substr(strrchr($fileName, '.'), 1), 'mimetype' => $file->getClientMimeType(), 'filesize' => $file->getFileInfo()->getSize(), 'folder_id' => 0, - ]); + ]; + + event($event = new FileIsCreating($data)); + + $file = $this->model->create($event->getAttributes()); + event(new FileWasCreated($file)); + + return $file; } public function destroy($file) diff --git a/Modules/Media/Resources/views/admin/edit.blade.php b/Modules/Media/Resources/views/admin/edit.blade.php index 91b07e7f1..d601d0206 100644 --- a/Modules/Media/Resources/views/admin/edit.blade.php +++ b/Modules/Media/Resources/views/admin/edit.blade.php @@ -75,7 +75,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Media/Resources/views/admin/index.blade.php b/Modules/Media/Resources/views/admin/index.blade.php index 34b8c8b14..073a633dd 100644 --- a/Modules/Media/Resources/views/admin/index.blade.php +++ b/Modules/Media/Resources/views/admin/index.blade.php @@ -10,7 +10,7 @@ @stop -@section('styles') +@push('css-stack') -@stop +@endpush @section('content')
@@ -91,7 +91,7 @@ @include('core::partials.delete-modal') @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Media/Tests/FileRepositoryTest.php b/Modules/Media/Tests/EloquentFileRepositoryTest.php similarity index 54% rename from Modules/Media/Tests/FileRepositoryTest.php rename to Modules/Media/Tests/EloquentFileRepositoryTest.php index 67755399a..6837fe373 100644 --- a/Modules/Media/Tests/FileRepositoryTest.php +++ b/Modules/Media/Tests/EloquentFileRepositoryTest.php @@ -2,13 +2,18 @@ namespace Modules\Media\Tests; +use Illuminate\Support\Facades\Event; use Mockery; use Modules\Media\Entities\File; +use Modules\Media\Events\FileIsCreating; +use Modules\Media\Events\FileIsUpdating; +use Modules\Media\Events\FileWasCreated; +use Modules\Media\Events\FileWasUpdated; use Modules\Media\Repositories\FileRepository; use Symfony\Component\Finder\SplFileInfo; use Symfony\Component\HttpFoundation\File\UploadedFile; -class FileRepositoryTest extends MediaTestCase +class EloquentFileRepositoryTest extends MediaTestCase { /** * @var FileRepository @@ -114,6 +119,99 @@ public function it_can_delete_a_file() $this->assertCount(0, $this->file->all()); } + /** @test */ + public function it_triggers_event_when_file_was_created() + { + Event::fake(); + $file = $this->file->createFromFile(\Illuminate\Http\UploadedFile::fake()->image('myfile.jpg')); + + Event::assertDispatched(FileWasCreated::class, function ($e) use ($file) { + return $e->file->id === $file->id; + }); + } + + /** @test */ + public function it_triggers_event_when_file_is_creating() + { + Event::fake(); + + $file = $this->file->createFromFile(\Illuminate\Http\UploadedFile::fake()->image('myfile.jpg')); + + Event::assertDispatched(FileIsCreating::class, function ($e) use ($file) { + return $e->getAttribute('filename') === $file->filename; + }); + } + + /** @test */ + public function it_can_change_data_when_it_is_creating_event() + { + Event::listen(FileIsCreating::class, function (FileIsCreating $event) { + $event->setAttributes(['filename' => 'imabettername.jpg']); + }); + + $file = $this->file->createFromFile(\Illuminate\Http\UploadedFile::fake()->image('myfile.jpg')); + + $this->assertEquals('imabettername.jpg', $file->filename); + } + + /** @test */ + public function it_triggers_event_when_file_was_updated() + { + Event::fake(); + + $file = $this->file->createFromFile(\Illuminate\Http\UploadedFile::fake()->image('myfile.jpg')); + $this->file->update($file, []); + + Event::assertDispatched(FileWasUpdated::class, function ($e) use ($file) { + return $e->file->id === $file->id; + }); + } + + /** @test */ + public function it_triggers_event_when_file_is_updating() + { + Event::fake(); + + $file = $this->file->createFromFile(\Illuminate\Http\UploadedFile::fake()->image('myfile.jpg')); + $this->file->update($file, [ + 'en' => [ + 'description' => 'My cool file!', + 'alt_attribute' => 'My cool file!', + 'keywords' => 'My cool file!', + ] + ]); + + Event::assertDispatched(FileIsUpdating::class, function ($e) use ($file) { + return $e->getFile()->id === $file->id && + $e->getAttribute('en.description') === 'My cool file!'; + }); + } + + /** @test */ + public function it_can_change_properties_before_update() + { + Event::listen(FileIsUpdating::class, function (FileIsUpdating $event) { + $event->setAttributes([ + 'filename' => 'bettername.jpg', + 'en' => [ + 'description' => 'Hello World', + ] + ]); + }); + + $file = $this->file->createFromFile(\Illuminate\Http\UploadedFile::fake()->image('myfile.jpg')); + $this->file->update($file, [ + 'en' => [ + 'description' => 'My cool file!', + 'alt_attribute' => 'My cool file!', + 'keywords' => 'My cool file!', + ] + ]); + + $this->assertEquals('bettername.jpg', $file->filename); + $this->assertEquals('Hello World', $file->translate('en')->description); + } + private function createFile($fileName = 'random/name.jpg') { return File::create([ diff --git a/Modules/Media/changelog.yml b/Modules/Media/changelog.yml index 0508c378a..f4b378ac2 100644 --- a/Modules/Media/changelog.yml +++ b/Modules/Media/changelog.yml @@ -1,5 +1,14 @@ url: https://github.com/AsgardCms/Platform versions: + "2.5.0@unreleased": + added: + - FileWasCreated event + - FileWasUpdated event + - FileIsCreating hookable event + - FileIsUpdating hookable event + changed: + - Using the @push js stacks over the scripts section + - Using the @push css stacks over the styles section "2.4.0": added: - new blade directive for thumbnails @thumbnail('path', 'thumbnailName') diff --git a/Modules/Media/module.json b/Modules/Media/module.json index 5c8539064..49390b507 100644 --- a/Modules/Media/module.json +++ b/Modules/Media/module.json @@ -3,7 +3,7 @@ "alias": "media", "description": "A media library, used throughout the CMS.", "keywords": [], - "version": "2.0.0", + "version": "2.5.0", "active": 1, "order": 1, "providers": [ diff --git a/Modules/Menu/Events/MenuIsCreating.php b/Modules/Menu/Events/MenuIsCreating.php new file mode 100644 index 000000000..a12e1abac --- /dev/null +++ b/Modules/Menu/Events/MenuIsCreating.php @@ -0,0 +1,10 @@ +menu = $menu; + parent::__construct($attributes); + } + + /** + * @return Menu + */ + public function getMenu() + { + return $this->menu; + } +} diff --git a/Modules/Menu/Events/MenuItemIsCreating.php b/Modules/Menu/Events/MenuItemIsCreating.php new file mode 100644 index 000000000..1d0457d38 --- /dev/null +++ b/Modules/Menu/Events/MenuItemIsCreating.php @@ -0,0 +1,10 @@ +menuItem = $menuItem; + } + + /** + * @return Menuitem + */ + public function getMenuItem() + { + return $this->menuItem; + } +} diff --git a/Modules/Menu/Events/MenuItemWasUpdated.php b/Modules/Menu/Events/MenuItemWasUpdated.php new file mode 100644 index 000000000..025781725 --- /dev/null +++ b/Modules/Menu/Events/MenuItemWasUpdated.php @@ -0,0 +1,18 @@ +menuItem = $menuItem; + } +} diff --git a/Modules/Menu/Events/MenuWasUpdated.php b/Modules/Menu/Events/MenuWasUpdated.php new file mode 100644 index 000000000..fbbe5b8e3 --- /dev/null +++ b/Modules/Menu/Events/MenuWasUpdated.php @@ -0,0 +1,18 @@ +menu = $menu; + } +} diff --git a/Modules/Menu/Providers/MenuServiceProvider.php b/Modules/Menu/Providers/MenuServiceProvider.php index 87ca8fd63..67851d2ae 100644 --- a/Modules/Menu/Providers/MenuServiceProvider.php +++ b/Modules/Menu/Providers/MenuServiceProvider.php @@ -68,31 +68,25 @@ public function provides() */ private function registerBindings() { - $this->app->bind( - 'Modules\Menu\Repositories\MenuRepository', - function () { - $repository = new EloquentMenuRepository(new Menu()); + $this->app->bind(MenuRepository::class, function () { + $repository = new EloquentMenuRepository(new Menu()); - if (! config('app.cache')) { - return $repository; - } - - return new CacheMenuDecorator($repository); + if (! config('app.cache')) { + return $repository; } - ); - $this->app->bind( - 'Modules\Menu\Repositories\MenuItemRepository', - function () { - $repository = new EloquentMenuItemRepository(new Menuitem()); + return new CacheMenuDecorator($repository); + }); - if (! config('app.cache')) { - return $repository; - } + $this->app->bind(MenuItemRepository::class, function () { + $repository = new EloquentMenuItemRepository(new Menuitem()); - return new CacheMenuItemDecorator($repository); + if (! config('app.cache')) { + return $repository; } - ); + + return new CacheMenuItemDecorator($repository); + }); } /** diff --git a/Modules/Menu/Repositories/Eloquent/EloquentMenuItemRepository.php b/Modules/Menu/Repositories/Eloquent/EloquentMenuItemRepository.php index ca6468b7c..cfd56e3c7 100644 --- a/Modules/Menu/Repositories/Eloquent/EloquentMenuItemRepository.php +++ b/Modules/Menu/Repositories/Eloquent/EloquentMenuItemRepository.php @@ -6,14 +6,18 @@ use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\DB; use Modules\Core\Repositories\Eloquent\EloquentBaseRepository; +use Modules\Menu\Events\MenuItemIsCreating; +use Modules\Menu\Events\MenuItemIsUpdating; use Modules\Menu\Events\MenuItemWasCreated; +use Modules\Menu\Events\MenuItemWasUpdated; use Modules\Menu\Repositories\MenuItemRepository; class EloquentMenuItemRepository extends EloquentBaseRepository implements MenuItemRepository { public function create($data) { - $menuItem = $this->model->create($data); + event($event = new MenuItemIsCreating($data)); + $menuItem = $this->model->create($event->getAttributes()); event(new MenuItemWasCreated($menuItem)); @@ -22,7 +26,10 @@ public function create($data) public function update($menuItem, $data) { - $menuItem->update($data); + event($event = new MenuItemIsUpdating($menuItem, $data)); + $menuItem->update($event->getAttributes()); + + event(new MenuItemWasUpdated($menuItem)); return $menuItem; } diff --git a/Modules/Menu/Repositories/Eloquent/EloquentMenuRepository.php b/Modules/Menu/Repositories/Eloquent/EloquentMenuRepository.php index 05e3ede6b..ff481ba98 100644 --- a/Modules/Menu/Repositories/Eloquent/EloquentMenuRepository.php +++ b/Modules/Menu/Repositories/Eloquent/EloquentMenuRepository.php @@ -5,14 +5,18 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Support\Facades\App; use Modules\Core\Repositories\Eloquent\EloquentBaseRepository; +use Modules\Menu\Events\MenuIsCreating; +use Modules\Menu\Events\MenuIsUpdating; use Modules\Menu\Events\MenuWasCreated; +use Modules\Menu\Events\MenuWasUpdated; use Modules\Menu\Repositories\MenuRepository; class EloquentMenuRepository extends EloquentBaseRepository implements MenuRepository { public function create($data) { - $menu = $this->model->create($data); + event($event = new MenuIsCreating($data)); + $menu = $this->model->create($event->getAttributes()); event(new MenuWasCreated($menu)); @@ -21,7 +25,10 @@ public function create($data) public function update($menu, $data) { - $menu->update($data); + event($event = new MenuIsUpdating($menu, $data)); + $menu->update($event->getAttributes()); + + event(new MenuWasUpdated($menu)); return $menu; } diff --git a/Modules/Menu/Resources/views/admin/menuitems/create.blade.php b/Modules/Menu/Resources/views/admin/menuitems/create.blade.php index ed56aaa37..aa396a207 100644 --- a/Modules/Menu/Resources/views/admin/menuitems/create.blade.php +++ b/Modules/Menu/Resources/views/admin/menuitems/create.blade.php @@ -11,9 +11,6 @@ @stop -@section('styles') -@stop - @section('content') {!! Form::open(['route' => ['dashboard.menuitem.store', $menu->id], 'method' => 'post']) !!}
@@ -90,7 +87,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Menu/Resources/views/admin/menuitems/edit.blade.php b/Modules/Menu/Resources/views/admin/menuitems/edit.blade.php index bf786f96b..a80ba9c19 100644 --- a/Modules/Menu/Resources/views/admin/menuitems/edit.blade.php +++ b/Modules/Menu/Resources/views/admin/menuitems/edit.blade.php @@ -11,9 +11,6 @@ @stop -@section('styles') -@stop - @section('content') {!! Form::open(['route' => ['dashboard.menuitem.update', $menu->id, $menuItem->id], 'method' => 'put']) !!}
@@ -96,7 +93,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Menu/Resources/views/admin/menus/create.blade.php b/Modules/Menu/Resources/views/admin/menus/create.blade.php index 1b650fd50..9741eee5d 100644 --- a/Modules/Menu/Resources/views/admin/menus/create.blade.php +++ b/Modules/Menu/Resources/views/admin/menus/create.blade.php @@ -11,9 +11,6 @@ @stop -@section('styles') -@stop - @section('content') {!! Form::open(['route' => ['admin.menu.menu.store'], 'method' => 'post']) !!}
@@ -72,7 +69,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Menu/Resources/views/admin/menus/edit.blade.php b/Modules/Menu/Resources/views/admin/menus/edit.blade.php index 8d6a736bc..36b6ce90c 100644 --- a/Modules/Menu/Resources/views/admin/menus/edit.blade.php +++ b/Modules/Menu/Resources/views/admin/menus/edit.blade.php @@ -11,9 +11,9 @@ @stop -@section('styles') +@push('css-stack') -@stop +@endpush @section('content') {!! Form::open(['route' => ['admin.menu.menu.update', $menu->id], 'method' => 'put']) !!} @@ -89,7 +89,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Menu/Resources/views/admin/menus/index.blade.php b/Modules/Menu/Resources/views/admin/menus/index.blade.php index ba44d3d75..cfa52b1c1 100644 --- a/Modules/Menu/Resources/views/admin/menus/index.blade.php +++ b/Modules/Menu/Resources/views/admin/menus/index.blade.php @@ -107,7 +107,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Menu/Tests/BaseMenuTest.php b/Modules/Menu/Tests/BaseMenuTest.php index 6d0f6913b..57a7dbc53 100644 --- a/Modules/Menu/Tests/BaseMenuTest.php +++ b/Modules/Menu/Tests/BaseMenuTest.php @@ -9,10 +9,13 @@ use Mcamara\LaravelLocalization\Facades\LaravelLocalization; use Mcamara\LaravelLocalization\LaravelLocalizationServiceProvider; use Modules\Core\Providers\CoreServiceProvider; +use Modules\Menu\Providers\EventServiceProvider; use Modules\Menu\Providers\MenuServiceProvider; use Modules\Menu\Repositories\MenuItemRepository; use Modules\Menu\Repositories\MenuRepository; use Modules\Page\Providers\PageServiceProvider; +use Modules\Setting\Providers\SettingServiceProvider; +use Modules\Setting\Repositories\SettingRepository; use Modules\Tag\Providers\TagServiceProvider; use Nwidart\Modules\LaravelModulesServiceProvider; use Orchestra\Testbench\TestCase; @@ -39,6 +42,9 @@ public function setUp() $this->menu = app(MenuRepository::class); $this->menuItem = app(MenuItemRepository::class); + app(SettingRepository::class)->createOrUpdate([ + 'core::locales' => ['en', 'fr',] + ]); } protected function getPackageProviders($app) @@ -48,6 +54,8 @@ protected function getPackageProviders($app) CoreServiceProvider::class, TagServiceProvider::class, PageServiceProvider::class, + SettingServiceProvider::class, + EventServiceProvider::class, MenuServiceProvider::class, LaravelLocalizationServiceProvider::class, SidebarServiceProvider::class, @@ -96,6 +104,10 @@ private function resetDatabase() '--database' => 'sqlite', '--path' => 'Modules/Tag/Database/Migrations', ]); + $this->artisan('migrate', [ + '--database' => 'sqlite', + '--path' => 'Modules/Setting/Database/Migrations', + ]); } public function createMenu($name, $title) diff --git a/Modules/Menu/Tests/EloquentMenuItemRepositoryTest.php b/Modules/Menu/Tests/EloquentMenuItemRepositoryTest.php index 7db6f4754..d14b6f663 100644 --- a/Modules/Menu/Tests/EloquentMenuItemRepositoryTest.php +++ b/Modules/Menu/Tests/EloquentMenuItemRepositoryTest.php @@ -2,6 +2,12 @@ namespace Modules\Menu\Tests; +use Illuminate\Support\Facades\Event; +use Modules\Menu\Events\MenuItemIsCreating; +use Modules\Menu\Events\MenuItemIsUpdating; +use Modules\Menu\Events\MenuItemWasCreated; +use Modules\Menu\Events\MenuItemWasUpdated; + class EloquentMenuItemRepositoryTest extends BaseMenuTest { public function setUp() @@ -53,8 +59,105 @@ public function it_destroys_menu_item() $secondaryItem2 = $this->createMenuItemForMenu($menu2->id, 1); $secondaryItem3 = $this->createMenuItemForMenu($menu2->id, 3); - $this->assertEquals(6, $this->menuItem->all()->count()); + $this->assertEquals(8, $this->menuItem->all()->count()); $this->menuItem->destroy($item2); - $this->assertEquals(5, $this->menuItem->all()->count()); + $this->assertEquals(7, $this->menuItem->all()->count()); + } + + /** @test */ + public function it_triggers_event_when_menu_item_was_created() + { + Event::fake(); + + $menu = $this->createMenu('main', 'Main Menu'); + $item1 = $this->createMenuItemForMenu($menu->id, 0); + + Event::assertDispatched(MenuItemWasCreated::class, function ($e) use ($item1) { + return $e->menuItem->id === $item1->id; + }); + } + + /** @test */ + public function it_triggers_event_when_menu_item_is_creating() + { + Event::fake(); + + $menu = $this->createMenu('main', 'Main Menu'); + $item1 = $this->createMenuItemForMenu($menu->id, 0); + + Event::assertDispatched(MenuItemIsCreating::class, function ($e) use ($item1) { + return $e->getAttribute('target') === $item1->target; + }); + } + + /** @test */ + public function it_can_change_data_when_it_is_creating_event() + { + Event::listen(MenuItemIsCreating::class, function (MenuItemIsCreating $event) { + $event->setAttributes([ + 'target' => '_blank', + 'en' => [ + 'title' => 'My Title', + ], + ]); + }); + + $menu = $this->createMenu('main', 'Main Menu'); + $item = $this->createMenuItemForMenu($menu->id, 0); + + $this->assertEquals('_blank', $item->target); + $this->assertEquals('My Title', $item->translate('en')->title); + } + + /** @test */ + public function it_triggers_event_when_menu_item_is_updated() + { + Event::fake(); + + $menu = $this->createMenu('main', 'Main Menu'); + $item1 = $this->createMenuItemForMenu($menu->id, 0); + + $this->menuItem->update($item1, []); + + Event::assertDispatched(MenuItemWasUpdated::class, function ($e) use ($item1) { + return $e->menuItem->id === $item1->id; + }); + } + + /** @test */ + public function it_triggers_event_when_menu_item_is_updating() + { + Event::fake(); + + $menu = $this->createMenu('main', 'Main Menu'); + $item1 = $this->createMenuItemForMenu($menu->id, 0); + + $this->menuItem->update($item1, []); + + Event::assertDispatched(MenuItemIsUpdating::class, function ($e) use ($item1) { + return $e->getMenuItem()->id === $item1->id; + }); + } + + /** @test */ + public function it_can_change_data_before_updating_menu_item() + { + Event::listen(MenuItemIsUpdating::class, function (MenuItemIsUpdating $event) { + $event->setAttributes([ + 'target' => '_blank', + 'en' => [ + 'title' => 'My Title', + ], + ]); + }); + + $menu = $this->createMenu('main', 'Main Menu'); + $item1 = $this->createMenuItemForMenu($menu->id, 0); + + $this->menuItem->update($item1, [ + 'en' => ['title' => 'This one!'], + ]); + + $this->assertEquals('My Title', $item1->translate('en')->title); } } diff --git a/Modules/Menu/Tests/EloquentMenuRepositoryTest.php b/Modules/Menu/Tests/EloquentMenuRepositoryTest.php new file mode 100644 index 000000000..9cd036510 --- /dev/null +++ b/Modules/Menu/Tests/EloquentMenuRepositoryTest.php @@ -0,0 +1,105 @@ +createMenu('main', 'Main Menu'); + + $this->assertEquals(1, $this->menu->find($menu->id)->count()); + $this->assertEquals($menu->name, $this->menu->find($menu->id)->name); + } + + /** @test */ + public function it_triggers_event_when_menu_was_created() + { + Event::fake(); + + $menu = $this->createMenu('main', 'Main Menu'); + + Event::assertDispatched(MenuWasCreated::class, function ($e) use ($menu) { + return $e->menu->id === $menu->id; + }); + } + + /** @test */ + public function it_triggers_event_when_menu_is_creating() + { + Event::fake(); + + $menu = $this->createMenu('main', 'Main Menu'); + + Event::assertDispatched(MenuIsCreating::class, function ($e) use ($menu) { + return $e->getAttribute('name') === $menu->name; + }); + } + + /** @test */ + public function it_can_change_data_when_it_is_creating_event() + { + Event::listen(MenuIsCreating::class, function (MenuIsCreating $event) { + $event->setAttributes(['name' => 'MAIN']); + }); + + $menu = $this->createMenu('main', 'Main Menu'); + + $this->assertEquals('MAIN', $menu->name); + } + + /** @test */ + public function it_triggers_event_when_menu_item_was_updated() + { + Event::fake(); + + $menu = $this->createMenu('main', 'Main Menu'); + $this->menu->update($menu, []); + + Event::assertDispatched(MenuWasUpdated::class, function ($e) use ($menu) { + return $e->menu->id === $menu->id; + }); + } + + /** @test */ + public function it_triggers_event_when_menu_is_updating() + { + Event::fake(); + + $menu = $this->createMenu('main', 'Main Menu'); + $this->menu->update($menu, []); + + Event::assertDispatched(MenuIsUpdating::class, function ($e) use ($menu) { + return $e->getMenu()->id === $menu->id; + }); + } + + /** @test */ + public function it_can_change_attributes_before_update() + { + Event::listen(MenuIsUpdating::class, function (MenuIsUpdating $event) { + $event->setAttributes(['name' => 'MAIN']); + }); + + $menu = $this->createMenu('main', 'Main Menu'); + $this->menu->update($menu, ['name' => 'better-one']); + + $this->assertEquals('MAIN', $menu->name); + } + + /** @test */ + public function it_should_create_root_item_when_creating_new_menu() + { + $menu = $this->createMenu('main', 'Main Menu'); + + $items = $this->menuItem->allRootsForMenu($menu->id); + $this->assertCount(1, $items); + } +} diff --git a/Modules/Menu/Tests/MenuItemUriGeneratorTest.php b/Modules/Menu/Tests/MenuItemUriGeneratorTest.php index 8612e4598..134f19f6a 100644 --- a/Modules/Menu/Tests/MenuItemUriGeneratorTest.php +++ b/Modules/Menu/Tests/MenuItemUriGeneratorTest.php @@ -2,6 +2,7 @@ namespace Modules\Menu\Tests; +use Illuminate\Support\Facades\Event; use Modules\Menu\Services\MenuItemUriGenerator; use Modules\Page\Repositories\PageRepository; @@ -42,6 +43,7 @@ public function it_generates_basic_uri_without_parent() /** @test */ public function it_generates_uri_with_the_parents_slug() { + Event::fake(); $this->page->create([ 'is_home' => 1, 'template' => 'default', @@ -80,6 +82,7 @@ public function it_generates_uri_with_the_parents_slug() /** @test */ public function it_generates_uri_with_multiple_parents() { + Event::fake(); $this->page->create([ 'is_home' => 1, 'template' => 'default', @@ -140,6 +143,7 @@ public function it_generates_uri_with_multiple_parents() /** @test */ public function it_generates_a_uri_if_parent_isnt_a_page() { + Event::fake(); $this->page->create([ 'is_home' => 0, 'template' => 'default', diff --git a/Modules/Menu/Tests/MenuRepositoryTest.php b/Modules/Menu/Tests/MenuRepositoryTest.php deleted file mode 100644 index 9dc59c45b..000000000 --- a/Modules/Menu/Tests/MenuRepositoryTest.php +++ /dev/null @@ -1,22 +0,0 @@ -createMenu('main', 'Main Menu'); - - $this->assertEquals(1, $this->menu->find($menu->id)->count()); - $this->assertEquals($menu->name, $this->menu->find($menu->id)->name); - } - - public function it_should_create_root_item_when_creating_new_menu() - { - $menu = $this->createMenu('main', 'Main Menu'); - - $items = $this->menuItem->allRootsForMenu($menu->id); - } -} diff --git a/Modules/Menu/changelog.yml b/Modules/Menu/changelog.yml index 5f940596b..3a7eece10 100644 --- a/Modules/Menu/changelog.yml +++ b/Modules/Menu/changelog.yml @@ -1,5 +1,14 @@ url: https://github.com/AsgardCms/Platform versions: + "2.5.0@unreleased": + added: + - Trigger event before a menu is created (MenuIsCreating) allow data to be changed + - Trigger event before a menu is updated (MenuIsUpdating) allow data to be changed + - Trigger event before a menu item is created (MenuItemIsCreating) allow data to be changed + - Trigger event before a menu item is updated (MenuItemIsUpdating) allow data to be changed + changed: + - Using the @push js stacks over the scripts section + - Using the @push css stacks over the styles section "2.2.0": changed: - Only registering the menus for the frontend part. diff --git a/Modules/Menu/module.json b/Modules/Menu/module.json index c08ec8727..778f51266 100644 --- a/Modules/Menu/module.json +++ b/Modules/Menu/module.json @@ -4,7 +4,7 @@ "description": "Managing menus.", "keywords": [ ], - "version": "2.0.0", + "version": "2.5.0", "active": 1, "order": 1, "providers": [ diff --git a/Modules/Page/Assets/.gitkeep b/Modules/Page/Assets/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Modules/Page/Console/.gitkeep b/Modules/Page/Console/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Modules/Page/Entities/PageTranslation.php b/Modules/Page/Entities/PageTranslation.php index fd3ed17ab..bd73acb15 100644 --- a/Modules/Page/Entities/PageTranslation.php +++ b/Modules/Page/Entities/PageTranslation.php @@ -3,6 +3,7 @@ namespace Modules\Page\Entities; use Illuminate\Database\Eloquent\Model; +use Modules\Page\Events\ContentIsRendering; class PageTranslation extends Model { @@ -20,4 +21,11 @@ class PageTranslation extends Model 'og_image', 'og_type', ]; + + public function getBodyAttribute($body) + { + event($event = new ContentIsRendering($body)); + + return $event->getBody(); + } } diff --git a/Modules/Page/Events/ContentIsRendering.php b/Modules/Page/Events/ContentIsRendering.php new file mode 100644 index 000000000..5986a51bb --- /dev/null +++ b/Modules/Page/Events/ContentIsRendering.php @@ -0,0 +1,47 @@ +body = $body; + $this->original = $body; + } + + /** + * @return string + */ + public function getBody() + { + return $this->body; + } + + /** + * @param string $body + */ + public function setBody($body) + { + $this->body = $body; + } + + /** + * @return mixed + */ + public function getOriginal() + { + return $this->original; + } + + public function __toString() + { + return $this->getBody(); + } +} diff --git a/Modules/Page/Events/PageIsCreating.php b/Modules/Page/Events/PageIsCreating.php new file mode 100644 index 000000000..f2acb95d0 --- /dev/null +++ b/Modules/Page/Events/PageIsCreating.php @@ -0,0 +1,10 @@ +page = $page; + parent::__construct($attributes); + } + + /** + * @return Page + */ + public function getPage() + { + return $this->page; + } +} diff --git a/Modules/Page/Http/Controllers/.gitkeep b/Modules/Page/Http/Controllers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Modules/Page/Http/Controllers/Admin/PageController.php b/Modules/Page/Http/Controllers/Admin/PageController.php index 6e644d04f..dd5330581 100644 --- a/Modules/Page/Http/Controllers/Admin/PageController.php +++ b/Modules/Page/Http/Controllers/Admin/PageController.php @@ -20,7 +20,6 @@ public function __construct(PageRepository $page) parent::__construct(); $this->page = $page; - $this->assetPipeline->requireCss('icheck.blue.css'); } public function index() @@ -37,8 +36,6 @@ public function index() */ public function create() { - $this->assetPipeline->requireJs('ckeditor.js'); - return view('page::admin.create'); } @@ -64,8 +61,6 @@ public function store(CreatePageRequest $request) */ public function edit(Page $page) { - $this->assetPipeline->requireJs('ckeditor.js'); - return view('page::admin.edit', compact('page')); } diff --git a/Modules/Page/Http/Filters/.gitkeep b/Modules/Page/Http/Filters/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Modules/Page/Providers/.gitkeep b/Modules/Page/Providers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Modules/Page/Providers/PageServiceProvider.php b/Modules/Page/Providers/PageServiceProvider.php index 47721435a..3e5df72f0 100644 --- a/Modules/Page/Providers/PageServiceProvider.php +++ b/Modules/Page/Providers/PageServiceProvider.php @@ -4,10 +4,12 @@ use Illuminate\Support\Facades\Config; use Illuminate\Support\ServiceProvider; +use Modules\Core\Events\CollectingAssets; use Modules\Core\Traits\CanPublishConfiguration; use Modules\Page\Entities\Page; use Modules\Page\Repositories\Cache\CachePageDecorator; use Modules\Page\Repositories\Eloquent\EloquentPageRepository; +use Modules\Page\Repositories\PageRepository; use Modules\Page\Services\FinderService; use Modules\Tag\Repositories\TagManager; @@ -38,6 +40,8 @@ public function boot() $this->app[TagManager::class]->registerNamespace(new Page()); $this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations'); + + $this->handleAssets(); } /** @@ -56,17 +60,27 @@ private function registerBindings() return new FinderService(); }); - $this->app->bind( - 'Modules\Page\Repositories\PageRepository', - function () { - $repository = new EloquentPageRepository(new Page()); + $this->app->bind(PageRepository::class, function () { + $repository = new EloquentPageRepository(new Page()); + + if (! Config::get('app.cache')) { + return $repository; + } - if (! Config::get('app.cache')) { - return $repository; - } + return new CachePageDecorator($repository); + }); + } - return new CachePageDecorator($repository); + /** + * Require iCheck on edit and create pages + */ + private function handleAssets() + { + $this->app['events']->listen(CollectingAssets::class, function (CollectingAssets $event) { + if ($event->onRoutes(['*page*create', '*page*edit'])) { + $event->requireCss('icheck.blue.css'); + $event->requireJs('icheck.js'); } - ); + }); } } diff --git a/Modules/Page/Repositories/Eloquent/EloquentPageRepository.php b/Modules/Page/Repositories/Eloquent/EloquentPageRepository.php index 8d2088b0c..6cb9d5951 100644 --- a/Modules/Page/Repositories/Eloquent/EloquentPageRepository.php +++ b/Modules/Page/Repositories/Eloquent/EloquentPageRepository.php @@ -4,6 +4,8 @@ use Illuminate\Database\Eloquent\Builder; use Modules\Core\Repositories\Eloquent\EloquentBaseRepository; +use Modules\Page\Events\PageIsCreating; +use Modules\Page\Events\PageIsUpdating; use Modules\Page\Events\PageWasCreated; use Modules\Page\Events\PageWasDeleted; use Modules\Page\Events\PageWasUpdated; @@ -38,7 +40,9 @@ public function create($data) if (array_get($data, 'is_home') === '1') { $this->removeOtherHomepage(); } - $page = $this->model->create($data); + + event($event = new PageIsCreating($data)); + $page = $this->model->create($event->getAttributes()); event(new PageWasCreated($page->id, $data)); @@ -57,7 +61,9 @@ public function update($model, $data) if (array_get($data, 'is_home') === '1') { $this->removeOtherHomepage($model->id); } - $model->update($data); + + event($event = new PageIsUpdating($model, $data)); + $model->update($event->getAttributes()); event(new PageWasUpdated($model->id, $data)); diff --git a/Modules/Page/Resources/views/admin/create.blade.php b/Modules/Page/Resources/views/admin/create.blade.php index cab086fc7..db5c10b37 100644 --- a/Modules/Page/Resources/views/admin/create.blade.php +++ b/Modules/Page/Resources/views/admin/create.blade.php @@ -11,13 +11,13 @@ @stop -@section('styles') +@push('css-stack') -@stop +@endpush @section('content') {!! Form::open(['route' => ['admin.page.page.store'], 'method' => 'post']) !!} @@ -87,7 +87,7 @@ class="flat-blue" @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Page/Resources/views/admin/edit.blade.php b/Modules/Page/Resources/views/admin/edit.blade.php index d43df1722..27f53d800 100644 --- a/Modules/Page/Resources/views/admin/edit.blade.php +++ b/Modules/Page/Resources/views/admin/edit.blade.php @@ -11,13 +11,13 @@ @stop -@section('styles') +@push('css-stack') -@stop +@endpush @section('content') {!! Form::open(['route' => ['admin.page.page.update', $page->id], 'method' => 'put']) !!} @@ -94,7 +94,7 @@ class="flat-blue" @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Page/Resources/views/admin/index.blade.php b/Modules/Page/Resources/views/admin/index.blade.php index 58b8d6967..aaef45527 100644 --- a/Modules/Page/Resources/views/admin/index.blade.php +++ b/Modules/Page/Resources/views/admin/index.blade.php @@ -98,7 +98,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Page/Resources/views/admin/partials/create-fields.blade.php b/Modules/Page/Resources/views/admin/partials/create-fields.blade.php index f23b6a2ad..31699930d 100644 --- a/Modules/Page/Resources/views/admin/partials/create-fields.blade.php +++ b/Modules/Page/Resources/views/admin/partials/create-fields.blade.php @@ -10,11 +10,9 @@ {!! Form::text("{$lang}[slug]", old("{$lang}.slug"), ['class' => 'form-control slug', 'data-slug' => 'target', 'placeholder' => trans('page::pages.form.slug')]) !!} {!! $errors->first("{$lang}.slug", ':message') !!}
-
- {!! Form::label("{$lang}[body]", trans('page::pages.form.body')) !!} - - {!! $errors->first("{$lang}.body", ':message') !!} -
+ + @editor('body', trans('page::pages.form.body'), old("{$lang}.body"), $lang) + @include($partial) diff --git a/Modules/Page/Resources/views/admin/partials/edit-fields.blade.php b/Modules/Page/Resources/views/admin/partials/edit-fields.blade.php index 176a19aba..09871ce56 100644 --- a/Modules/Page/Resources/views/admin/partials/edit-fields.blade.php +++ b/Modules/Page/Resources/views/admin/partials/edit-fields.blade.php @@ -12,14 +12,10 @@ {!! Form::text("{$lang}[slug]", old("{$lang}.slug", $old), ['class' => 'form-control slug', 'data-slug' => 'target', 'placeholder' => trans('page::pages.form.slug')]) !!} {!! $errors->first("{$lang}.slug", ':message') !!}
-
- {!! Form::label("{$lang}[body]", trans('page::pages.form.body')) !!} - hasTranslation($lang) ? $page->translate($lang)->body : '' ?> - - {!! $errors->first("{$lang}.body", ':message') !!} -
+ + hasTranslation($lang) ? $page->translate($lang)->body : '' ?> + @editor('body', trans('page::pages.form.body'), old("$lang.body", $old), $lang) + @include($partial) diff --git a/Modules/Page/Tests/ContentIsRenderingTest.php b/Modules/Page/Tests/ContentIsRenderingTest.php new file mode 100644 index 000000000..4d768ce17 --- /dev/null +++ b/Modules/Page/Tests/ContentIsRenderingTest.php @@ -0,0 +1,42 @@ +setBody('' . $event->getOriginal() . ''); + }); + + $page = $this->createPage(); + + $this->assertEquals('My Page Body', $page->body); + } + + /** @test */ + public function it_doesnt_alter_content_if_no_listeners() + { + $page = $this->createPage(); + + $this->assertEquals('My Page Body', $page->body); + } + + private function createPage() + { + return $this->page->create([ + 'is_home' => '1', + 'template' => 'default', + 'en' => [ + 'title' => 'My Other Page', + 'slug' => 'my-other-page', + 'body' => 'My Page Body', + ], + ]); + } +} diff --git a/Modules/Page/Tests/PagesTest.php b/Modules/Page/Tests/EloquentPageRepositoryTest.php similarity index 65% rename from Modules/Page/Tests/PagesTest.php rename to Modules/Page/Tests/EloquentPageRepositoryTest.php index 93fabd4fa..0ad843c74 100644 --- a/Modules/Page/Tests/PagesTest.php +++ b/Modules/Page/Tests/EloquentPageRepositoryTest.php @@ -3,11 +3,13 @@ namespace Modules\Page\Tests; use Illuminate\Support\Facades\Event; +use Modules\Page\Events\PageIsCreating; +use Modules\Page\Events\PageIsUpdating; use Modules\Page\Events\PageWasCreated; use Modules\Page\Events\PageWasDeleted; use Modules\Page\Events\PageWasUpdated; -class PagesTest extends BasePageTest +class EloquentPageRepositoryTest extends BasePageTest { /** @test */ public function it_makes_page_as_homepage() @@ -93,6 +95,57 @@ public function it_triggers_event_when_page_was_created() }); } + /** @test */ + public function it_triggers_an_event_when_page_is_creating() + { + Event::fake(); + + $page = $this->createPage(); + + Event::assertDispatched(PageIsCreating::class, function ($e) use ($page) { + return $e->getAttribute('template') === $page->template; + }); + } + + /** @test */ + public function it_can_change_page_data_before_creating_page() + { + Event::listen(PageIsCreating::class, function (PageIsCreating $event) { + $event->setAttributes(['template' => 'better-tpl']); + }); + + $page = $this->createPage(); + + $this->assertEquals('better-tpl', $page->template); + } + + /** @test */ + public function it_triggers_an_event_when_page_is_updating() + { + Event::fake(); + $page = $this->createPage(); + + $this->page->update($page, ['en' => ['title' => 'Better!']]); + + Event::assertDispatched(PageIsUpdating::class, function ($e) use ($page) { + return $e->getPage()->id === $page->id; + }); + } + + /** @test */ + public function it_can_change_page_data_before_updating_page() + { + Event::listen(PageIsUpdating::class, function (PageIsUpdating $event) { + $event->setAttributes(['template' => 'better-tpl']); + }); + + $page = $this->createPage(); + $this->page->update($page, ['template' => 'my-template', 'en' => ['title' => 'Better!']]); + + $this->assertEquals('better-tpl', $page->template); + } + + /** @test */ public function it_triggers_event_when_page_was_updated() { @@ -135,4 +188,17 @@ public function it_triggers_event_when_page_was_deleted() return $e->page->id === $page->id; }); } + + private function createPage() + { + return $this->page->create([ + 'is_home' => '1', + 'template' => 'default', + 'en' => [ + 'title' => 'My Other Page', + 'slug' => 'my-other-page', + 'body' => 'My Page Body', + ], + ]); + } } diff --git a/Modules/Page/changelog.yml b/Modules/Page/changelog.yml index e591c7c7d..f6e372b10 100644 --- a/Modules/Page/changelog.yml +++ b/Modules/Page/changelog.yml @@ -1,5 +1,16 @@ url: https://github.com/AsgardCms/Platform versions: + "2.5.0@unreleased": + added: + - Trigger event before a page is created (PageIsCreating) allow data to be changed + - Trigger event before a page is updated (PageIsUpdating) allow data to be changed + changed: + - Requiring the editor assets via hook + - Making editor textarea dynamic + - Using the new @editor blade directive for the body textarea field + - Remove the ckeditor inclusion on create/edit view stubs + - Using the @push js stacks over the scripts section + - Using the @push css stacks over the styles section "2.2.0": added: - Testing event trigger on page deletion diff --git a/Modules/Page/module.json b/Modules/Page/module.json index d02a59da5..01baafdcb 100644 --- a/Modules/Page/module.json +++ b/Modules/Page/module.json @@ -3,7 +3,7 @@ "alias": "page", "description": "Managing pages.", "keywords": [], - "version": "2.0.0", + "version": "2.5.0", "active": 1, "order": 9999, "providers": [ diff --git a/Modules/Setting/Events/SettingIsCreating.php b/Modules/Setting/Events/SettingIsCreating.php new file mode 100644 index 000000000..d5ae59f22 --- /dev/null +++ b/Modules/Setting/Events/SettingIsCreating.php @@ -0,0 +1,49 @@ +settingName = $settingName; + $this->settingValues = $settingValues; + $this->original = $settingValues; + } + + /** + * @return mixed + */ + public function getSettingName() + { + return $this->settingName; + } + + /** + * @return mixed + */ + public function getSettingValues() + { + return $this->settingValues; + } + + /** + * @param mixed $settingValues + */ + public function setSettingValues($settingValues) + { + $this->settingValues = $settingValues; + } + + /** + * @return mixed + */ + public function getOriginal() + { + return $this->original; + } +} diff --git a/Modules/Setting/Events/SettingIsUpdating.php b/Modules/Setting/Events/SettingIsUpdating.php new file mode 100644 index 000000000..30aa4f56e --- /dev/null +++ b/Modules/Setting/Events/SettingIsUpdating.php @@ -0,0 +1,64 @@ +settingName = $settingName; + $this->settingValues = $settingValues; + $this->original = $settingValues; + $this->setting = $setting; + } + + /** + * @return mixed + */ + public function getSettingName() + { + return $this->settingName; + } + + /** + * @return mixed + */ + public function getSettingValues() + { + return $this->settingValues; + } + + /** + * @param mixed $settingValues + */ + public function setSettingValues($settingValues) + { + $this->settingValues = $settingValues; + } + + /** + * @return mixed + */ + public function getOriginal() + { + return $this->original; + } + + /** + * @return Setting + */ + public function getSetting() + { + return $this->setting; + } +} diff --git a/Modules/Setting/Events/SettingWasCreated.php b/Modules/Setting/Events/SettingWasCreated.php index 70d48b6a2..b10d6b99b 100644 --- a/Modules/Setting/Events/SettingWasCreated.php +++ b/Modules/Setting/Events/SettingWasCreated.php @@ -2,30 +2,17 @@ namespace Modules\Setting\Events; +use Modules\Setting\Entities\Setting; + class SettingWasCreated { /** - * @var bool - */ - public $isTranslatable; - /** - * @var string Setting name + * @var Setting */ - public $name; - /** - * @var string|array - */ - public $values; + public $setting; - /** - * @param $name - * @param $isTranslatable - * @param $values - */ - public function __construct($name, $isTranslatable, $values) + public function __construct(Setting $setting) { - $this->isTranslatable = $isTranslatable; - $this->name = $name; - $this->values = $values; + $this->setting = $setting; } } diff --git a/Modules/Setting/Events/SettingWasUpdated.php b/Modules/Setting/Events/SettingWasUpdated.php index 41a4de265..7a0da6a55 100644 --- a/Modules/Setting/Events/SettingWasUpdated.php +++ b/Modules/Setting/Events/SettingWasUpdated.php @@ -2,30 +2,17 @@ namespace Modules\Setting\Events; +use Modules\Setting\Entities\Setting; + class SettingWasUpdated { /** - * @var string The setting name - */ - public $name; - /** - * @var string|array - */ - public $values; - /** - * @var string|array Containing the old values - */ - public $oldValues; - /** - * @var bool + * @var Setting */ - public $isTranslatable; + public $setting; - public function __construct($name, $isTranslatable, $values, $oldValues = null) + public function __construct(Setting $setting) { - $this->name = $name; - $this->isTranslatable = $isTranslatable; - $this->values = $values; - $this->oldValues = $oldValues; + $this->setting = $setting; } } diff --git a/Modules/Setting/Repositories/Eloquent/EloquentSettingRepository.php b/Modules/Setting/Repositories/Eloquent/EloquentSettingRepository.php index 623b9cc7a..27e46d7bb 100644 --- a/Modules/Setting/Repositories/Eloquent/EloquentSettingRepository.php +++ b/Modules/Setting/Repositories/Eloquent/EloquentSettingRepository.php @@ -4,6 +4,9 @@ use Illuminate\Support\Facades\Config; use Modules\Core\Repositories\Eloquent\EloquentBaseRepository; +use Modules\Setting\Entities\Setting; +use Modules\Setting\Events\SettingIsCreating; +use Modules\Setting\Events\SettingIsUpdating; use Modules\Setting\Events\SettingWasCreated; use Modules\Setting\Events\SettingWasUpdated; use Modules\Setting\Repositories\SettingRepository; @@ -77,23 +80,28 @@ public function findByName($settingName) * Create a setting with the given name * @param string $settingName * @param $settingValues + * @return Setting */ private function createForName($settingName, $settingValues) { + event($event = new SettingIsCreating($settingName, $settingValues)); + $setting = new $this->model(); $setting->name = $settingName; if ($this->isTranslatableSetting($settingName)) { $setting->isTranslatable = true; - $this->setTranslatedAttributes($settingValues, $setting); - event(new SettingWasCreated($settingName, true, $settingValues)); + $this->setTranslatedAttributes($event->getSettingValues(), $setting); } else { $setting->isTranslatable = false; - $setting->plainValue = $this->getSettingPlainValue($settingValues); - event(new SettingWasCreated($settingName, false, $settingValues)); + $setting->plainValue = $this->getSettingPlainValue($event->getSettingValues()); } - return $setting->save(); + $setting->save(); + + event(new SettingWasCreated($setting)); + + return $setting; } /** @@ -104,17 +112,18 @@ private function createForName($settingName, $settingValues) private function updateSetting($setting, $settingValues) { $name = $setting->name; + event($event = new SettingIsUpdating($setting, $name, $settingValues)); if ($this->isTranslatableSetting($name)) { - $this->setTranslatedAttributes($settingValues, $setting); - event(new SettingWasUpdated($name, true, $settingValues)); + $this->setTranslatedAttributes($event->getSettingValues(), $setting); } else { - $oldValues = $setting->plainValue; - $setting->plainValue = $this->getSettingPlainValue($settingValues); - event(new SettingWasUpdated($name, false, $settingValues, $oldValues)); + $setting->plainValue = $this->getSettingPlainValue($event->getSettingValues()); } + $setting->save(); + + event(new SettingWasUpdated($setting)); - return $setting->save(); + return $setting; } /** diff --git a/Modules/Setting/Resources/views/admin/module-settings.blade.php b/Modules/Setting/Resources/views/admin/module-settings.blade.php index 8e1640d5c..58d8b72ee 100644 --- a/Modules/Setting/Resources/views/admin/module-settings.blade.php +++ b/Modules/Setting/Resources/views/admin/module-settings.blade.php @@ -79,7 +79,7 @@ class="{{ $module == $currentModule->getLowerName() ? 'active' : '' }}"> {!! Form::close() !!} @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Setting/Tests/EloquentSettingRepositoryTest.php b/Modules/Setting/Tests/EloquentSettingRepositoryTest.php index ca1da43b8..021d49bff 100644 --- a/Modules/Setting/Tests/EloquentSettingRepositoryTest.php +++ b/Modules/Setting/Tests/EloquentSettingRepositoryTest.php @@ -2,6 +2,12 @@ namespace Modules\Setting\Tests; +use Illuminate\Support\Facades\Event; +use Modules\Setting\Events\SettingIsCreating; +use Modules\Setting\Events\SettingIsUpdating; +use Modules\Setting\Events\SettingWasCreated; +use Modules\Setting\Events\SettingWasUpdated; + class EloquentSettingRepositoryTest extends BaseSettingTest { public function setUp() @@ -111,4 +117,147 @@ public function it_encodes_array_of_non_translatable_data() $this->assertEquals('core::locales', $setting->name); $this->assertEquals('["su","bi","bs"]', $setting->plainValue); } + + /** @test */ + public function it_triggers_event_when_setting_was_created() + { + Event::fake(); + + $data = [ + 'core::template' => 'asgard', + 'core::site-name' => [ + 'en' => 'AsgardCMS_en', + 'fr' => 'AsgardCMS_fr', + ], + ]; + $this->settingRepository->createOrUpdate($data); + + Event::assertDispatched(SettingWasCreated::class, function ($e) { + return $e->setting->name === 'core::template'; + }); + } + + /** @test */ + public function it_triggers_event_when_setting_is_creating() + { + Event::fake(); + + $data = [ + 'core::template' => 'asgard', + 'core::site-name' => [ + 'en' => 'AsgardCMS_en', + 'fr' => 'AsgardCMS_fr', + ], + ]; + $this->settingRepository->createOrUpdate($data); + + Event::assertDispatched(SettingIsCreating::class, function (SettingIsCreating $e) { + return $e->getSettingName() === 'core::template' && $e->getSettingValues() === 'asgard'; + }); + } + + /** @test */ + public function it_can_change_data_when_it_is_creating_event() + { + Event::listen(SettingIsCreating::class, function (SettingIsCreating $event) { + if ($event->getSettingName() === 'core::template') { + $event->setSettingValues('my-template'); + } + if ($event->getSettingName() === 'core::site-name') { + $event->setSettingValues([ + 'en' => 'English AsgardCMS' + ]); + } + }); + + $data = [ + 'core::template' => 'asgard', + 'blog::posts' => 10, + 'core::site-name' => [ + 'en' => 'AsgardCMS_en', + 'fr' => 'AsgardCMS_fr', + ], + ]; + $this->settingRepository->createOrUpdate($data); + + $this->assertEquals('my-template', $this->settingRepository->findByName('core::template')->plainValue); + $this->assertEquals(10, $this->settingRepository->findByName('blog::posts')->plainValue); + $this->assertEquals('English AsgardCMS', $this->settingRepository->findByName('core::site-name')->translate('en')->value); + } + + /** @test */ + public function it_triggers_event_when_setting_was_updated() + { + Event::fake(); + + $data = [ + 'core::template' => 'asgard', + 'core::site-name' => [ + 'en' => 'AsgardCMS_en', + 'fr' => 'AsgardCMS_fr', + ], + ]; + $this->settingRepository->createOrUpdate($data); + $this->settingRepository->createOrUpdate(['core::template' => 'flatly']); + + Event::assertDispatched(SettingWasUpdated::class, function ($e) { + return $e->setting->name === 'core::template'; + }); + } + + /** @test */ + public function it_triggers_event_when_setting_is_updating() + { + Event::fake(); + + $data = [ + 'core::template' => 'asgard', + 'core::site-name' => [ + 'en' => 'AsgardCMS_en', + 'fr' => 'AsgardCMS_fr', + ], + ]; + $this->settingRepository->createOrUpdate($data); + $this->settingRepository->createOrUpdate(['core::template' => 'flatly']); + + Event::assertDispatched(SettingIsUpdating::class, function ($e) { + return $e->getSetting()->name === 'core::template'; + }); + } + + /** @test */ + public function it_can_change_date_when_updating_setting() + { + Event::listen(SettingIsUpdating::class, function (SettingIsUpdating $event) { + if ($event->getSettingName() === 'core::template') { + $event->setSettingValues('my-template'); + } + if ($event->getSettingName() === 'core::site-name') { + $event->setSettingValues([ + 'en' => 'English AsgardCMS' + ]); + } + }); + + $data = [ + 'core::template' => 'asgard', + 'blog::posts' => 10, + 'core::site-name' => [ + 'en' => 'AsgardCMS_en', + 'fr' => 'AsgardCMS_fr', + ], + ]; + $this->settingRepository->createOrUpdate($data); + $this->settingRepository->createOrUpdate([ + 'core::template' => 'flatly', + 'core::site-name' => [ + 'en' => 'The AsgardCMS_en', + 'fr' => 'The AsgardCMS_fr', + ], + ]); + + $this->assertEquals('my-template', $this->settingRepository->findByName('core::template')->plainValue); + $this->assertEquals(10, $this->settingRepository->findByName('blog::posts')->plainValue); + $this->assertEquals('English AsgardCMS', $this->settingRepository->findByName('core::site-name')->translate('en')->value); + } } diff --git a/Modules/Setting/changelog.yml b/Modules/Setting/changelog.yml index 6cef67b54..44fbcca32 100644 --- a/Modules/Setting/changelog.yml +++ b/Modules/Setting/changelog.yml @@ -1,5 +1,14 @@ url: https://github.com/AsgardCms/Platform versions: + "2.5.0@unreleased": + changed: + - Normalise the setting was created event + - Normalise the setting was updated event + - Trigger SettingIsCreating hook + - Trigger SettingIsUpdating hook + changed: + - Using the @push js stacks over the scripts section + - Using the @push css stacks over the styles section "2.0.0": added: - Laravel 5.2 compatibility diff --git a/Modules/Setting/module.json b/Modules/Setting/module.json index ee3085053..f89af1c65 100644 --- a/Modules/Setting/module.json +++ b/Modules/Setting/module.json @@ -6,7 +6,7 @@ "asgardcms", "settings" ], - "version": "2.0.0", + "version": "2.5.0", "active": 1, "order": 1, "providers": [ diff --git a/Modules/Tag/Events/TagIsCreating.php b/Modules/Tag/Events/TagIsCreating.php new file mode 100644 index 000000000..5a42277bf --- /dev/null +++ b/Modules/Tag/Events/TagIsCreating.php @@ -0,0 +1,10 @@ +tag = $tag; + parent::__construct($attributes); + } + + /** + * @return Tag + */ + public function getTag() + { + return $this->tag; + } +} diff --git a/Modules/Tag/Events/TagWasCreated.php b/Modules/Tag/Events/TagWasCreated.php new file mode 100644 index 000000000..99ac7d1df --- /dev/null +++ b/Modules/Tag/Events/TagWasCreated.php @@ -0,0 +1,18 @@ +tag = $tag; + } +} diff --git a/Modules/Tag/Events/TagWasUpdated.php b/Modules/Tag/Events/TagWasUpdated.php new file mode 100644 index 000000000..6184fb8fa --- /dev/null +++ b/Modules/Tag/Events/TagWasUpdated.php @@ -0,0 +1,18 @@ +tag = $tag; + } +} diff --git a/Modules/Tag/Repositories/Eloquent/EloquentTagRepository.php b/Modules/Tag/Repositories/Eloquent/EloquentTagRepository.php index 6fcb96d84..ce1a8c872 100644 --- a/Modules/Tag/Repositories/Eloquent/EloquentTagRepository.php +++ b/Modules/Tag/Repositories/Eloquent/EloquentTagRepository.php @@ -3,6 +3,10 @@ namespace Modules\Tag\Repositories\Eloquent; use Modules\Core\Repositories\Eloquent\EloquentBaseRepository; +use Modules\Tag\Events\TagIsCreating; +use Modules\Tag\Events\TagIsUpdating; +use Modules\Tag\Events\TagWasCreated; +use Modules\Tag\Events\TagWasUpdated; use Modules\Tag\Repositories\TagRepository; class EloquentTagRepository extends EloquentBaseRepository implements TagRepository @@ -16,4 +20,25 @@ public function allForNamespace($namespace) { return $this->model->with('translations')->where('namespace', $namespace)->get(); } + + public function create($data) + { + event($event = new TagIsCreating($data)); + $tag = $this->model->create($event->getAttributes()); + + event(new TagWasCreated($tag)); + + return $tag; + } + + public function update($tag, $data) + { + event($event = new TagIsUpdating($tag, $data)); + $tag->update($event->getAttributes()); + + event(new TagWasUpdated($tag)); + + return $tag; + } + } diff --git a/Modules/Tag/Resources/views/admin/tags/create.blade.php b/Modules/Tag/Resources/views/admin/tags/create.blade.php index 46aa65c05..d04130866 100644 --- a/Modules/Tag/Resources/views/admin/tags/create.blade.php +++ b/Modules/Tag/Resources/views/admin/tags/create.blade.php @@ -11,9 +11,6 @@ @stop -@section('styles') -@stop - @section('content') {!! Form::open(['route' => ['admin.tag.tag.store'], 'method' => 'post']) !!}
@@ -61,7 +58,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Tag/Resources/views/admin/tags/edit.blade.php b/Modules/Tag/Resources/views/admin/tags/edit.blade.php index 3d8deb6dd..9e24c027c 100644 --- a/Modules/Tag/Resources/views/admin/tags/edit.blade.php +++ b/Modules/Tag/Resources/views/admin/tags/edit.blade.php @@ -11,10 +11,6 @@ @stop -@section('styles') - {!! Theme::script('js/vendor/ckeditor/ckeditor.js') !!} -@stop - @section('content') {!! Form::open(['route' => ['admin.tag.tag.update', $tag->id], 'method' => 'put']) !!}
@@ -62,7 +58,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Tag/Resources/views/admin/tags/index.blade.php b/Modules/Tag/Resources/views/admin/tags/index.blade.php index 876bba18f..41bc6669f 100644 --- a/Modules/Tag/Resources/views/admin/tags/index.blade.php +++ b/Modules/Tag/Resources/views/admin/tags/index.blade.php @@ -83,7 +83,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Tag/Tests/Integration/EloquentTagRepositoryTest.php b/Modules/Tag/Tests/Integration/EloquentTagRepositoryTest.php new file mode 100644 index 000000000..052930d6f --- /dev/null +++ b/Modules/Tag/Tests/Integration/EloquentTagRepositoryTest.php @@ -0,0 +1,146 @@ +tag = app(TagRepository::class); + } + + /** @test */ + public function it_gets_all_tags_for_a_namespace() + { + $this->tag->create([ + 'namespace' => 'asgardcms/media', + 'en' => [ + 'slug' => 'media-tag', + 'name' => 'media tag', + ], + ]); + $this->tag->create([ + 'namespace' => 'asgardcms/media', + 'en' => [ + 'slug' => 'media-tag', + 'name' => 'media tag', + ], + ]); + $this->tag->create([ + 'namespace' => 'asgardcms/blog', + 'en' => [ + 'slug' => 'media-tag', + 'name' => 'media tag', + ], + ]); + + $this->assertCount(1, $this->tag->allForNamespace('asgardcms/blog')); + } + + /** @test */ + public function it_triggers_event_when_tag_was_created() + { + Event::fake(); + + $tag = $this->tag->create([ + 'namespace' => 'asgardcms/media', + 'en' => [ + 'slug' => 'media-tag', + 'name' => 'media tag', + ], + ]); + + Event::assertDispatched(TagWasCreated::class, function ($e) use ($tag) { + return $e->tag->id === $tag->id; + }); + } + + /** @test */ + public function it_triggers_event_when_tag_is_creating() + { + Event::fake(); + + $tag = $this->tag->create([ + 'namespace' => 'asgardcms/media', + 'en' => [ + 'slug' => 'media-tag', + 'name' => 'media tag', + ], + ]); + + Event::assertDispatched(TagIsCreating::class, function ($e) use ($tag) { + return $e->getAttribute('namespace') === $tag->namespace; + }); + } + + /** @test */ + public function it_can_change_data_when_it_is_creating_event() + { + Event::listen(TagIsCreating::class, function (TagIsCreating $event) { + $event->setAttributes(['en' => ['name' => 'MEDIA TAG']]); + }); + + $tag = $this->tag->create([ + 'namespace' => 'asgardcms/media', + 'en' => [ + 'slug' => 'media-tag', + 'name' => 'media tag', + ], + ]); + + $this->assertEquals('MEDIA TAG', $tag->translate('en')->name); + } + + /** @test */ + public function it_triggers_event_when_tag_was_updated() + { + Event::fake(); + + $tag = $this->tag->create([ + 'namespace' => 'asgardcms/media', + 'en' => [ + 'slug' => 'media-tag', + 'name' => 'media tag', + ], + ]); + $this->tag->update($tag, []); + + Event::assertDispatched(TagWasUpdated::class, function ($e) use ($tag) { + return $e->tag->id === $tag->id; + }); + } + + /** @test */ + public function it_can_change_data_when_it_is_updating_event() + { + Event::listen(TagIsUpdating::class, function (TagIsUpdating $event) { + $event->setAttributes(['en' => ['name' => 'MEDIA TAG']]); + }); + + $tag = $this->tag->create([ + 'namespace' => 'asgardcms/media', + 'en' => [ + 'slug' => 'media-tag', + 'name' => 'media tag', + ], + ]); + $this->tag->update($tag, []); + + $this->assertEquals('MEDIA TAG', $tag->translate('en')->name); + } +} diff --git a/Modules/Tag/Tests/Integration/TagRepositoryTest.php b/Modules/Tag/Tests/Integration/TagRepositoryTest.php deleted file mode 100644 index d1af8b52c..000000000 --- a/Modules/Tag/Tests/Integration/TagRepositoryTest.php +++ /dev/null @@ -1,49 +0,0 @@ -tag = app(TagRepository::class); - } - - /** @test */ - public function it_gets_all_tags_for_a_namespace() - { - $this->tag->create([ - 'namespace' => 'asgardcms/media', - 'en' => [ - 'slug' => 'media-tag', - 'name' => 'media tag', - ], - ]); - $this->tag->create([ - 'namespace' => 'asgardcms/media', - 'en' => [ - 'slug' => 'media-tag', - 'name' => 'media tag', - ], - ]); - $this->tag->create([ - 'namespace' => 'asgardcms/blog', - 'en' => [ - 'slug' => 'media-tag', - 'name' => 'media tag', - ], - ]); - - $this->assertCount(1, $this->tag->allForNamespace('asgardcms/blog')); - } -} diff --git a/Modules/Tag/changelog.yml b/Modules/Tag/changelog.yml index 2c854f36a..84097342a 100644 --- a/Modules/Tag/changelog.yml +++ b/Modules/Tag/changelog.yml @@ -1,5 +1,13 @@ url: https://github.com/AsgardCms/Platform versions: + "2.5.0@unreleased": + added: + - Create and trigger events when tags are created and updated + - Trigger event before a tag is created (TagIsCreating) allow data to be changed + - Trigger event before a tag is updated (TagIsUpdating) allow data to be changed + changed: + - Using the @push js stacks over the scripts section + - Using the @push css stacks over the styles section "2.1.0": changed: - Fixed tags not being removed probably on update & delete diff --git a/Modules/Tag/module.json b/Modules/Tag/module.json index 922c3a8a2..15d1644c2 100644 --- a/Modules/Tag/module.json +++ b/Modules/Tag/module.json @@ -7,6 +7,7 @@ "AsgardCMS", "taggable" ], + "version": "2.5.0", "active": 1, "order": 1, "providers": [ diff --git a/Modules/Translation/Resources/views/admin/translations/index.blade.php b/Modules/Translation/Resources/views/admin/translations/index.blade.php index 7eac135c4..701c2c6fc 100644 --- a/Modules/Translation/Resources/views/admin/translations/index.blade.php +++ b/Modules/Translation/Resources/views/admin/translations/index.blade.php @@ -121,7 +121,7 @@ @stop -@section('scripts') +@push('js-stack') has('file')): ?> -@stop +@endpush diff --git a/Modules/Translation/Tests/.gitkeep b/Modules/Translation/Tests/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/Modules/Translation/Tests/BaseTranslationTest.php b/Modules/Translation/Tests/BaseTranslationTest.php new file mode 100644 index 000000000..4503c8050 --- /dev/null +++ b/Modules/Translation/Tests/BaseTranslationTest.php @@ -0,0 +1,64 @@ +resetDatabase(); + } + + protected function getPackageProviders($app) + { + return [ + LaravelModulesServiceProvider::class, + CoreServiceProvider::class, + TranslationServiceProvider::class, + LaravelLocalizationServiceProvider::class, + SidebarServiceProvider::class, + ]; + } + + protected function getPackageAliases($app) + { + return []; + } + + protected function getEnvironmentSetUp($app) + { + $app['path.base'] = __DIR__ . '/..'; + $app['config']->set('database.default', 'sqlite'); + $app['config']->set('database.connections.sqlite', array( + 'driver' => 'sqlite', + 'database' => ':memory:', + 'prefix' => '', + )); + $app['config']->set('translatable.locales', ['en', 'fr']); + } + + private function resetDatabase() + { + // Makes sure the migrations table is created + $this->artisan('migrate', [ + '--database' => 'sqlite', + ]); + // We empty all tables + $this->artisan('migrate:reset', [ + '--database' => 'sqlite', + ]); + // Migrate + $this->artisan('migrate', [ + '--database' => 'sqlite', + ]); + } +} diff --git a/Modules/Translation/Tests/EloquentTranslationRepositoryTest.php b/Modules/Translation/Tests/EloquentTranslationRepositoryTest.php new file mode 100644 index 000000000..f8348ce76 --- /dev/null +++ b/Modules/Translation/Tests/EloquentTranslationRepositoryTest.php @@ -0,0 +1,25 @@ +translation = app(TranslationRepository::class); + } + + /** @test */ + public function it_is_true() + { + $this->assertTrue(true); + } +} diff --git a/Modules/Translation/changelog.yml b/Modules/Translation/changelog.yml index 495183eda..45fa23011 100644 --- a/Modules/Translation/changelog.yml +++ b/Modules/Translation/changelog.yml @@ -1,5 +1,9 @@ url: https://github.com/AsgardCms/Platform versions: + "2.5.0@unreleased": + changed: + - Using the @push js stacks over the scripts section + - Using the @push css stacks over the styles section "2.2.0": changed: - Optimising the checking and loading of module translations (~20% speed increase) diff --git a/Modules/Translation/module.json b/Modules/Translation/module.json index 0eba3c06a..b404548c1 100644 --- a/Modules/Translation/module.json +++ b/Modules/Translation/module.json @@ -2,7 +2,7 @@ "name": "Translation", "alias": "translation", "description": "Module containing all AsgardCms translations", - "version": "2.0.0", + "version": "2.5.0", "keywords": [], "active": 1, "order": 2, diff --git a/Modules/User/Events/RoleIsCreating.php b/Modules/User/Events/RoleIsCreating.php new file mode 100644 index 000000000..7000e32c4 --- /dev/null +++ b/Modules/User/Events/RoleIsCreating.php @@ -0,0 +1,10 @@ +role = $role; + parent::__construct($attributes); + } + + /** + * @return RoleInterface + */ + public function getRole() + { + return $this->role; + } +} diff --git a/Modules/User/Events/RoleWasCreated.php b/Modules/User/Events/RoleWasCreated.php new file mode 100644 index 000000000..1ed5997cb --- /dev/null +++ b/Modules/User/Events/RoleWasCreated.php @@ -0,0 +1,18 @@ +role = $role; + } +} diff --git a/Modules/User/Events/UserIsCreating.php b/Modules/User/Events/UserIsCreating.php index da576daa0..35357b604 100644 --- a/Modules/User/Events/UserIsCreating.php +++ b/Modules/User/Events/UserIsCreating.php @@ -2,33 +2,9 @@ namespace Modules\User\Events; -final class UserIsCreating -{ - /** - * @var array - */ - private $attributes; - public $original; - - public function __construct(array $attributes) - { - $this->attributes = $attributes; - $this->original = $attributes; - } +use Modules\Core\Events\AbstractEntityHook; +use Modules\Core\Contracts\EntityIsChanging; - /** - * @return array - */ - public function getAttributes() - { - return $this->attributes; - } - - /** - * @param array $attributes - */ - public function setAttributes(array $attributes) - { - $this->attributes = array_merge($this->attributes, $attributes); - } +final class UserIsCreating extends AbstractEntityHook implements EntityIsChanging +{ } diff --git a/Modules/User/Events/UserIsUpdating.php b/Modules/User/Events/UserIsUpdating.php index 8560b681c..1b84278af 100644 --- a/Modules/User/Events/UserIsUpdating.php +++ b/Modules/User/Events/UserIsUpdating.php @@ -2,12 +2,28 @@ namespace Modules\User\Events; -class UserIsUpdating +use Modules\Core\Events\AbstractEntityHook; +use Modules\Core\Contracts\EntityIsChanging; +use Modules\User\Entities\UserInterface; + +final class UserIsUpdating extends AbstractEntityHook implements EntityIsChanging { - public $user; + /** + * @var UserInterface + */ + private $user; - public function __construct($user) + public function __construct(UserInterface $user, array $data) { $this->user = $user; + parent::__construct($data); + } + + /** + * @return UserInterface + */ + public function getUser() + { + return $this->user; } } diff --git a/Modules/User/Repositories/Sentinel/SentinelRoleRepository.php b/Modules/User/Repositories/Sentinel/SentinelRoleRepository.php index 7438b04a2..9f42f7cb1 100644 --- a/Modules/User/Repositories/Sentinel/SentinelRoleRepository.php +++ b/Modules/User/Repositories/Sentinel/SentinelRoleRepository.php @@ -3,6 +3,9 @@ namespace Modules\User\Repositories\Sentinel; use Cartalyst\Sentinel\Laravel\Facades\Sentinel; +use Modules\User\Events\RoleIsCreating; +use Modules\User\Events\RoleIsUpdating; +use Modules\User\Events\RoleWasCreated; use Modules\User\Events\RoleWasUpdated; use Modules\User\Repositories\RoleRepository; @@ -33,7 +36,12 @@ public function all() */ public function create($data) { - return $this->role->create($data); + event($event = new RoleIsCreating($data)); + $role = $this->role->create($event->getAttributes()); + + event(new RoleWasCreated($role)); + + return $role; } /** @@ -56,8 +64,9 @@ public function update($id, $data) { $role = $this->role->find($id); - $role->fill($data); + event($event = new RoleIsUpdating($role, $data)); + $role->fill($event->getAttributes()); $role->save(); event(new RoleWasUpdated($role)); diff --git a/Modules/User/Repositories/Sentinel/SentinelUserRepository.php b/Modules/User/Repositories/Sentinel/SentinelUserRepository.php index 963e544f2..ec1ce45de 100644 --- a/Modules/User/Repositories/Sentinel/SentinelUserRepository.php +++ b/Modules/User/Repositories/Sentinel/SentinelUserRepository.php @@ -126,10 +126,9 @@ public function update($user, $data) { $this->checkForNewPassword($data); - $user->fill($data); - - event(new UserIsUpdating($user)); + event($event = new UserIsUpdating($user, $data)); + $user->fill($event->getAttributes()); $user->save(); event(new UserWasUpdated($user)); @@ -152,10 +151,9 @@ public function updateAndSyncRoles($userId, $data, $roles) $this->checkForManualActivation($user, $data); - $user = $user->fill($data); - - event(new UserIsUpdating($user)); + event($event = new UserIsUpdating($user, $data)); + $user->fill($event->getAttributes()); $user->save(); event(new UserWasUpdated($user)); diff --git a/Modules/User/Resources/views/admin/account/api-keys/index.blade.php b/Modules/User/Resources/views/admin/account/api-keys/index.blade.php index 7f5ee08cd..94d6a2bfb 100644 --- a/Modules/User/Resources/views/admin/account/api-keys/index.blade.php +++ b/Modules/User/Resources/views/admin/account/api-keys/index.blade.php @@ -62,7 +62,7 @@ @include('core::partials.delete-modal') @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/User/Resources/views/admin/account/profile/edit.blade.php b/Modules/User/Resources/views/admin/account/profile/edit.blade.php index 450475714..d88ee216e 100644 --- a/Modules/User/Resources/views/admin/account/profile/edit.blade.php +++ b/Modules/User/Resources/views/admin/account/profile/edit.blade.php @@ -62,7 +62,8 @@ @stop @section('shortcuts') @stop -@section('scripts') + +@push('js-stack') -@stop +@endpush diff --git a/Modules/User/Resources/views/admin/roles/create.blade.php b/Modules/User/Resources/views/admin/roles/create.blade.php index 20b2323e5..c8415bedf 100644 --- a/Modules/User/Resources/views/admin/roles/create.blade.php +++ b/Modules/User/Resources/views/admin/roles/create.blade.php @@ -61,7 +61,8 @@
{{ trans('user::roles.navigation.back to index') }}
@stop -@section('scripts') + +@push('js-stack') -@stop +@endpush diff --git a/Modules/User/Resources/views/admin/roles/edit.blade.php b/Modules/User/Resources/views/admin/roles/edit.blade.php index 0ce269891..4e601f428 100644 --- a/Modules/User/Resources/views/admin/roles/edit.blade.php +++ b/Modules/User/Resources/views/admin/roles/edit.blade.php @@ -80,7 +80,8 @@
{{ trans('user::roles.navigation.back to index') }}
@stop -@section('scripts') + +@push('js-stack') -@stop +@endpush diff --git a/Modules/User/Resources/views/admin/roles/index.blade.php b/Modules/User/Resources/views/admin/roles/index.blade.php index 8a3ea5aff..2bd03b028 100644 --- a/Modules/User/Resources/views/admin/roles/index.blade.php +++ b/Modules/User/Resources/views/admin/roles/index.blade.php @@ -82,7 +82,7 @@ @include('core::partials.delete-modal') @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/User/Resources/views/admin/users/create.blade.php b/Modules/User/Resources/views/admin/users/create.blade.php index a21454678..b791f3a3b 100644 --- a/Modules/User/Resources/views/admin/users/create.blade.php +++ b/Modules/User/Resources/views/admin/users/create.blade.php @@ -113,7 +113,8 @@
{{ trans('user::users.navigation.back to index') }}
@stop -@section('scripts') + +@push('js-stack') -@stop +@endpush diff --git a/Modules/User/Resources/views/admin/users/edit.blade.php b/Modules/User/Resources/views/admin/users/edit.blade.php index f976cde2c..750922ef6 100644 --- a/Modules/User/Resources/views/admin/users/edit.blade.php +++ b/Modules/User/Resources/views/admin/users/edit.blade.php @@ -135,7 +135,8 @@ class="flat-blue"
{{ trans('user::users.navigation.back to index') }}
@stop -@section('scripts') + +@push('js-stack') -@stop +@endpush diff --git a/Modules/User/Resources/views/admin/users/index.blade.php b/Modules/User/Resources/views/admin/users/index.blade.php index c3980cced..dfc23e312 100644 --- a/Modules/User/Resources/views/admin/users/index.blade.php +++ b/Modules/User/Resources/views/admin/users/index.blade.php @@ -99,7 +99,7 @@ @include('core::partials.delete-modal') @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/User/Tests/SentinelRoleRepositoryTest.php b/Modules/User/Tests/SentinelRoleRepositoryTest.php index ed54b0dfd..adedc387f 100644 --- a/Modules/User/Tests/SentinelRoleRepositoryTest.php +++ b/Modules/User/Tests/SentinelRoleRepositoryTest.php @@ -3,6 +3,9 @@ namespace Modules\User\Tests; use Illuminate\Support\Facades\Event; +use Modules\User\Events\RoleIsCreating; +use Modules\User\Events\RoleIsUpdating; +use Modules\User\Events\RoleWasCreated; use Modules\User\Events\RoleWasUpdated; use Modules\User\Repositories\RoleRepository; @@ -27,6 +30,42 @@ public function it_creates_a_role() $this->assertCount(1, $this->role->all()); } + /** @test */ + public function it_triggers_event_when_role_was_created() + { + Event::fake(); + + $role = $this->role->create(['name' => 'Admin', 'slug' => 'admin']); + + Event::assertDispatched(RoleWasCreated::class, function ($e) use ($role) { + return $e->role->name === $role->name; + }); + } + + /** @test */ + public function it_triggers_event_when_role_is_creating() + { + Event::fake(); + + $role = $this->role->create(['name' => 'Admin', 'slug' => 'admin']); + + Event::assertDispatched(RoleIsCreating::class, function ($e) use ($role) { + return $e->getAttribute('name') === $role->name; + }); + } + + /** @test */ + public function it_can_change_data_when_it_is_creating_event() + { + Event::listen(RoleIsCreating::class, function (RoleIsCreating $event) { + $event->setAttributes(['name' => 'BETTER']); + }); + + $role = $this->role->create(['name' => 'Admin', 'slug' => 'admin']); + + $this->assertEquals('BETTER', $role->name); + } + /** @test */ public function it_finds_a_role_by_id() { @@ -63,6 +102,32 @@ public function it_triggers_role_updated_event() }); } + /** @test */ + public function it_fires_event_when_role_is_updating() + { + Event::fake(); + + $role = $this->role->create(['name' => 'Admin', 'slug' => 'admin']); + $this->role->update($role->id, ['name' => 'Better Admin']); + + Event::assertDispatched(RoleIsUpdating::class, function ($e) use ($role) { + return $e->getRole()->id === $role->id; + }); + } + + /** @test */ + public function it_can_change_data_before_role_is_updated() + { + Event::listen(RoleIsUpdating::class, function (RoleIsUpdating $event) { + $event->setAttributes(['name' => 'BETTER']); + }); + + $role = $this->role->create(['name' => 'Admin', 'slug' => 'admin']); + $role = $this->role->update($role->id, ['name' => 'Better Admin']); + + $this->assertEquals('BETTER', $role->name); + } + /** @test */ public function it_deletes_a_role() { diff --git a/Modules/User/Tests/SentinelUserRepositoryTest.php b/Modules/User/Tests/SentinelUserRepositoryTest.php index 371daae24..e97ee182d 100644 --- a/Modules/User/Tests/SentinelUserRepositoryTest.php +++ b/Modules/User/Tests/SentinelUserRepositoryTest.php @@ -56,7 +56,7 @@ public function it_fires_event_when_user_is_creating() ]); Event::assertDispatched(UserIsCreating::class, function ($e) use ($user) { - return $e->getAttributes()['email'] === $user->email; + return $e->getAttribute('email') === $user->email; }); } @@ -104,7 +104,7 @@ public function it_makes_sure_the_event_contains_original_attributes() ]); Event::assertDispatched(UserIsCreating::class, function ($e) { - return $e->original['email'] === 'n.widart@gmail.com'; + return $e->getOriginal('email')=== 'n.widart@gmail.com'; }); } @@ -237,10 +237,45 @@ public function it_triggers_events_on_user_update() return $e->user->id === $user->id; }); Event::assertDispatched(UserIsUpdating::class, function ($e) use ($user) { - return $e->user->id === $user->id; + return $e->getUser()->id === $user->id; + }); + } + + /** @test */ + public function it_triggers_event_when_user_is_updating() + { + $user = $this->user->create([ + 'email' => 'n.widart@gmail.com', + 'password' => 'demo1234', + ]); + + Event::fake(); + + $this->user->update($user, ['first_name' => 'John', 'last_name' => 'Doe']); + + Event::assertDispatched(UserIsUpdating::class, function ($e) use ($user) { + return $e->getUser()->id === $user->id && + $e->getAttribute('first_name') === 'John'; }); } + /** @test */ + public function it_can_change_properties_before_update() + { + Event::listen(UserIsUpdating::class, function (UserIsUpdating $event) { + $event->setAttributes(['first_name' => 'Jane']); + }); + + $user = $this->user->create([ + 'email' => 'n.widart@gmail.com', + 'password' => 'demo1234', + ]); + + $this->user->update($user, ['first_name' => 'John', 'last_name' => 'Doe']); + + $this->assertEquals('Jane', $this->user->find(1)->first_name); + } + /** @test */ public function it_updates_user_and_syncs_roles() { @@ -277,10 +312,28 @@ public function it_triggers_event_on_user_update_and_role_sync() return $e->user->id === $user->id; }); Event::assertDispatched(UserIsUpdating::class, function ($e) use ($user) { - return $e->user->id === $user->id; + return $e->getUser()->id === $user->id; }); } + /** @test */ + public function it_can_change_properties_before_update_and_sync_roles() + { + Event::listen(UserIsUpdating::class, function (UserIsUpdating $event) { + $event->setAttributes(['first_name' => 'Jane']); + }); + + $this->createRole('Admin'); + $user = $this->user->createWithRoles([ + 'email' => 'n.widart@gmail.com', + 'password' => 'demo1234', + ], [1]); + + $this->user->updateAndSyncRoles($user->id, ['first_name' => 'John', 'last_name' => 'Doe', 'activated' => 1], [1]); + + $this->assertEquals('Jane', $this->user->find(1)->first_name); + } + /** @test */ public function it_deletes_a_user() { diff --git a/Modules/User/changelog.yml b/Modules/User/changelog.yml index f5f888c72..1db70eeda 100644 --- a/Modules/User/changelog.yml +++ b/Modules/User/changelog.yml @@ -1,5 +1,13 @@ url: https://github.com/AsgardCms/Platform versions: + "2.5.0@unreleased": + added: + - Trigger an event (UserIsUpdating) before a user is updated + - Trigger an event (RoleIsCreating) before a role is created + - Trigger an event (RoleIsUpdating) before a role is updated + changed: + - Using the @push js stacks over the scripts section + - Using the @push css stacks over the styles section "2.4.0": added: - Trigger an event (UserIsCreating) before a user is created, allowing customising its data via listeners diff --git a/Modules/User/module.json b/Modules/User/module.json index 90e857065..e494a98fc 100644 --- a/Modules/User/module.json +++ b/Modules/User/module.json @@ -3,7 +3,7 @@ "alias": "user", "description": "The user module is responsible for managing users and permissions.", "keywords": [], - "version": "2.0.0", + "version": "2.5.0", "active": 1, "order": 1, "providers": [ diff --git a/Modules/Workshop/Resources/views/admin/modules/index.blade.php b/Modules/Workshop/Resources/views/admin/modules/index.blade.php index 0777b7b85..385e91f0b 100644 --- a/Modules/Workshop/Resources/views/admin/modules/index.blade.php +++ b/Modules/Workshop/Resources/views/admin/modules/index.blade.php @@ -10,13 +10,13 @@ @stop -@section('styles') +@push('css-stack') -@stop +@endpush @section('content')
@@ -75,7 +75,7 @@
@stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Workshop/Resources/views/admin/modules/show.blade.php b/Modules/Workshop/Resources/views/admin/modules/show.blade.php index 99a4351b1..89e793ff3 100644 --- a/Modules/Workshop/Resources/views/admin/modules/show.blade.php +++ b/Modules/Workshop/Resources/views/admin/modules/show.blade.php @@ -17,7 +17,7 @@ @stop -@section('styles') +@push('css-stack') -@stop +@endpush @section('content')
@@ -90,7 +90,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Workshop/Resources/views/admin/themes/index.blade.php b/Modules/Workshop/Resources/views/admin/themes/index.blade.php index 3ec9482c8..6dcd9239c 100644 --- a/Modules/Workshop/Resources/views/admin/themes/index.blade.php +++ b/Modules/Workshop/Resources/views/admin/themes/index.blade.php @@ -10,13 +10,13 @@ @stop -@section('styles') +@push('css-stack') -@stop +@endpush @section('content')
@@ -82,7 +82,7 @@
@stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Workshop/Resources/views/admin/themes/show.blade.php b/Modules/Workshop/Resources/views/admin/themes/show.blade.php index 24d2cc12d..670b674c4 100644 --- a/Modules/Workshop/Resources/views/admin/themes/show.blade.php +++ b/Modules/Workshop/Resources/views/admin/themes/show.blade.php @@ -17,7 +17,7 @@ @stop -@section('styles') +@push('css-stack') -@stop +@endpush @section('content')
@@ -95,7 +95,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Workshop/Resources/views/admin/workbench/index.blade.php b/Modules/Workshop/Resources/views/admin/workbench/index.blade.php index 9571c5b63..45f27dda4 100644 --- a/Modules/Workshop/Resources/views/admin/workbench/index.blade.php +++ b/Modules/Workshop/Resources/views/admin/workbench/index.blade.php @@ -35,7 +35,7 @@
@stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Workshop/Scaffold/Module/stubs/create-view.stub b/Modules/Workshop/Scaffold/Module/stubs/create-view.stub index 2cfd4c3ad..3fca93b9b 100644 --- a/Modules/Workshop/Scaffold/Module/stubs/create-view.stub +++ b/Modules/Workshop/Scaffold/Module/stubs/create-view.stub @@ -11,10 +11,6 @@ @stop -@section('styles') - {!! Theme::script('js/vendor/ckeditor/ckeditor.js') !!} -@stop - @section('content') {!! Form::open(['route' => ['admin.$LOWERCASE_MODULE_NAME$.$LOWERCASE_CLASS_NAME$.store'], 'method' => 'post']) !!}
@@ -51,7 +47,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Workshop/Scaffold/Module/stubs/edit-view.stub b/Modules/Workshop/Scaffold/Module/stubs/edit-view.stub index fdab1230e..d2c196887 100644 --- a/Modules/Workshop/Scaffold/Module/stubs/edit-view.stub +++ b/Modules/Workshop/Scaffold/Module/stubs/edit-view.stub @@ -11,10 +11,6 @@ @stop -@section('styles') - {!! Theme::script('js/vendor/ckeditor/ckeditor.js') !!} -@stop - @section('content') {!! Form::open(['route' => ['admin.$LOWERCASE_MODULE_NAME$.$LOWERCASE_CLASS_NAME$.update', $$LOWERCASE_CLASS_NAME$->id], 'method' => 'put']) !!}
@@ -51,7 +47,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Workshop/Scaffold/Module/stubs/index-view.stub b/Modules/Workshop/Scaffold/Module/stubs/index-view.stub index ba59c00cb..0c4712669 100644 --- a/Modules/Workshop/Scaffold/Module/stubs/index-view.stub +++ b/Modules/Workshop/Scaffold/Module/stubs/index-view.stub @@ -79,7 +79,7 @@ @stop -@section('scripts') +@push('js-stack') -@stop +@endpush diff --git a/Modules/Workshop/changelog.yml b/Modules/Workshop/changelog.yml index e2d642add..022ebebe9 100644 --- a/Modules/Workshop/changelog.yml +++ b/Modules/Workshop/changelog.yml @@ -1,5 +1,11 @@ url: https://github.com/AsgardCms/Platform versions: + "2.5.0@unreleased": + changed: + - Using the @push js stacks over the scripts section + - Using the @push css stacks over the styles section + removed: + - Removing ckeditor from the default scaffolded views, now included via EditorIsRendering hook "2.4.0": added: - Add the ability to set custom stubs folder used by generated modules diff --git a/Modules/Workshop/module.json b/Modules/Workshop/module.json index 8e7dabe34..6b686ba70 100644 --- a/Modules/Workshop/module.json +++ b/Modules/Workshop/module.json @@ -4,7 +4,7 @@ "description": "Module used to handle the create of new modules.", "keywords": [ ], - "version": "2.0.0", + "version": "2.5.0", "active": 1, "order": 1, "providers": [ diff --git a/Themes/Adminlte/changelog.yml b/Themes/Adminlte/changelog.yml index aaba5a846..d89c4bf70 100644 --- a/Themes/Adminlte/changelog.yml +++ b/Themes/Adminlte/changelog.yml @@ -1,5 +1,8 @@ url: https://github.com/AsgardCms/Platform versions: + "2.5.0": + added: + - js-stack and css-stack stacks "2.4.0": changed: - Moved to using laravel.mix diff --git a/Themes/Adminlte/theme.json b/Themes/Adminlte/theme.json index e38e4e67f..47e1d65eb 100644 --- a/Themes/Adminlte/theme.json +++ b/Themes/Adminlte/theme.json @@ -2,5 +2,5 @@ "name": "AdminLTE", "description": "This is an administration theme", "type": "backend", - "version": "2.0.0" + "version": "2.5.0" } diff --git a/Themes/Adminlte/views/layouts/master.blade.php b/Themes/Adminlte/views/layouts/master.blade.php index 713a1ee41..1d68b3263 100644 --- a/Themes/Adminlte/views/layouts/master.blade.php +++ b/Themes/Adminlte/views/layouts/master.blade.php @@ -17,6 +17,7 @@ @include('partials.asgard-globals') @section('styles') @show + @stack('css-stack')