diff --git a/app/Events/CreateNewWidget.php b/app/Events/CreateNewWidget.php new file mode 100644 index 00000000..932ff071 --- /dev/null +++ b/app/Events/CreateNewWidget.php @@ -0,0 +1,32 @@ +handler, 'getPresenter']); + + return call_user_func([$presenter, 'renderAddForm'], $widgetType); + } + + /** + * Create new instance of given widget type + * + * @param NewWidgetRequest $request + * @param $type + * + * @return \Illuminate\Http\RedirectResponse + */ + public function postNew(NewWidgetRequest $request, $type) + { + $widgetType = WidgetType::findOrFail($type); + + // create new widget + $widget = new Widget(); + $widget->widget_type_handler = $widgetType->handler; + $widget->user_id = Auth::user()->id; + $widget->name = $request->name; + + // save description if available + if (isset($request->description)) { + $widget->description = $request->description; + } + + // try to save this widget + try { + $widget = call_user_func([$widgetType->handler, 'save'], $widget, $request); + } catch (MissingParameterException $e) { + // user omitted some value + return $this->invalidWidget($type, $e->getMessage()); + } catch (\Exception $e) { + // something went wrong + return $this->invalidWidget($type, trans('admin/widgets.cannotSave', ['exception' => $e->getMessage()])); + } + + // save into database + $widget->save(); + + // redirect with success notification + return redirect() + ->route('widgets.new', ['type' => $type]) + ->with('success', trans('admin/widgets.successfullyCreated')); + } + + private function invalidWidget($widgetType, $error) + { + return redirect() + ->route('widgets.new', ['type' => $widgetType]) + ->withInput() + ->with('error', $error); + } +} diff --git a/app/Http/Requests/NewWidgetRequest.php b/app/Http/Requests/NewWidgetRequest.php new file mode 100644 index 00000000..78ae08cd --- /dev/null +++ b/app/Http/Requests/NewWidgetRequest.php @@ -0,0 +1,18 @@ + 'required' + ]; + } +} diff --git a/app/Listeners/LogNewWidget.php b/app/Listeners/LogNewWidget.php new file mode 100644 index 00000000..84065587 --- /dev/null +++ b/app/Listeners/LogNewWidget.php @@ -0,0 +1,31 @@ +route('upload.overview', trans('admin/mainMenu.uploadedFiles'), [], 150, ['icon' => 'fa fa-files-o']); }, 25, ['icon' => 'fa fa-film']); $menu->dropdown(trans('admin/mainMenu.widgets'), function ($sub) { + // create list of all widget types + $sub->dropdown(trans('admin/mainMenu.newWidget'), function ($sub) { + $i = 1; + foreach (WidgetTypes::getWithTranslations() as $type => $name) { + $sub->route('widgets.new', $name, ['type' => $type], $i++); + } + }, 10, ['icon' => 'fa fa-plus']); + // menu for widget areas $sub->dropdown(trans('admin/mainMenu.widgetAreas'), function ($sub) { $sub->route('widgetareas.new', trans('admin/mainMenu.newWidgetArea'), [], 1, ['icon' => 'fa fa-plus']); diff --git a/database/migrations/2016_02_14_142507_AddIdToWidgetTypes.php b/database/migrations/2016_02_14_142507_AddIdToWidgetTypes.php new file mode 100644 index 00000000..3bf93ff5 --- /dev/null +++ b/database/migrations/2016_02_14_142507_AddIdToWidgetTypes.php @@ -0,0 +1,78 @@ +dropForeign('fk_widget_widget_type1'); + }); + } catch (Exception $e) { + Schema::table('widgets', function (Blueprint $table) { + $table->dropForeign('widgets_widget_type_handler_foreign'); + }); + } + + // try to drop primary key (should be on handler column) + Schema::table('widget_types', function (Blueprint $table) { + $table->dropIndex('PRIMARY'); + }); + + // add new column "id" with autoincrement and make handler unique, not primary + Schema::table('widget_types', function (Blueprint $table) { + $table->integer('id', true) + ->first(); + + $table->string('handler') + ->unique() + ->change(); + }); + + // create foreign constraint active again + Schema::table('widgets', function (Blueprint $table) { + $table->foreign('widget_type_handler') + ->references('handler') + ->on('widget_types') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('widgets', function (Blueprint $table) { + $table->dropForeign('widgets_widget_type_handler_foreign'); + }); + + Schema::table('widget_types', function (Blueprint $table) { + $table->dropColumn('id'); + $table->dropIndex('widget_types_handler_unique'); + $table->string('handler') + ->primary() + ->change(); + }); + // create foreign constraint active again + Schema::table('widgets', function (Blueprint $table) { + $table->foreign('widget_type_handler') + ->references('handler') + ->on('widget_types') + ->onDelete('cascade'); + }); + + } +} diff --git a/resources/lang/en/admin/widgets.php b/resources/lang/en/admin/widgets.php new file mode 100644 index 00000000..f72053eb --- /dev/null +++ b/resources/lang/en/admin/widgets.php @@ -0,0 +1,25 @@ + 'Cannot save widget. Message: :exception', + 'missingValue' => 'You must specify value for field :field', + 'successfullyCreated' => 'Widget successfully created.', + 'successfullyEdited' => 'Widget successfully edited.', + 'noEntries' => 'No widgets available.', + 'overview' => 'List of all widgets', + 'widgetType' => 'Type of widget', + 'name' => 'Name', + 'description' => 'Description', + 'actions' => 'Actions', + 'preview' => 'Widgets preview', + 'createdAt' => 'Created at', + 'updatedAt' => 'Last update', + 'unassociatedWidgets' => 'List of not associated widgets', + 'associate' => 'Add', + 'edit' => 'Edit', + 'deleteAssociation' => 'Remove', + 'associationExists' => 'This widget is already associated with this widget area', + 'successfullyAssociated' => 'Association successfull', + 'associationDoesNotExists' => 'This association does not exist', + 'successfullyDeassociated' => 'Successfully removed from widget area', + +]; \ No newline at end of file diff --git a/resources/lang/en/widgets/htmlCode.php b/resources/lang/en/widgets/htmlCode.php new file mode 100644 index 00000000..5d0ab747 --- /dev/null +++ b/resources/lang/en/widgets/htmlCode.php @@ -0,0 +1,15 @@ + 'HTML code', + 'new' => 'Create new HTML widget', + 'edit' => 'Editing widget :name', + 'containerClass' => 'HTML class used for container of this widget', + 'widgetDescription' => 'Simple widget for inserting html code', + 'name' => 'Name', + 'description' => 'Description', + 'code' => 'HTML code', + 'createNew' => 'Create new HTML code widget', + 'editExisting' => 'Update widget', + 'successfullyEdited' => 'Widget successfully modified', + 'preview' => 'Preview' +]; \ No newline at end of file