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 + +
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')
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']) !!}
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') !!}
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']) !!}
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 @@
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')
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')