diff --git a/app/Enumerations/ActionLogTypes.php b/app/Enumerations/ActionLogTypes.php new file mode 100644 index 00000000..902b2bd2 --- /dev/null +++ b/app/Enumerations/ActionLogTypes.php @@ -0,0 +1,21 @@ +id, $type->name); + } + } +} \ No newline at end of file diff --git a/app/Enumerations/ActionLogTypesForLogger.php b/app/Enumerations/ActionLogTypesForLogger.php new file mode 100644 index 00000000..8566e5f6 --- /dev/null +++ b/app/Enumerations/ActionLogTypesForLogger.php @@ -0,0 +1,16 @@ +string_id, $type->id); + } + } +} \ No newline at end of file diff --git a/app/Enumerations/BaseEnumeration.php b/app/Enumerations/BaseEnumeration.php index 4c23e441..356ac390 100644 --- a/app/Enumerations/BaseEnumeration.php +++ b/app/Enumerations/BaseEnumeration.php @@ -26,6 +26,11 @@ abstract class BaseEnumeration $className::init(); } + // it can happen that even after init no enumerations are available + if (empty(self::$items[$className])) { + self::$items[$className] = []; + } + self::$initiliazed[] = $className; } } diff --git a/app/Enumerations/ContentStatuses.php b/app/Enumerations/ContentStatuses.php new file mode 100644 index 00000000..8ed34f9f --- /dev/null +++ b/app/Enumerations/ContentStatuses.php @@ -0,0 +1,21 @@ + 'admin/contents.status_' . Content::STATUS_DRAFT, + Content::STATUS_DELETED => 'admin/contents.status_' . Content::STATUS_DELETED, + Content::STATUS_PROTECTED => 'admin/contents.status_' . Content::STATUS_PROTECTED, + Content::STATUS_PUBLIC => 'admin/contents.status_' . Content::STATUS_PUBLIC + ]; + + foreach ($roles as $role => $translation) { + self::push($role, $translation); + } + } +} \ No newline at end of file diff --git a/app/Enumerations/Modules.php b/app/Enumerations/Modules.php new file mode 100644 index 00000000..ccc1413c --- /dev/null +++ b/app/Enumerations/Modules.php @@ -0,0 +1,21 @@ +handler, $module->name); + } + } +} \ No newline at end of file diff --git a/app/Events/ChangeSettings.php b/app/Events/ChangeSettings.php new file mode 100644 index 00000000..62452518 --- /dev/null +++ b/app/Events/ChangeSettings.php @@ -0,0 +1,22 @@ +customField = $customField; + } +} diff --git a/app/Events/CreateNewUser.php b/app/Events/CreateNewUser.php new file mode 100644 index 00000000..03743247 --- /dev/null +++ b/app/Events/CreateNewUser.php @@ -0,0 +1,27 @@ +user = $user; + } +} diff --git a/app/Events/DeleteCustomField.php b/app/Events/DeleteCustomField.php new file mode 100644 index 00000000..38d22fa3 --- /dev/null +++ b/app/Events/DeleteCustomField.php @@ -0,0 +1,27 @@ +customField = $customField; + } +} diff --git a/app/Events/EditCustomField.php b/app/Events/EditCustomField.php new file mode 100644 index 00000000..9bb15320 --- /dev/null +++ b/app/Events/EditCustomField.php @@ -0,0 +1,27 @@ +customField = $customField; + } +} diff --git a/app/Events/EditUser.php b/app/Events/EditUser.php new file mode 100644 index 00000000..4d16cc29 --- /dev/null +++ b/app/Events/EditUser.php @@ -0,0 +1,25 @@ +user = $user; + } +} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 53617ef4..9a32465b 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -3,6 +3,7 @@ namespace App\Exceptions; use Exception; +use Illuminate\Session\TokenMismatchException; use Illuminate\Validation\ValidationException; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Database\Eloquent\ModelNotFoundException; @@ -45,6 +46,11 @@ class Handler extends ExceptionHandler */ public function render($request, Exception $e) { + if ($e instanceof TokenMismatchException){ + //redirect to form an example of how I handle mine + return redirect($request->fullUrl())->with('error', trans('validation.csrf')); + } + return parent::render($request, $e); } } diff --git a/app/Handlers/Handler.php b/app/Handlers/Handler.php new file mode 100644 index 00000000..d7d4432e --- /dev/null +++ b/app/Handlers/Handler.php @@ -0,0 +1,39 @@ +save(); + // fire event about creating new custom field + Event::fire(new CreateNewCustomFieldEvent($customField)); + return redirect() ->route('customfields.new') ->with('success', trans('admin/customFields.successfullyCreated')); diff --git a/app/Http/Controllers/Admin/CreateNewUser.php b/app/Http/Controllers/Admin/CreateNewUser.php index 0dce40d5..ce45a036 100644 --- a/app/Http/Controllers/Admin/CreateNewUser.php +++ b/app/Http/Controllers/Admin/CreateNewUser.php @@ -3,11 +3,12 @@ namespace App\Http\Controllers\Admin; use App\Enumerations\UserRoles; +use App\Events\CreateNewUser as CreateNewUserEvent; use App\Http\Controllers\Controller; use App\Http\Requests; use App\Http\Requests\CreateNewUserRequest; use App\Models\User; -use Illuminate\Http\Request; +use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Hash; class CreateNewUser extends Controller @@ -51,6 +52,9 @@ class CreateNewUser extends Controller // store user into database $user->save(); + // fire event + Event::fire(new CreateNewUserEvent($user)); + // refresh page with information about successfull registration return redirect() ->route('users.new') diff --git a/app/Http/Controllers/Admin/EditCustomField.php b/app/Http/Controllers/Admin/EditCustomField.php index a24dc1e9..9591125c 100644 --- a/app/Http/Controllers/Admin/EditCustomField.php +++ b/app/Http/Controllers/Admin/EditCustomField.php @@ -4,10 +4,13 @@ namespace App\Http\Controllers\Admin; use App\Enumerations\CustomFieldResources; use App\Enumerations\CustomFieldTypes; +use App\Events\DeleteCustomField; +use App\Events\EditCustomField as EditCustomFieldEvent; use App\Http\Controllers\Controller; use App\Http\Requests; use App\Http\Requests\EditCustomFieldRequest; use App\Models\CustomField; +use Illuminate\Support\Facades\Event; class EditCustomField extends Controller { @@ -60,6 +63,9 @@ class EditCustomField extends Controller // save changes into database $customField->save(); + // fire event about editing custom field + Event::fire(new EditCustomFieldEvent($customField)); + return redirect() ->route('customfields.edit', ['id' => $id]) ->with('success', trans('admin/customFields.successfullyEdited')); @@ -89,6 +95,9 @@ class EditCustomField extends Controller // delete item $field->delete(); + // fire event about editing custom field + Event::fire(new DeleteCustomField($field)); + // redirect back to overview return redirect() ->route('customfields.overview') diff --git a/app/Http/Controllers/Admin/EditUser.php b/app/Http/Controllers/Admin/EditUser.php index 9acb5450..054df9e4 100644 --- a/app/Http/Controllers/Admin/EditUser.php +++ b/app/Http/Controllers/Admin/EditUser.php @@ -4,11 +4,13 @@ namespace App\Http\Controllers\Admin; use App\Enumerations\UserRoles; use App\Enumerations\UserStates; +use App\Events\EditUser as EditUserEvent; use App\Http\Controllers\Controller; use App\Http\Requests; use App\Http\Requests\EditUserRequest; use App\Models\User; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Hash; class EditUser extends Controller @@ -81,6 +83,9 @@ class EditUser extends Controller $user->save(); + // fire event about editing user + Event::fire(new EditUserEvent($user)); + return redirect() ->route('users.detail', ['id' => $id]) ->with('success', trans('admin/userManagement.userSuccessfullyEdited')); diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index b7665925..ab84a479 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -29,6 +29,7 @@ class Kernel extends HttpKernel \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, + \App\Http\Middleware\ModuleRegistrator::class ], 'api' => [ @@ -45,6 +46,7 @@ class Kernel extends HttpKernel */ protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, + 'onlyAdmin' => \App\Http\Middleware\RequireAdminRole::class, // 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, diff --git a/app/Http/Middleware/ModuleRegistrator.php b/app/Http/Middleware/ModuleRegistrator.php new file mode 100644 index 00000000..8d2071af --- /dev/null +++ b/app/Http/Middleware/ModuleRegistrator.php @@ -0,0 +1,33 @@ + $module) { + $handler = config($module->getName() . '.handler'); + + // try to register menus + if (method_exists($handler, 'registerAdminMenu') && \Auth::check()) { + call_user_func([$handler, 'registerAdminMenu'], \Auth::user()); + } + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/RequireAdminRole.php b/app/Http/Middleware/RequireAdminRole.php new file mode 100644 index 00000000..f0ea40b1 --- /dev/null +++ b/app/Http/Middleware/RequireAdminRole.php @@ -0,0 +1,28 @@ +role != User::ROLE_ADMIN) { + return redirect() + ->back() + ->with('error', trans('auth.accessDenied')); + } + + return $next($request); + } +} diff --git a/app/Http/routes.php b/app/Http/routes.php index e0582b89..763d8c64 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -28,22 +28,55 @@ Route::group([ 'prefix' => 'admin' ], function () { + // these routes are available only for user with role admin + Route::group(['middleware' => 'onlyAdmin'], function () { + // display form for creating new user + Route::get('users/new', 'CreateNewUser@getNewUser') + ->name('users.new'); + + // POST methods + // display form for creating new user + Route::post('users/new', 'CreateNewUser@postRegistration') + ->name('users.newPost'); + + // display form for edit of existing user + Route::get('users/edit/{id}', 'EditUser@getEditExistingUser') + ->name('users.edit'); + + // form for adding new custom field + Route::get('customfields/new', 'CreateNewCustomField@getNew') + ->name('customfields.new'); + + // form for editing custom field + Route::get('customfields/edit/{id}', 'EditCustomField@getEditCustomField') + ->name('customfields.edit'); + + // form for adding new custom field + Route::post('customfields/new', 'CreateNewCustomField@postNew') + ->name('customfields.newPost'); + + // form for editing custom field + Route::post('customfields/edit/{id}', 'EditCustomField@postEditCustomField') + ->name('customfields.editPost'); + + Route::get('customfields/delete/{id}', 'EditCustomField@deleteCustomField') + ->name('customfields.delete'); + }); + + // these routes are available for all logged (authenticated) users + // display dashboard with some usefull information Route::get('/', 'Dashboard@getIndex') ->name('admin.dashboard'); - // display form for creating new user - Route::get('users/new', 'CreateNewUser@getNewUser') - ->name('users.new'); - - // display form for edit of existing user - Route::get('users/edit/{id}', 'EditUser@getEditExistingUser') - ->name('users.edit'); - // display user detail in admin Route::get('users/detail/{id?}', 'UserDetail@getDetail') ->name('users.detail'); + // method for saving edited data of user + Route::post('users/edit/{id}', 'EditUser@postEdit') + ->name('users.editPost'); + // display list of all users registered into our system Route::get('users/overview/{state?}/{perPage?}', 'UsersOverview@getOverview') ->name('users.overview'); @@ -55,25 +88,6 @@ Route::group([ Route::get('customfields/overview', 'CustomFieldsOverview@getOverview') ->name('customfields.overview'); - // form for adding new custom field - Route::get('customfields/new', 'CreateNewCustomField@getNew') - ->name('customfields.new'); - - // form for editing custom field - Route::get('customfields/edit/{id}', 'EditCustomField@getEditCustomField') - ->name('customfields.edit'); - - // form for adding new custom field - Route::post('customfields/new', 'CreateNewCustomField@postNew') - ->name('customfields.newPost'); - - // form for editing custom field - Route::post('customfields/edit/{id}', 'EditCustomField@postEditCustomField') - ->name('customfields.editPost'); - - Route::get('customfields/delete/{id}', 'EditCustomField@deleteCustomField') - ->name('customfields.delete'); - // logout method Route::get('logout', function () { @@ -84,14 +98,6 @@ Route::group([ return redirect() ->route('login') ->with('success', trans('admin/common.logoutSuccessfull')); - })->name('logout'); - - // POST methods - // display form for creating new user - Route::post('users/new', 'CreateNewUser@postRegistration') - ->name('users.newPost'); - - // method for saving edited data of user - Route::post('users/edit/{id}', 'EditUser@postEdit') - ->name('users.editPost'); + }) + ->name('logout'); }); diff --git a/app/Listeners/LogChangeSettings.php b/app/Listeners/LogChangeSettings.php new file mode 100644 index 00000000..85969150 --- /dev/null +++ b/app/Listeners/LogChangeSettings.php @@ -0,0 +1,33 @@ +saveLog($parameters); + } + + /** + * Getter for action name. Used only internally + * + * @return mixed + */ + protected function getName() + { + return 'changeSettings'; + } +} diff --git a/app/Listeners/LogCreateCustomField.php b/app/Listeners/LogCreateCustomField.php new file mode 100644 index 00000000..5cd7c5f3 --- /dev/null +++ b/app/Listeners/LogCreateCustomField.php @@ -0,0 +1,37 @@ + $event->customField->id, + 'name' => $event->customField->name + ]; + + $this->saveLog($parameters); + } + + /** + * Getter for action name. Used only internally + * + * @return mixed + */ + protected function getName() + { + return 'newCustomField'; + } +} diff --git a/app/Listeners/LogCreatedUser.php b/app/Listeners/LogCreatedUser.php new file mode 100644 index 00000000..9da573ec --- /dev/null +++ b/app/Listeners/LogCreatedUser.php @@ -0,0 +1,36 @@ + $event->user->id, + 'name' => $event->user->name, + 'email' => $event->user->email + ]; + + $this->saveLog($parameters); + } + + /** + * Getter for action name. Used only internally + * + * @return mixed + */ + protected function getName() + { + return 'createUser'; + } +} diff --git a/app/Listeners/LogDeleteField.php b/app/Listeners/LogDeleteField.php new file mode 100644 index 00000000..07703ac5 --- /dev/null +++ b/app/Listeners/LogDeleteField.php @@ -0,0 +1,36 @@ + $event->customField->id, + 'name' => $event->customField->name + ]; + + $this->saveLog($parameters); + } + + /** + * Getter for action name. Used only internally + * + * @return mixed + */ + protected function getName() + { + return 'deleteCustomField'; + } +} diff --git a/app/Listeners/LogEditCustomField.php b/app/Listeners/LogEditCustomField.php new file mode 100644 index 00000000..b28b0055 --- /dev/null +++ b/app/Listeners/LogEditCustomField.php @@ -0,0 +1,36 @@ + $event->customField->id, + 'name' => $event->customField->name + ]; + + $this->saveLog($parameters); + } + + /** + * Getter for action name. Used only internally + * + * @return mixed + */ + protected function getName() + { + return 'editCustomField'; + } +} diff --git a/app/Listeners/LogEditUser.php b/app/Listeners/LogEditUser.php new file mode 100644 index 00000000..c656e4ee --- /dev/null +++ b/app/Listeners/LogEditUser.php @@ -0,0 +1,37 @@ + $event->user->id, + 'name' => $event->user->name, + 'email' => $event->user->email + ]; + + $this->saveLog($parameters); + } + + /** + * Getter for action name. Used only internally + * + * @return mixed + */ + protected function getName() + { + return 'userEdit'; + } +} diff --git a/app/Listeners/LogLogin.php b/app/Listeners/LogLogin.php new file mode 100644 index 00000000..4e2cecc5 --- /dev/null +++ b/app/Listeners/LogLogin.php @@ -0,0 +1,36 @@ + $event->user->id, + 'name' => $event->user->name, + 'email' => $event->user->email + ]; + + $this->saveLog($parameters); + } + + /** + * Getter for action name. Used only internally + * + * @return mixed + */ + protected function getName() + { + return 'login'; + } +} diff --git a/app/Listeners/LogLogout.php b/app/Listeners/LogLogout.php new file mode 100644 index 00000000..7aeefce3 --- /dev/null +++ b/app/Listeners/LogLogout.php @@ -0,0 +1,37 @@ + $event->user->id, + 'name' => $event->user->name, + 'email' => $event->user->email + ]; + + $this->saveLog($parameters); + } + + /** + * Getter for action name. Used only internally + * + * @return mixed + */ + protected function getName() + { + return 'logout'; + } +} diff --git a/app/Listeners/Logger.php b/app/Listeners/Logger.php new file mode 100644 index 00000000..e1b75628 --- /dev/null +++ b/app/Listeners/Logger.php @@ -0,0 +1,74 @@ +actionTypes = ActionLogTypesForLogger::getWithTranslations(); + } + + /** + * Shortcut for loging events + * + * @param array $parameters + */ + protected function saveLog($parameters = []) + { + // try to translate string id into integer id + $typeId = $this->getTypeId(); + + // is user logged in and exists given type? + if (!Auth::check() || is_null($typeId)) { + return; + } + + // get user id + $userId = Auth::user()->id; + + // setup object for insertion + $data = [ + 'user_id' => $userId, + 'type_id' => $typeId, + 'parameters' => json_encode((array)$parameters) + ]; + + // create new logged event + ActionLog::create($data); + } + + /** + * Translate string id to integer id + * + * @return int|null ID of action type when exists, null otherwise + */ + private function getTypeId() + { + $name = $this->getName(); + if (!isset($this->actionTypes[$name])) { + return null; + } + + return $this->actionTypes[$name]; + } + + /** + * Getter for action name. Used only internally + * + * @return mixed + */ + abstract protected function getName(); +} diff --git a/app/Models/ActionLog.php b/app/Models/ActionLog.php index 8b95d4b6..809a43b7 100644 --- a/app/Models/ActionLog.php +++ b/app/Models/ActionLog.php @@ -9,8 +9,9 @@ use Illuminate\Database\Eloquent\Model; */ class ActionLog extends Model { + protected $table = 'action_log'; - public $timestamps = true; + public $timestamps = false; protected $fillable = [ 'type_id', diff --git a/app/Models/ActionLogType.php b/app/Models/ActionLogType.php index 420e4d70..a7a0570f 100644 --- a/app/Models/ActionLogType.php +++ b/app/Models/ActionLogType.php @@ -14,6 +14,7 @@ class ActionLogType extends Model protected $fillable = [ 'name', + 'string_id', 'value' ]; diff --git a/app/Models/Content.php b/app/Models/Content.php index 908ed8e0..b86249cc 100644 --- a/app/Models/Content.php +++ b/app/Models/Content.php @@ -3,15 +3,14 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Facades\DB; /** * Class Content */ class Content extends Model { - public $timestamps = true; - protected $fillable = [ 'user_id', 'module_handler', @@ -26,8 +25,102 @@ class Content extends Model 'module_settings', 'status' ]; - protected $guarded = []; + const STATUS_DELETED = 'deleted'; + const STATUS_DRAFT = 'draft'; + const STATUS_PROTECTED = 'protected'; + const STATUS_PUBLIC = 'public'; - + /** + * Getter for overview of all content pages of given handler (module type) + * + * @param $handler + * @param bool $joinAuthor + * + */ + public function getByType($handler, $joinAuthor = false) + { + $query = DB::table('contents') + ->select('contents.*') + ->where('contents.status', '<>', self::STATUS_DELETED) + ->where('module_handler', $handler) + ->orderBy('created_at'); + + // join user email and user name to results when needed + if ($joinAuthor) { + $query = $query->join('users', 'users.id', '=', 'contents.user_id') + ->select('contents.*', 'users.name AS author_name', 'users.email AS author_email'); + } + + return $query; + } + + /** + * Updates current model with information about changed columns + * + * @param array $fields + * @param array $request + * + * @return int number of changed columns + */ + public function updateWithHistory(array $fields, array $request) + { + $editBatch = uniqid(); + $changed = 0; + + foreach ($fields as $fieldDB => $fieldRequest) { + // ignore non-existing fields + if (!isset($this->$fieldDB) || !isset($request[$fieldRequest])) { + continue; + } + + // remove any whitespaces around real content + $request[$fieldRequest] = trim($request[$fieldRequest]); + + if ($this->$fieldDB != $request[$fieldRequest]) { + + // setup history object + $history = [ + 'user_id' => \Auth::user()->id, + 'content_id' => $this->id, + 'edit_batch' => $editBatch, + 'column' => $fieldRequest, + 'old_value' => $this->$fieldDB, + 'new_value' => $request[$fieldRequest] + ]; + + // save history + ContentHistory::create($history); + + // save change into database + $this->$fieldDB = $request[$fieldRequest]; + + $changed++; + } + } + + $this->save(); + + return [$editBatch, $changed]; + } + + /** + * Mark relationship with its historical records + * + * @return \Illuminate\Database\Eloquent\Relations\HasMany + */ + public function history() + { + return $this->hasMany('App\Models\ContentHistory'); + } + + /** + * Mark relationship with users table + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function author() + { + return $this->belongsTo('App\Models\User', 'user_id'); + } } \ No newline at end of file diff --git a/app/Models/ContentHistory.php b/app/Models/ContentHistory.php index e919aa4b..9c6e7ada 100644 --- a/app/Models/ContentHistory.php +++ b/app/Models/ContentHistory.php @@ -9,13 +9,14 @@ use Illuminate\Database\Eloquent\Model; */ class ContentHistory extends Model { + protected $table = 'content_history'; - public $timestamps = true; + // this table does not have created_at and updated_at fields + public $timestamps = false; protected $fillable = [ 'user_id', 'content_id', - 'changed_at', 'edit_batch', 'column', 'new_value', diff --git a/app/Models/Module.php b/app/Models/Module.php index 9716fd28..0ba1491d 100644 --- a/app/Models/Module.php +++ b/app/Models/Module.php @@ -10,7 +10,7 @@ use Illuminate\Database\Eloquent\Model; class Module extends Model { - public $timestamps = true; + public $timestamps = false; protected $fillable = [ 'handler', diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 58ce9624..24f304ae 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -13,8 +13,30 @@ class EventServiceProvider extends ServiceProvider * @var array */ protected $listen = [ - 'App\Events\SomeEvent' => [ - 'App\Listeners\EventListener', + 'App\Events\CreateNewUser' => [ + 'App\Listeners\LogCreatedUser', + ], + 'App\Events\EditUser' => [ + 'App\Listeners\LogEditUser', + ], + 'App\Events\CreateNewCustomField' => [ + 'App\Listeners\LogCreateCustomField', + ], + 'App\Events\EditCustomField' => [ + 'App\Listeners\LogEditCustomField', + ], + 'App\Events\DeleteCustomField' => [ + 'App\Listeners\LogDeleteField', + ], + 'App\Events\ChangeSettings' => [ + 'App\Listeners\LogChangeSettings', + ], + // internal Laravel events - should work as auth.login and auth.logout, however it doesn't... + 'Illuminate\Auth\Events\Login' => [ + 'App\Listeners\LogLogin' + ], + 'Illuminate\Auth\Events\Logout' => [ + 'App\Listeners\LogLogout' ], ]; diff --git a/config/app.php b/config/app.php index 0d4c5cc6..0fd1d264 100644 --- a/config/app.php +++ b/config/app.php @@ -182,6 +182,7 @@ return [ 'Log' => Illuminate\Support\Facades\Log::class, 'Mail' => Illuminate\Support\Facades\Mail::class, 'Menu' => Pingpong\Menus\MenuFacade::class, + 'Module' => Pingpong\Modules\Facades\Module::class, 'Password' => Illuminate\Support\Facades\Password::class, 'Queue' => Illuminate\Support\Facades\Queue::class, 'Redirect' => Illuminate\Support\Facades\Redirect::class, diff --git a/config/staticpages.php b/config/staticpages.php new file mode 100644 index 00000000..d3434db4 --- /dev/null +++ b/config/staticpages.php @@ -0,0 +1,6 @@ + 'StaticPages', + 'handler' => '\\Modules\\StaticPages\\Handlers\\StaticPage' +]; \ No newline at end of file diff --git a/database/migrations/2016_01_28_213204_AddStringIdForActionTypes.php b/database/migrations/2016_01_28_213204_AddStringIdForActionTypes.php new file mode 100644 index 00000000..bb02c3cc --- /dev/null +++ b/database/migrations/2016_01_28_213204_AddStringIdForActionTypes.php @@ -0,0 +1,33 @@ +string('string_id', 64) + ->after('id') + ->unique()->comment = 'String ID used for better readability in loggers'; + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('action_log_types', function (Blueprint $table) { + $table->dropColumn('string_id'); + }); + } +} diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php index 27d1d43e..9d64c78a 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeds/DatabaseSeeder.php @@ -14,5 +14,6 @@ class DatabaseSeeder extends Seeder // fill up custom field types $this->call(SeedCustomFieldTypes::class); $this->call(SeedCustomFieldResources::class); + $this->call(SeedActionLogTypes::class); } } \ No newline at end of file diff --git a/database/seeds/SeedActionLogTypes.php b/database/seeds/SeedActionLogTypes.php new file mode 100644 index 00000000..126faaa6 --- /dev/null +++ b/database/seeds/SeedActionLogTypes.php @@ -0,0 +1,34 @@ +insert([ + 'string_id' => $type, + 'name' => 'admin/actionLog.name' . ucfirst($type), + 'value' => 'admin/actionLog.' . $type + ]); + } + } +} diff --git a/modules/StaticPages/Config/config.php b/modules/StaticPages/Config/config.php index 9db5d1a7..d3434db4 100644 --- a/modules/StaticPages/Config/config.php +++ b/modules/StaticPages/Config/config.php @@ -1,5 +1,6 @@ 'StaticPages' + 'name' => 'StaticPages', + 'handler' => '\\Modules\\StaticPages\\Handlers\\StaticPage' ]; \ No newline at end of file diff --git a/modules/StaticPages/Events/CreateNewStaticPage.php b/modules/StaticPages/Events/CreateNewStaticPage.php new file mode 100644 index 00000000..72b2ec7f --- /dev/null +++ b/modules/StaticPages/Events/CreateNewStaticPage.php @@ -0,0 +1,25 @@ +page = $page; + } +} \ No newline at end of file diff --git a/modules/StaticPages/Events/DeleteStaticPage.php b/modules/StaticPages/Events/DeleteStaticPage.php new file mode 100644 index 00000000..4df44630 --- /dev/null +++ b/modules/StaticPages/Events/DeleteStaticPage.php @@ -0,0 +1,27 @@ +page = $page; + $this->revision = $revision; + } +} \ No newline at end of file diff --git a/modules/StaticPages/Events/EditStaticPage.php b/modules/StaticPages/Events/EditStaticPage.php new file mode 100644 index 00000000..ebfc4f29 --- /dev/null +++ b/modules/StaticPages/Events/EditStaticPage.php @@ -0,0 +1,28 @@ +page = $page; + $this->revision = $revision; + } +} \ No newline at end of file diff --git a/modules/StaticPages/Events/MakeDraftFromStaticPage.php b/modules/StaticPages/Events/MakeDraftFromStaticPage.php new file mode 100644 index 00000000..fabed846 --- /dev/null +++ b/modules/StaticPages/Events/MakeDraftFromStaticPage.php @@ -0,0 +1,28 @@ +page = $page; + $this->revision = $revision; + } +} \ No newline at end of file diff --git a/modules/StaticPages/Events/PublishStaticPage.php b/modules/StaticPages/Events/PublishStaticPage.php new file mode 100644 index 00000000..8e1b6109 --- /dev/null +++ b/modules/StaticPages/Events/PublishStaticPage.php @@ -0,0 +1,29 @@ +page = $page; + $this->revision = $revision; + } +} \ No newline at end of file diff --git a/modules/StaticPages/Handlers/StaticPage.php b/modules/StaticPages/Handlers/StaticPage.php new file mode 100644 index 00000000..8bfe0542 --- /dev/null +++ b/modules/StaticPages/Handlers/StaticPage.php @@ -0,0 +1,36 @@ +dropdown(trans('staticpages::adminMenu.staticPages'), function ($submenu) use ($user) { + if ($user->role == User::ROLE_ADMIN) { + $submenu->route('staticpage.new', trans('staticpages::adminMenu.new')); + } + $submenu->route('staticpage.overview', trans('staticpages::adminMenu.overview')); + }, 15, ['icon' => 'fa fa-newspaper-o']); + } + + /** + * Render given module into visitor area. + * + * @param Content $content DB model from table contents + * @param array $parameters parameters used for modifications/custom settings of given model + * + * @return mixed + */ + public function render(Content $content, $parameters) + { + // TODO: Implement render() method. + } +} \ No newline at end of file diff --git a/modules/StaticPages/Http/Controllers/Admin/CreateNewStaticPage.php b/modules/StaticPages/Http/Controllers/Admin/CreateNewStaticPage.php index da6a4c43..75a6fb05 100644 --- a/modules/StaticPages/Http/Controllers/Admin/CreateNewStaticPage.php +++ b/modules/StaticPages/Http/Controllers/Admin/CreateNewStaticPage.php @@ -1,10 +1,60 @@ $statuses, + 'selectedStatus' => Content::STATUS_DRAFT + ]); + } + + /** + * Save new static page + * + * @param CreateNewStaticPageRequest $request + * + * @return \Illuminate\Http\RedirectResponse + */ + public function postNew(CreateNewStaticPageRequest $request) + { + $page = new Content(); + + $page->user_id = \Auth::user()->id; + $page->title = $request->title; + $page->url = $request->url; + $page->published_from = $request->publishedFrom; + $page->published_to = $request->publishedTo; + $page->meta_keywords = $request->meta_description; + $page->meta_description = $request->meta_description; + $page->content = $request->pageContent; + $page->status = $request->status; + $page->module_handler = config('staticpages.handler'); + + $page->save(); + + Event::fire(new \Modules\StaticPages\Events\CreateNewStaticPage($page)); + + return redirect() + ->route('staticpage.new') + ->with('success', trans('staticpages::admin.successfullyCreated')); } } \ No newline at end of file diff --git a/modules/StaticPages/Http/Controllers/Admin/EditStaticPage.php b/modules/StaticPages/Http/Controllers/Admin/EditStaticPage.php index e5d86fc0..412be1dd 100644 --- a/modules/StaticPages/Http/Controllers/Admin/EditStaticPage.php +++ b/modules/StaticPages/Http/Controllers/Admin/EditStaticPage.php @@ -1,10 +1,189 @@ findOrFail($id); + + // render view + return view('staticpages::admin.edit', [ + 'contentStatuses' => $statuses, + 'page' => $page + ]); + } + + /** + * Edit static page and save changes into history. + * + * @param EditStaticPageRequest $request + * @param $id + * + * @return \Illuminate\Http\RedirectResponse + */ + public function postEdit(EditStaticPageRequest $request, $id) + { + try { + $page = Content::where('module_handler', config('staticpages.handler')) + ->findOrFail($id); + } catch (NotFoundHttpException $e) { + + // page for editing not found + return redirect() + ->route('staticpage.overview') + ->with('error', trans('staticpages::admin.invalidPage')); + } + + // array of fields in database and fields from request + $fields = [ + 'title' => 'title', + 'url' => 'url', + 'published_from' => 'publishedFrom', + 'published_to' => 'publishedTo', + 'meta_keywords' => 'metaKeywords', + 'meta_description' => 'metaDescription', + 'content' => 'pageContent', + 'status' => 'status' + ]; + + // save new values with history + list($revision, $changedColumns) = $page->updateWithHistory($fields, $request->all()); + + // was something changed? + if ($changedColumns == 0) { + return redirect() + ->route('staticpage.edit', ['id' => $page->id]) + ->with('error', trans('staticpages::admin.nothingToEdit')); + } + + // fire event with + Event::fire(new EditStaticPageEvent($page, $revision)); + + // something was changed, inform user + return redirect() + ->route('staticpage.edit', ['id' => $page->id]) + ->with('success', trans('staticpages::admin.successfullyEdited')); + } + + /** + * Method for changing page status + * + * This method is called in static page overview from quick actions. It checks if status is valid, if page exists + * and updates status. + * + * @param $id + * @param $status + * + * @return \Illuminate\Http\RedirectResponse + */ + public function changeStatus($id, $status) + { + // get possible statuses + $statuses = ContentStatuses::getWithTranslations(); + unset($statuses[Content::STATUS_DELETED]); + + // check if given status is valid + if (!isset($statuses[$status])) { + return redirect() + ->route('staticpage.overview') + ->with('error', trans('staticpages::admin.invalidStatus')); + } + + try { + // try to find this page + $page = Content::where('module_handler', config('staticpages.handler')) + ->findOrFail($id); + } catch (NotFoundHttpException $e) { + // page not found + return redirect() + ->route('staticpage.overview') + ->with('error', trans('staticpages::admin.invalidPage')); + } + + // try to change the page + list ($revision, $changedColumns) = $page->updateWithHistory(['status' => 'status'], ['status' => $status]); + + // was something changed? + if ($changedColumns == 0) { + return redirect() + ->route('staticpage.edit', ['id' => $page->id]) + ->with('error', trans('staticpages::admin.nothingToEdit')); + } + + // fire events + if ($status != Content::STATUS_DRAFT) { + Event::fire(new PublishStaticPage($page, $revision)); + } else { + Event::fire(new MakeDraftFromStaticPage($page, $revision)); + } + + // redirect back to overview with info for user + return redirect() + ->route('staticpage.overview') + ->with('success', trans('staticpages::admin.statusChanged')); + } + + /** + * Delete page + * + * @param $id + * + * @return \Illuminate\Http\RedirectResponse + */ + public function deletePage($id) + { + try { + // try to find this page + $page = Content::where('module_handler', config('staticpages.handler')) + ->findOrFail($id); + } catch (NotFoundHttpException $e) { + // page not found + return redirect() + ->route('staticpage.overview') + ->with('error', trans('staticpages::admin.invalidPage')); + } + + list ($revision, $changedColumns) = $page->updateWithHistory(['status' => 'status'], ['status' => Content::STATUS_DELETED]); + + // was something changed? + if ($changedColumns == 0) { + return redirect() + ->route('staticpage.edit', ['id' => $page->id]) + ->with('error', trans('staticpages::admin.nothingToEdit')); + } + + // trigger delete event + Event::fire(new DeleteStaticPage($page, $revision)); + + // redirect back to overview with info for user + return redirect() + ->route('staticpage.overview') + ->with('success', trans('staticpages::admin.pageDeleted', [ + 'name' => $page->title, + 'url' => $page->url + ])); } } \ No newline at end of file diff --git a/modules/StaticPages/Http/Controllers/Admin/StaticPageOverview.php b/modules/StaticPages/Http/Controllers/Admin/StaticPageOverview.php index bd833785..3abc63f6 100644 --- a/modules/StaticPages/Http/Controllers/Admin/StaticPageOverview.php +++ b/modules/StaticPages/Http/Controllers/Admin/StaticPageOverview.php @@ -1,11 +1,22 @@ getByType(config('staticpages.handler'), true); + + // add filtering by status + if (!is_null($status) && in_array($status, ContentStatuses::getSimple())) { + $pages = $pages->where('status', $status); + } + $pages = $pages->paginate($perPage); + + return view('staticpages::admin.overview', ['pages' => $pages]); } } \ No newline at end of file diff --git a/modules/StaticPages/Http/Requests/CreateNewStaticPageRequest.php b/modules/StaticPages/Http/Requests/CreateNewStaticPageRequest.php new file mode 100644 index 00000000..6db5f5d7 --- /dev/null +++ b/modules/StaticPages/Http/Requests/CreateNewStaticPageRequest.php @@ -0,0 +1,25 @@ + 'required', + 'url' => 'required|unique:contents,url', + 'published_from' => 'date', + 'published_to' => 'date', + 'title_photo' => 'exists:files,id', + 'module_settings' => 'json', + 'status' => 'required|in:draft,protected,public' + ]; + } +} diff --git a/modules/StaticPages/Http/Requests/EditStaticPageRequest.php b/modules/StaticPages/Http/Requests/EditStaticPageRequest.php new file mode 100644 index 00000000..bf5523ba --- /dev/null +++ b/modules/StaticPages/Http/Requests/EditStaticPageRequest.php @@ -0,0 +1,29 @@ + 'required', + 'url' => 'required|unique:contents,url,'.$this->id, + 'published_from' => 'date', + 'published_to' => 'date', + 'title_photo' => 'exists:files,id', + 'status' => 'required|in:'.$statuses + ]; + } +} diff --git a/modules/StaticPages/Http/routes.php b/modules/StaticPages/Http/routes.php index 70629721..b0adb65b 100644 --- a/modules/StaticPages/Http/routes.php +++ b/modules/StaticPages/Http/routes.php @@ -8,17 +8,47 @@ Route::group([ Route::get('/{url}', 'StaticPagesController@index'); }); - // routes group for admin area Route::group([ 'middleware' => ['web', 'auth'], 'prefix' => 'admin/pages', 'namespace' => 'Modules\StaticPages\Http\Controllers\Admin' ], function () { + + // list of all static pages Route::get('overview', 'StaticPageOverview@getOverview') ->name('staticpage.overview'); + + // form for creating new static page Route::get('new', 'CreateNewStaticPage@getNew') ->name('staticpage.new'); + + // form for editing existing static page Route::get('edit/{id}', 'EditStaticPage@getEdit') ->name('staticpage.edit'); + + // post method for creating new static page + Route::post('new', 'CreateNewStaticPage@postNew') + ->name('staticpage.newPost'); + + // post method for creating new static page + Route::post('edit/{id}', 'EditStaticPage@postEdit') + ->name('staticpage.editPost'); + + // routes for quick actions + + // change status of page (protected, public or draft) + Route::get('status/{id}/{status}', 'EditStaticPage@changeStatus') + ->name('staticpage.changeStatus'); + + + // delete page + Route::get('delete/{id}', 'EditStaticPage@deletePage') + ->name('staticpage.delete'); + + // display change history of given page + // Route::get('history/{id}', 'StaticPageHistory@getHistory')->name('staticpage.history'); + + + // Route::get('', '')->name('staticpage.'); }); \ No newline at end of file diff --git a/modules/StaticPages/Listeners/LogCreateNewStaticPage.php b/modules/StaticPages/Listeners/LogCreateNewStaticPage.php new file mode 100644 index 00000000..f85c7a1f --- /dev/null +++ b/modules/StaticPages/Listeners/LogCreateNewStaticPage.php @@ -0,0 +1,27 @@ + $event->page->id, + 'url' => $event->page->url, + 'title' => $event->page->title + ]; + + $this->saveLog($parameters); + } +} diff --git a/modules/StaticPages/Listeners/LogDeleteStaticPage.php b/modules/StaticPages/Listeners/LogDeleteStaticPage.php new file mode 100644 index 00000000..ee2b09ec --- /dev/null +++ b/modules/StaticPages/Listeners/LogDeleteStaticPage.php @@ -0,0 +1,30 @@ + $event->page->id, + 'url' => $event->page->url, + 'title' => $event->page->title, + 'revision' => $event->revision + ]; + + $this->saveLog($parameters); + } +} diff --git a/modules/StaticPages/Listeners/LogEditStaticPage.php b/modules/StaticPages/Listeners/LogEditStaticPage.php new file mode 100644 index 00000000..d70a3d37 --- /dev/null +++ b/modules/StaticPages/Listeners/LogEditStaticPage.php @@ -0,0 +1,30 @@ + $event->page->id, + 'url' => $event->page->url, + 'title' => $event->page->title, + 'revision' => $event->revision + ]; + + $this->saveLog($parameters); + } +} diff --git a/modules/StaticPages/Listeners/LogMakeDraftFromStaticPage.php b/modules/StaticPages/Listeners/LogMakeDraftFromStaticPage.php new file mode 100644 index 00000000..7b6eeb4c --- /dev/null +++ b/modules/StaticPages/Listeners/LogMakeDraftFromStaticPage.php @@ -0,0 +1,30 @@ + $event->page->id, + 'url' => $event->page->url, + 'title' => $event->page->title, + 'revision' => $event->revision + ]; + + $this->saveLog($parameters); + } +} diff --git a/modules/StaticPages/Listeners/LogPublishStaticPage.php b/modules/StaticPages/Listeners/LogPublishStaticPage.php new file mode 100644 index 00000000..2afd9e55 --- /dev/null +++ b/modules/StaticPages/Listeners/LogPublishStaticPage.php @@ -0,0 +1,30 @@ + $event->page->id, + 'url' => $event->page->url, + 'title' => $event->page->title, + 'revision' => $event->revision + ]; + + $this->saveLog($parameters); + } +} diff --git a/modules/StaticPages/Providers/EventServiceProvider.php b/modules/StaticPages/Providers/EventServiceProvider.php new file mode 100644 index 00000000..c97fbec5 --- /dev/null +++ b/modules/StaticPages/Providers/EventServiceProvider.php @@ -0,0 +1,40 @@ + [ + 'Modules\StaticPages\Listeners\LogCreateNewStaticPage' + ], + 'Modules\StaticPages\Events\EditStaticPage' => [ + 'Modules\StaticPages\Listeners\LogEditStaticPage' + ], + 'Modules\StaticPages\Events\PublishStaticPage' => [ + 'Modules\StaticPages\Listeners\LogPublishStaticPage' + ], + 'Modules\StaticPages\Events\DeleteStaticPage' => [ + 'Modules\StaticPages\Listeners\LogDeleteStaticPage' + ], + ]; + + /** + * Register any other events for your application. + * + * @param \Illuminate\Contracts\Events\Dispatcher $events + * @return void + */ + public function boot(DispatcherContract $events) + { + parent::boot($events); + } +} diff --git a/modules/StaticPages/Providers/StaticPagesServiceProvider.php b/modules/StaticPages/Providers/StaticPagesServiceProvider.php index 8352f756..3c2d544e 100644 --- a/modules/StaticPages/Providers/StaticPagesServiceProvider.php +++ b/modules/StaticPages/Providers/StaticPagesServiceProvider.php @@ -1,99 +1,129 @@ install(); + $this->registerTranslations(); + $this->registerConfig(); + $this->registerViews(); + } - /** - * Boot the application events. - * - * @return void - */ - public function boot() - { - $this->registerTranslations(); - $this->registerConfig(); - $this->registerViews(); + /** + * Register the service provider. + * + * @return void + */ + public function register() + { + // register event provider for firing module-specific events + $this->app->register('Modules\StaticPages\Providers\EventServiceProvider'); + } - // register links in admin menu - $menu = \Menu::instance('mainMenu'); - $menu->dropdown(trans('staticpages::adminMenu.staticPages'), function($submenu) { - $submenu->route('staticpage.new', trans('staticpages::adminMenu.new')); - $submenu->route('staticpage.overview', trans('staticpages::adminMenu.overview')); - }, 15, ['icon' => 'fa fa-newspaper-o']); - } + /** + * Method for installing module into database + */ + protected function install() + { + $handler = config('staticpages.handler'); + $installedModules = Modules::getWithTranslations(); + if (!isset($installedModules[$handler])) { - /** - * Register the service provider. - * - * @return void - */ - public function register() - { - // - } + // insert module into database + Module::create([ + 'handler' => $handler, + 'name' => 'staticpages::module.name', + 'description' => 'staticpages::module.description' + ]); - /** - * Register config. - * - * @return void - */ - protected function registerConfig() - { - $this->publishes([ - __DIR__.'/../Config/config.php' => config_path('staticpages.php'), - ]); - $this->mergeConfigFrom( - __DIR__.'/../Config/config.php', 'staticpages' - ); - } + // insert action log types into database + ActionLogType::create([ + 'string_id' => 'staticpages::createNew', + 'name' => 'staticpages::log.nameCreateNew', + 'value' => 'staticpages::log.nameCreateNew' + ]); + ActionLogType::create([ + 'string_id' => 'staticpages::edit', + 'name' => 'staticpages::log.nameEdit', + 'value' => 'staticpages::log.edit' + ]); + ActionLogType::create([ + 'string_id' => 'staticpages::delete', + 'name' => 'staticpages::log.nameDelete', + 'value' => 'staticpages::log.delete' + ]); + ActionLogType::create([ + 'string_id' => 'staticpages::makeDraft', + 'name' => 'staticpages::log.nameMakeDraft', + 'value' => 'staticpages::log.makeDraft' + ]); - /** - * Register views. - * - * @return void - */ - public function registerViews() - { - $viewPath = base_path('resources/views/modules/staticpages'); + ActionLogType::create([ + 'string_id' => 'staticpages::publish', + 'name' => 'staticpages::log.namePublish', + 'value' => 'staticpages::log.publish' + ]); + } + } - $sourcePath = __DIR__.'/../Resources/views'; + /** + * Register config. + * + * @return void + */ + protected function registerConfig() + { + $this->publishes([ + __DIR__ . '/../Config/config.php' => config_path('staticpages.php'), + ]); + $this->mergeConfigFrom(__DIR__ . '/../Config/config.php', 'staticpages'); + } - $this->publishes([ - $sourcePath => $viewPath - ]); + /** + * Register views. + * + * @return void + */ + public function registerViews() + { + $viewPath = base_path('resources/views/modules/staticpages'); - $this->loadViewsFrom(array_merge(array_map(function ($path) { - return $path . '/modules/staticpages'; - }, \Config::get('view.paths')), [$sourcePath]), 'staticpages'); - } + $sourcePath = __DIR__ . '/../Resources/views'; - /** - * Register translations. - * - * @return void - */ - public function registerTranslations() - { - $this->loadTranslationsFrom(__DIR__ .'/../Resources/lang', 'staticpages'); - } + $this->publishes([ + $sourcePath => $viewPath + ]); - /** - * Get the services provided by the provider. - * - * @return array - */ - public function provides() - { - return array(); - } + $this->loadViewsFrom(array_merge(array_map(function ($path) { + return $path . '/modules/staticpages'; + }, \Config::get('view.paths')), [$sourcePath]), 'staticpages'); + } + /** + * Register translations. + * + * @return void + */ + public function registerTranslations() + { + $this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'staticpages'); + } } diff --git a/modules/StaticPages/Resources/lang/en/admin.php b/modules/StaticPages/Resources/lang/en/admin.php index be77c359..f0bfb95b 100644 --- a/modules/StaticPages/Resources/lang/en/admin.php +++ b/modules/StaticPages/Resources/lang/en/admin.php @@ -1,5 +1,31 @@ 'List of all static pages', - 'new' => 'Create new static page' + 'overview' => 'List of all static pages', + 'new' => 'Create new static page', + 'content' => 'Page content', + 'save' => 'Save new page', + 'basicInfo' => 'Basic information', + 'metaOptions' => 'Meta information', + 'publicationOptions' => 'Publication setup', + 'field_title' => 'Page title', + 'field_url' => 'URL', + 'field_meta_keywords' => 'Keywords', + 'field_meta_description' => 'Page description', + 'field_published_from' => 'Published from', + 'field_published_to' => 'Published to', + 'successfullyCreated' => 'Page successfully created', + 'noPagesAvailable' => 'No static pages available. Try to create one first.', + 'viewPage' => 'View page on web', + 'edit' => 'Edit page :name', + 'deletePage' => 'Delete page (ireversible!)', + 'makePublic' => 'Publish page', + 'makeProtected' => 'Publish page only for logged users', + 'makeDraft' => 'Disable page and make it draft', + 'invalidStatus' => 'Cannot change status to something undefined.', + 'statusChanged' => 'Status successfully changed.', + 'invalidPage' => 'Specified page does not exist.', + 'pageDeleted' => 'Page :name (:url) successfully deleted.', + 'nothingToEdit' => 'You did not submit any changes. Nothing was edited.', + 'successfullyEdited' => 'Edit successfull' + ]; \ No newline at end of file diff --git a/modules/StaticPages/Resources/lang/en/module.php b/modules/StaticPages/Resources/lang/en/module.php new file mode 100644 index 00000000..a263fd12 --- /dev/null +++ b/modules/StaticPages/Resources/lang/en/module.php @@ -0,0 +1,5 @@ + 'Static pages', + 'description' => 'Static pages are intended for displaying static content on webpage.' +]; \ No newline at end of file diff --git a/modules/StaticPages/Resources/views/admin/edit.blade.php b/modules/StaticPages/Resources/views/admin/edit.blade.php new file mode 100644 index 00000000..fad2438f --- /dev/null +++ b/modules/StaticPages/Resources/views/admin/edit.blade.php @@ -0,0 +1,15 @@ +@extends('admin.layout') + +@section('pageName', @trans('staticpages::admin.edit', ['name' => $page->title])) + +@section('content') + +
+ @if (trim($page->meta_description)) + {{str_limit($page->meta_description)}} + @else + {{str_limit(strip_tags($page->content))}} + @endif +
+ + @if ($page->meta_keywords) +{{$page->meta_keywords}}
+ @endif + ++ + {{----}} + + + @if($page->status == \App\Models\Content::STATUS_DRAFT) + + + @endif + + @if(in_array($page->status, [\App\Models\Content::STATUS_PROTECTED, \App\Models\Content::STATUS_PUBLIC])) + + @endif + + +
+ +- This view is loaded from module: {!! config('staticpages.name') !!} -
- -@stop \ No newline at end of file diff --git a/resources/assets/css/admin.css b/resources/assets/css/admin.css index 50b8e40f..8583030c 100644 --- a/resources/assets/css/admin.css +++ b/resources/assets/css/admin.css @@ -34,6 +34,33 @@ list-style-type: none; } +#static-page-overview .page { + position: relative; + padding-bottom: 3em; +} + +#static-page-overview .page .controls { + position: absolute; + bottom: 0; +} + +#static-page-overview .page .controls .button { + margin-bottom: 10px; +} + +#static-page-overview .date, #static-page-overview .author { + font-size: 80%; + +} + +#static-page-overview .perex { + +} + +#static-page-overview .keywords { + margin-bottom: 0; + font-size: 80%; +} .red { color: red; diff --git a/resources/assets/js/vendor/trumbowyg/langs/ar.min.js b/resources/assets/js/vendor/trumbowyg/langs/ar.min.js new file mode 100644 index 00000000..0f83dd37 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/ar.min.js @@ -0,0 +1,9 @@ +/* =========================================================== + * ar.js + * Arabic translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Abo Mokh ahmed (abomokhahmed) + * Github : https://github.com/abomokhahmed + */ +jQuery.trumbowyg.langs.ar={_dir:"rtl",viewHTML:"إعرض-HTML",formatting:"تصميم",p:"فقرة",blockquote:"اقتباس",code:"كود",header:"رئيسي",bold:"عريض",italic:"مائل",strikethrough:"مشطوب",underline:"خطّ سفلي",strong:"بارز",em:"تغميق",del:"حذف",unorderedList:"قائمة غير مرتّبة",orderedList:"قائمة مرتّبة",insertImage:"إدخال صورة",insertVideo:"إدخال فيديو",link:"رابط",createLink:"انشاء رابط",unlink:"حذف رابط",justifyLeft:"تصحيح للشمال",justifyCenter:"تصحيح للمركز",justifyRight:"تصحيح لليمين",justifyFull:"تصحيح لكلا الإتّجاهين",horizontalRule:"إدخال خطّ أفقي",fullscreen:"شاشة واسعة",close:"إغلاق",submit:"أرسل",reset:"تهيئة من حديد",required:"إلزامي",description:"وصف",title:"عنوان",text:"نصّ"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/ca.min.js b/resources/assets/js/vendor/trumbowyg/langs/ca.min.js new file mode 100644 index 00000000..f6cf1f24 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/ca.min.js @@ -0,0 +1,11 @@ +/* =========================================================== + * ca.js + * Catalan translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Àlfons Sánchez (alsanan) + * Twitter : @alsanan + * Website : about.me/alsanan + * Github : https://github.com/alsanan + */ +jQuery.trumbowyg.langs.ca={viewHTML:"Veure HTML",formatting:"Formatar",p:"Paragraf",blockquote:"Citació",code:"Codi",header:"Títol",bold:"Negreta",italic:"Itàlica",strikethrough:"Suprimir",underline:"Subratllat",strong:"Forta",em:"Èmfasi",del:"Apagar",unorderedList:"Lista desordenada",orderedList:"Lista ordenada",insertImage:"Inserir imatge",insertVideo:"Inserir vídeo",link:"Enllaç",createLink:"Crear un enllaç",unlink:"Eliminar enllaç",justifyLeft:"Alinear a esquerra",justifyCenter:"Centrar",justifyRight:"Alinear a dreta",justifyFull:"Justificar",horizontalRule:"Inserir separador horitzontal",fullscreen:"Pantalla completa",close:"Tancar",submit:"Enviar",reset:"Reiniciar",required:"Obligatori",description:"Descripció",title:"Títol",text:"Text"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/cs.min.js b/resources/assets/js/vendor/trumbowyg/langs/cs.min.js new file mode 100644 index 00000000..0666e151 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/cs.min.js @@ -0,0 +1,8 @@ +/* =========================================================== + * cs.js + * Czech translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Jan Svoboda (https://github.com/svoboda-jan) + */ +jQuery.trumbowyg.langs.cs={viewHTML:"Zobrazit HTML",formatting:"Formátování",p:"Odstavec",blockquote:"Citace",code:"Kód",header:"Nadpis",bold:"Tučné",italic:"Kurzíva",strikethrough:"Přeškrtnuté",underline:"Podtržené",strong:"Tučné",em:"Zvýraznit",del:"Smazat",unorderedList:"Netříděný seznam",orderedList:"Tříděný seznam",insertImage:"Vložit obrázek",insertVideo:"Vložit video",link:"Odkaz",createLink:"Vložit odkaz",unlink:"Smazat odkaz",justifyLeft:"Zarovnat doleva",justifyCenter:"Zarovnat na střed",justifyRight:"Zarovnat doprava",justifyFull:"Zarovnat do bloku",horizontalRule:"Vložit vodorovnou čáru",fullscreen:"Režim celé obrazovky",close:"Zavřít",submit:"Potvrdit",reset:"Zrušit",required:"Povinné",description:"Popis",title:"Nadpis",text:"Text"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/da.min.js b/resources/assets/js/vendor/trumbowyg/langs/da.min.js new file mode 100644 index 00000000..47adf1a2 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/da.min.js @@ -0,0 +1,9 @@ +/* =========================================================== + * da.js + * Danish translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Christian Pedersen + * Github : https://github.com/chripede + */ +jQuery.trumbowyg.langs.da={viewHTML:"Vis HTML",formatting:"Formatter",p:"Afsnit",blockquote:"Citat",code:"Kode",header:"Overskrift",bold:"Fed",italic:"Kursiv",strikethrough:"Gennemstreg",underline:"Understreg",strong:"Vigtig",em:"Fremhæv",del:"Slettet",unorderedList:"Uordnet liste",orderedList:"Ordnet liste",insertImage:"Indsæt billede",insertVideo:"Indsæt video",link:"Link",createLink:"Indsæt link",unlink:"Fjern link",justifyLeft:"Venstrestil",justifyCenter:"Centrer",justifyRight:"Højrestil",justifyFull:"Lige margener",horizontalRule:"Horisontal linie",fullscreen:"Fuld skærm",close:"Luk",submit:"Bekræft",reset:"Annuller",required:"Påkrævet",description:"Beskrivelse",title:"Titel",text:"Tekst"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/de.min.js b/resources/assets/js/vendor/trumbowyg/langs/de.min.js new file mode 100644 index 00000000..15e3ae02 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/de.min.js @@ -0,0 +1,9 @@ +/* =========================================================== + * de.js + * German translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Manfred Timm + * Github : https://github.com/Manfred62 + */ +jQuery.trumbowyg.langs.de={viewHTML:"HTML anzeigen",formatting:"Formatieren",p:"Absatz",blockquote:"Zitat",code:"Code",header:"Überschrift",bold:"Fett",italic:"Kursiv",strikethrough:"Durchgestrichen",underline:"Unterstrichen",strong:"Wichtig",em:"Betont",del:"Gelöscht",unorderedList:"Ungeordnete Liste",orderedList:"Geordnete Liste",insertImage:"Bild einfügen",insertVideo:"Video einfügen",link:"Link",createLink:"Link einfügen",unlink:"Link entfernen",justifyLeft:"Links ausrichten",justifyCenter:"Zentrieren",justifyRight:"Rechts ausrichten",justifyFull:"Blocksatz",horizontalRule:"Horizontale Linie einfügen",fullscreen:"Vollbild",close:"Schliessen",submit:"Bestätigen",reset:"Rücksetzen",required:"Erforderlich",description:"Beschreibung",title:"Titel",text:"Text"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/el.min.js b/resources/assets/js/vendor/trumbowyg/langs/el.min.js new file mode 100644 index 00000000..e47c5a38 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/el.min.js @@ -0,0 +1,12 @@ +/* =========================================================== + * el.js + * Greek translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Merianos Nikos + * Twitter : @_webresources + * Website : http://www.wp-lion.com + * LinkedIn: https://gr.linkedin.com/in/merianosnikos + * Behance: https://www.behance.net/web_design_blog + */ +jQuery.trumbowyg.langs.es={viewHTML:"Προβολή κώδικα HTML",formatting:"Μορφοποίηση",p:"Παράγραφος",blockquote:"Παράθεση",code:"Κώδικας",header:"Επικεφαλίδα",bold:"Έντονα",italic:"Πλάγια",strikethrough:"Διαγραφή",underline:"Υπογράμμιση",strong:"Έντονα",em:"Πλάγια",del:"Διαγραφή",unorderedList:"Αταξινόμητη λίστα",orderedList:"Ταξινομημένη λίστα",insertImage:"Εισαγωγή εικόνας",insertVideo:"Εισαγωγή βίντεο",link:"Σύνδεσμος",createLink:"Δημιουργία συνδέσμου",unlink:"Διαγραφή συνδέσμου",justifyLeft:"Στοίχιση αριστερά",justifyCenter:"Στοίχιση στο κέντρο",justifyRight:"Στοίχιση δεξιά",justifyFull:"Πλήρης στοίχιση",horizontalRule:"Οριζόντια γραμμή",fullscreen:"Πλήρης οθόνη",close:"Κλείσιμο",submit:"Υποβολή",reset:"Επαναφορά",invalidUrl:"Λανθασμένο URL",required:"Απαραίτητο",description:"Περιγραφή",title:"Τίτλος",text:"Κείμενο"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/es.min.js b/resources/assets/js/vendor/trumbowyg/langs/es.min.js new file mode 100644 index 00000000..da16ed52 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/es.min.js @@ -0,0 +1,9 @@ +/* =========================================================== + * es.js + * Spanish translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Moisés Márquez + * Email : moises.marquez.g@gmail.com + */ +jQuery.trumbowyg.langs.es={viewHTML:"Ver HTML",formatting:"Formato",p:"Párrafo",blockquote:"Cita",code:"Código",header:"Título",bold:"Negrita",italic:"Cursiva",strikethrough:"Tachado",underline:"Subrayado",strong:"Negrita",em:"Énfasis",del:"Borrar",unorderedList:"Lista Desordenada",orderedList:"Lista Ordenada",insertImage:"Insertar una imagen",insertVideo:"Insertar un vídeo",link:"Enlace",createLink:"Insertar un enlace",unlink:"Suprimir un enlace",justifyLeft:"Izquierda",justifyCenter:"Centrar",justifyRight:"Derecha",justifyFull:"Justificado",horizontalRule:"Insertar separador horizontal",fullscreen:"Pantalla completa",close:"Cerrar",submit:"Enviar",reset:"Cancelar",required:"Obligatorio",description:"Descripción",title:"Título",text:"Texto"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/es_ar.min.js b/resources/assets/js/vendor/trumbowyg/langs/es_ar.min.js new file mode 100644 index 00000000..0d4ed99a --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/es_ar.min.js @@ -0,0 +1,9 @@ +/* =========================================================== + * es_ar.js + * Spanish (Argentina) translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Félix Vera + * Email : felix.vera@gmail.com + */ +jQuery.trumbowyg.langs.es_ar={viewHTML:"Ver HTML",formatting:"Formato",p:"Párrafo",blockquote:"Cita",code:"Código",header:"Título",bold:"Negrita",italic:"Itálica",strikethrough:"Tachado",underline:"Subrayado",strong:"Fuere",em:"Énfasis",del:"Borrar",unorderedList:"Lista Desordenada",orderedList:"Lista Ordenada",insertImage:"Insertar una imagen",insertVideo:"Insertar un video",link:"Vínculo",createLink:"Insertar un vínculo",unlink:"Suprimir un vínculo",justifyLeft:"Alinear a la Izquierda",justifyCenter:"Centrar",justifyRight:"Alinear a la Derecha",justifyFull:"Justificado",horizontalRule:"Insertar separado Horizontal",fullscreen:"Pantalla Completa",close:"Cerrar",submit:"Enviar",reset:"Cancelar",required:"Obligatorio",description:"Descripción",title:"Título",text:"Texto"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/fa.min.js b/resources/assets/js/vendor/trumbowyg/langs/fa.min.js new file mode 100644 index 00000000..c3f9843c --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/fa.min.js @@ -0,0 +1,10 @@ +/* =========================================================== + * fa.js + * Persian translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Kiarash Soleimanzadeh + * Github : https://github.com/kiyarash + * Email : kiarash.s@hotmail.com + */ +jQuery.trumbowyg.langs.fa={viewHTML:"نمایش کد اچ تی ام ال",formatting:"قالب بندی",p:"پاراگراف",blockquote:"نقل قول",code:"کد",header:"سر تیتر",bold:"ضخیم",italic:"مورب",strikethrough:"میان خط دار",underline:"زیر خط دار",strong:"برجسته",em:"مورب",del:"حذف شده",unorderedList:"لیست نامرتب",orderedList:"لیست مرتب",insertImage:"درج تصویر",insertVideo:"درج ویدئو",link:"لینک",createLink:"درج لینک",unlink:"حذف لینک",justifyLeft:"تراز به چپ",justifyCenter:"تراز به وسط",justifyRight:"تراز به راست",justifyFull:"تراز به چپ و راست",horizontalRule:"درج خط افقی",fullscreen:"تمام صفحه",close:"بستن",submit:"تائید",reset:"انصراف",required:"اجباری",description:"توضیحات",title:"عنوان",text:"متن"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/fi.min.js b/resources/assets/js/vendor/trumbowyg/langs/fi.min.js new file mode 100644 index 00000000..e6dde022 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/fi.min.js @@ -0,0 +1,9 @@ +/* =========================================================== + * fi.js + * Finnish translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Teppo Koivula (teppokoivula) + * Github : https://github.com/teppokoivula + */ +jQuery.trumbowyg.langs.fi={viewHTML:"Näytä HTML",formatting:"Muotoilu",p:"Kappale",blockquote:"Lainaus",code:"Koodi",header:"Otsikko",bold:"Lihavointi",italic:"Kursivointi",strikethrough:"Yliviivaus",underline:"Allevivaus",strong:"Vahvennus",em:"Painotus",del:"Poistettu",unorderedList:"Numeroimaton lista",orderedList:"Numeroitu lista",insertImage:"Lisää kuva",insertVideo:"Lisää video",link:"Linkki",createLink:"Luo linkki",unlink:"Poista linkki",justifyLeft:"Asemoi vasemmalle",justifyCenter:"Keskitä",justifyRight:"Asemoi oikealle",justifyFull:"Tasaa",horizontalRule:"Vaakaviiva",fullscreen:"Kokoruutu",close:"Sulje",submit:"Lähetä",reset:"Palauta",required:"Pakollinen",description:"Kuvaus",title:"Otsikko",text:"Teksti"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/fr.min.js b/resources/assets/js/vendor/trumbowyg/langs/fr.min.js new file mode 100644 index 00000000..7274d757 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/fr.min.js @@ -0,0 +1,10 @@ +/* =========================================================== + * fr.js + * French translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Alexandre Demode (Alex-D) + * Twitter : @AlexandreDemode + * Website : alex-d.fr + */ +jQuery.trumbowyg.langs.fr={viewHTML:"Voir le HTML",formatting:"Format",p:"Paragraphe",blockquote:"Citation",code:"Code",header:"Titre",bold:"Gras",italic:"Italique",strikethrough:"Rayé",underline:"Souligné",strong:"Fort",em:"Emphase",del:"Supprimé",unorderedList:"Liste à puces",orderedList:"Liste ordonnée",insertImage:"Insérer une image",insertVideo:"Insérer une video",link:"Lien",createLink:"Insérer un lien",unlink:"Supprimer le lien",justifyLeft:"Aligner à gauche",justifyCenter:"Centrer",justifyRight:"Aligner à droite",justifyFull:"Justifier",horizontalRule:"Insérer un séparateur horizontal",fullscreen:"Plein écran",close:"Fermer",submit:"Valider",reset:"Annuler",required:"Obligatoire",description:"Description",title:"Titre",text:"Texte"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/he.min.js b/resources/assets/js/vendor/trumbowyg/langs/he.min.js new file mode 100644 index 00000000..a706ecd0 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/he.min.js @@ -0,0 +1,9 @@ +/* =========================================================== +* he.js +* Hebrew translation for Trumbowyg +* http://alex-d.github.com/Trumbowyg +* =========================================================== +* Author : Udi Doron (udidoron) +* Github : https://github.com/udidoron +*/ +jQuery.trumbowyg.langs.he={_dir:"rtl",viewHTML:"צפה ב-HTML",formatting:"פורמט",p:"פסקה",blockquote:"ציטוט",code:"קוד",header:"ראשית",bold:"מודגש",italic:"נטוי",strikethrough:"קו חוצה",underline:"קו תחתון",strong:"בולט",em:"הדגשה",del:"נמחק",unorderedList:"רשימה ללא סדר",orderedList:"רשימה מסודרת",insertImage:"הכנס תמונה",insertVideo:"הכנס סרטון",link:"קישור",createLink:"צור קישור",unlink:"הסר קישור",justifyLeft:"ישר לשמאל",justifyCenter:"מרכז",justifyRight:"ישר לימין",justifyFull:"ישר לשני הצדדים",horizontalRule:"הכנס קו אופקי",fullscreen:"מסך מלא",close:"סגור",submit:"שלח",reset:"אתחל מחדש",required:"נחוץ",description:"תיאור",title:"כותרת",text:"טקסט"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/hu.min.js b/resources/assets/js/vendor/trumbowyg/langs/hu.min.js new file mode 100644 index 00000000..92c464ee --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/hu.min.js @@ -0,0 +1,10 @@ +/* =========================================================== + * hu.js + * Hungarian translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Peter MATO + * Web: http://fixme.hu + * GitHub: https://github.com/matopeter + */ +jQuery.trumbowyg.langs.hu={viewHTML:"HTML nézet",formatting:"Stílusok",p:"Bekezdés",blockquote:"Idézet",code:"Kód",header:"Címsor",bold:"Félkövér",italic:"Dőlt",strikethrough:"Áthúzott",underline:"Aláhúzott",strong:"Vastag",em:"Kiemelt",del:"Törölt",unorderedList:"Felsorolás",orderedList:"Számozás",insertImage:"Kép beszúrása",insertVideo:"Video beszúrása",link:"Link",createLink:"Link létrehozása",unlink:"Link eltávolítása",justifyLeft:"Balra igazítás",justifyCenter:"Középre igazítás",justifyRight:"Jobbra igazítás",justifyFull:"Sorkizárt",horizontalRule:"Vízszintes vonal",fullscreen:"Teljes képernyő",close:"Bezár",submit:"Beküldés",reset:"Alaphelyzet",required:"Kötelező",description:"Leírás",title:"Cím",text:"Szöveg",removeformat:"Formázás eltávolítása"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/id.min.js b/resources/assets/js/vendor/trumbowyg/langs/id.min.js new file mode 100644 index 00000000..418fc885 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/id.min.js @@ -0,0 +1,11 @@ +/* =========================================================== + * id.js + * Indonesian translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Rezha Julio (kimiamania) + * Twitter : @kimiamania + * Website : http://rezhajulio.web.id + * Github : https://github.com/kimiamania + */ +jQuery.trumbowyg.langs.id={viewHTML:"Lihat HTML",formatting:"Penyusunan",p:"Paragraf",blockquote:"Kutipan",code:"Kode",header:"Kepala",bold:"Tebal",italic:"Miring",strikethrough:"Coret",underline:"Garis bawah",strong:"Tebal",em:"Miring",del:"Dicoret",unorderedList:"Daftar tak teratur",orderedList:"Daftar teratur",insertImage:"Sisipkan gambar",insertVideo:"Sisipkan video",link:"Tautan",createLink:"Sisipkan Tautan",unlink:"Singkirkan tautan",justifyLeft:"Rata kiri",justifyCenter:"Rata Tengah",justifyRight:"Rata kanan",justifyFull:"Rata kiri dan kanan",horizontalRule:"Sisipkan garis mendatar",fullscreen:"Layar penuh",close:"Tutup",submit:"Setuju",reset:"Batal",required:"Diperlukan",description:"Deskripsi",title:"Judul",text:"Teks"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/it.min.js b/resources/assets/js/vendor/trumbowyg/langs/it.min.js new file mode 100644 index 00000000..da7fd4b0 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/it.min.js @@ -0,0 +1,8 @@ +/* =========================================================== + * it.js + * Italian translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Mirko Buffoni + */ +jQuery.trumbowyg.langs.it={viewHTML:"Mostra HTML",formatting:"Formattazione",p:"Paragrafo",blockquote:"Citazione",code:"Codice",header:"Intestazione",bold:"Grassetto",italic:"Italico",strikethrough:"Barrato",underline:"Sottolineato",strong:"Rafforza",em:"Enfatizza",del:"Cancella",unorderedList:"Elenco puntato",orderedList:"Elenco numerato",insertImage:"Inserisci immagine",insertVideo:"Inserisci video",link:"Collegamento",createLink:"Crea un collegamento",unlink:"Elimina collegamento",justifyLeft:"Allinea a sinistra",justifyCenter:"Centra",justifyRight:"Allinea a destra",justifyFull:"Giustifica",horizontalRule:"Inserisci un separatore orizzontale",fullscreen:"Schermo intero",close:"Chiudi",submit:"Invia",reset:"Annulla",required:"Obbligatorio",description:"Descrizione",title:"Titolo",text:"Testo"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/ja.min.js b/resources/assets/js/vendor/trumbowyg/langs/ja.min.js new file mode 100644 index 00000000..ff34a2f0 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/ja.min.js @@ -0,0 +1,10 @@ +/* =========================================================== + * ja.js + * Japanese translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Kouta Fukuhara (foo9) + * Twitter : @foo9 + * Website : https://github.com/foo9 + */ +jQuery.trumbowyg.langs.ja={viewHTML:"HTML表示",formatting:"フォーマット",p:"段落",blockquote:"引用",code:"コード",header:"見出し",bold:"太字",italic:"斜体",strikethrough:"取り消し線",underline:"下線",strong:"太字",em:"斜体",del:"取り消し線",unorderedList:"順序なしリスト",orderedList:"順序ありリスト",insertImage:"画像の挿入",insertVideo:"動画の挿入",link:"リンク",createLink:"リンクの作成",unlink:"リンクの削除",justifyLeft:"左揃え",justifyCenter:"中央揃え",justifyRight:"右揃え",justifyFull:"両端揃え",horizontalRule:"横罫線",fullscreen:"全画面表示",close:"閉じる",submit:"送信",reset:"キャンセル",required:"必須",description:"説明",title:"タイトル",text:"テキスト"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/ko.min.js b/resources/assets/js/vendor/trumbowyg/langs/ko.min.js new file mode 100644 index 00000000..76e9c248 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/ko.min.js @@ -0,0 +1,10 @@ +/* =========================================================== + * ko.js + * Korean translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : JoongSeob Vito Kim (dorajistyle) + * Blog : http://dorajistyle.pe.kr + * Github : https://github.com/dorajistyle + */ +jQuery.trumbowyg.langs.ko={viewHTML:"HTML로 보기",formatting:"양식",p:"문단",blockquote:"인용부호",code:"코드",header:"머릿말",bold:"진하게",italic:"기울임",strikethrough:"취소선",underline:"밑줄",strong:"굵게",em:"강조",del:"취소",unorderedList:"순차 목록",orderedList:"비순차 목록",insertImage:"이미지 넣기",insertVideo:"비디오 넣기",link:"링크",createLink:"링크 넣기",unlink:"링크 없애기",justifyLeft:"왼쪽 정렬",justifyCenter:"가운데 정렬",justifyRight:"오른쪽 정렬",justifyFull:"혼합 정렬",horizontalRule:"가로줄 넣기",fullscreen:"전체 화면",close:"닫기",submit:"전송",reset:"초기화",required:"꼭 입력해야 합니다.",description:"설명",title:"제목",text:"본문 내용"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/my.min.js b/resources/assets/js/vendor/trumbowyg/langs/my.min.js new file mode 100644 index 00000000..8dda5931 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/my.min.js @@ -0,0 +1,8 @@ +/* =========================================================== + * my.js + * Malaysian translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : JohnPozy + */ +jQuery.trumbowyg.langs.id={viewHTML:"Lihat HTML",formatting:"Pemformatan",p:"Perenggan",blockquote:"Blockquote",code:"Kod",header:"Pengepala",bold:"Tebal",italic:"Condong",strikethrough:"Garis batal",underline:"Garis bawah",strong:"Kuat",em:"Condong",del:"Hapus",unorderedList:"Senarai tidak tertib",orderedList:"Senarai tertib",insertImage:"Masukkan imej",insertVideo:"Masukkan video",link:"Pautan",createLink:"Cipta pautan",unlink:"Hapus pautan",justifyLeft:"Mengimbangkan ke kiri",justifyCenter:"Mengimbangkan ke tengah",justifyRight:"Mengimbangkan ke kanan",justifyFull:"Mengimbangkan ke kiri dan kanan",horizontalRule:"Masukkan garis mendatar",fullscreen:"Skrin penuh",close:"Tutup",submit:"Hantar",reset:"Batal",required:"Diperlukan",description:"Perihal",title:"Tajuk",text:"Teks"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/nl.min.js b/resources/assets/js/vendor/trumbowyg/langs/nl.min.js new file mode 100644 index 00000000..ddd7b1bd --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/nl.min.js @@ -0,0 +1,9 @@ +/* =========================================================== + * nl.js + * Dutch translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Danny Hiemstra + * Github : https://github.com/dhiemstra + */ +jQuery.trumbowyg.langs.nl={viewHTML:"HTML bekijken",formatting:"Opmaak",p:"Paragraaf",blockquote:"Citaat",code:"Code",header:"Kop",bold:"Vet",italic:"Cursief",strikethrough:"Doorhalen",underline:"Onderlijnen",strong:"Sterk",em:"Nadruk",del:"Verwijderd",unorderedList:"Ongenummerde lijst",orderedList:"Genummerde lijst",insertImage:"Afbeelding invoegen",insertVideo:"Video invoegen",link:"Link",createLink:"Link maken",unlink:"Link verwijderen",justifyLeft:"Links uitlijnen",justifyCenter:"Centreren",justifyRight:"Rechts uitlijnen",justifyFull:"Uitvullen",horizontalRule:"Horizontale lijn",removeFormat:"Opmaak verwijderen",fullscreen:"Volledig scherm",close:"Sluiten",submit:"Verzenden",reset:"Herstellen",required:"Verplicht",description:"Omschrijving",title:"Titel",text:"Tekst"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/pl.min.js b/resources/assets/js/vendor/trumbowyg/langs/pl.min.js new file mode 100644 index 00000000..7d7a436a --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/pl.min.js @@ -0,0 +1,9 @@ +/* =========================================================== + * pl.js + * Polish translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Paweł Abramowicz + * Github : https://github.com/pawelabrams + */ +jQuery.trumbowyg.langs.pl={viewHTML:"Pokaż HTML",formatting:"Format",p:"Akapit",blockquote:"Cytat",code:"Kod",header:"Nagłówek",bold:"Pogrubienie",italic:"Pochylenie",strikethrough:"Przekreślenie",underline:"Podkreślenie",strong:"Wytłuszczenie",em:"Uwydatnienie",del:"Usunięte",unorderedList:"Lista nieuporządkowana",orderedList:"Lista uporządkowana",insertImage:"Wstaw obraz",insertVideo:"Wstaw film",link:"Link",createLink:"Wstaw link",unlink:"Usuń link",justifyLeft:"Wyrównaj do lewej",justifyCenter:"Wyśrodkuj",justifyRight:"Wyrównaj do prawej",justifyFull:"Wyjustuj",horizontalRule:"Odkreśl linią",fullscreen:"Pełny ekran",close:"Zamknij",submit:"Zastosuj",reset:"Przywróć",required:"Wymagane",description:"Opis",title:"Tytuł",text:"Tekst"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/pt.min.js b/resources/assets/js/vendor/trumbowyg/langs/pt.min.js new file mode 100644 index 00000000..462fda3a --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/pt.min.js @@ -0,0 +1,11 @@ +/* =========================================================== + * pt.js + * Portuguese translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Ramiro Varandas Jr (ramirovjr) + * Twitter : @ramirovjnr + * Website : about.me/ramirovjnr + * Github : https://github.com/ramirovjr + */ +jQuery.trumbowyg.langs.pt={viewHTML:"Ver HTML",formatting:"Formatar",p:"Paragráfo",blockquote:"Citação",code:"Código",header:"Título",bold:"Negrito",italic:"Itálico",strikethrough:"Suprimir",underline:"Sublinhado",strong:"Forte",em:"Ênfase",del:"Apagar",unorderedList:"Lista não ordenada",orderedList:"Liste ordenada",insertImage:"Inserir imagem",insertVideo:"Inserir vídeo",link:"Link",createLink:"Criar um link",unlink:"Remover link",justifyLeft:"Alinhar a esquerda",justifyCenter:"Centralizar",justifyRight:"Alinhar a direita",justifyFull:"Justificar",horizontalRule:"Inserir separador horizontal",fullscreen:"Tela cheia",close:"Fechar",submit:"Enviar",reset:"Limpar",required:"Obrigatório",description:"Descrição",title:"Título",text:"Texto"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/ro.min.js b/resources/assets/js/vendor/trumbowyg/langs/ro.min.js new file mode 100644 index 00000000..b3c4528b --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/ro.min.js @@ -0,0 +1,12 @@ +/* =========================================================== + * ro.js + * Romanian translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Vladut Radulescu (pacMakaveli) + * Email: pacMakaveli90@gmail.com + * Twitter : @pacMakaveli90 + * Website : creative-studio51.co.uk + * Github : https://github.com/pacMakaveli + */ +jQuery.trumbowyg.langs.pt={viewHTML:"Vizualizare HTML",formatting:"Format",p:"Paragraf",blockquote:"Citație",code:"Cod",header:"Titlu",bold:"Bold",italic:"Italic",strikethrough:"Tăiat",underline:"Subliniat",strong:"Puternic",em:"Accentuat",del:"Sterge",unorderedList:"Lista dezordonată",orderedList:"Liste ordonată",insertImage:"Adăugare Imagine",insertVideo:"Adăugare Video",link:"Link",createLink:"Crează link",unlink:"Remover link",justifyLeft:"Aliniază stânga",justifyCenter:"Aliniază centru",justifyRight:"Aliniază dreapta",justifyFull:"Justificare",horizontalRule:"Linie orizontală",fullscreen:"Tot ecranul",close:"Închide",submit:"Procesează",reset:"Resetează",required:"Obligatoriu",description:"Descriere",title:"Titlu",text:"Text"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/rs.min.js b/resources/assets/js/vendor/trumbowyg/langs/rs.min.js new file mode 100644 index 00000000..f591173a --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/rs.min.js @@ -0,0 +1,8 @@ +/* =========================================================== + * rs.js + * Serbian (Cyrlic) translation for Trumbowyg + * https://www.github.com/johonunu + * =========================================================== + * Author : Nikola Trifunovic (https://www.github.com/johonunu) + */ +jQuery.trumbowyg.langs.rs={viewHTML:"Погледај HTML кóд",formatting:"Форматирање",p:"Параграф",blockquote:"Цитат",code:"Кóд",header:"Наслов",bold:"Подебљано",italic:"Курзив",strikethrough:"Прецртано",underline:"Подвучено",strong:"Подебљано",em:"Истакнуто",del:"Обрисано",unorderedList:"Ненабројива листа",orderedList:"Набројива листа",insertImage:"Унеси слику",insertVideo:"Унеси видео",link:"Линк",createLink:"Унеси линк",unlink:"Уклони линк",justifyLeft:"Лево равнање",justifyCenter:"Централно равнање",justifyRight:"Десно равнање",justifyFull:"Обострано равнање",horizontalRule:"Хоризонтална линија",fullscreen:"Режим читавог екрана",close:"Затвори",submit:"Унеси",reset:"Откажи",required:"Обавезно поље",invalidUrl:"URL",description:"Опис",title:"Наслов",text:"Текст"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/rs_latin.min.js b/resources/assets/js/vendor/trumbowyg/langs/rs_latin.min.js new file mode 100644 index 00000000..9fe81099 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/rs_latin.min.js @@ -0,0 +1,8 @@ +/* =========================================================== + * rs_latin.js + * Serbian (Latin) translation for Trumbowyg + * https://www.github.com/johonunu + * =========================================================== + * Author : Nikola Trifunovic (https://www.github.com/johonunu) + */ +jQuery.trumbowyg.langs.rs_latin={viewHTML:"Poglеdaj HTML kód",formatting:"Formatiranjе",p:"Paragraf",blockquote:"Citat",code:"Kód",header:"Naslov",bold:"Podеbljano",italic:"Kurziv",strikethrough:"Prеcrtano",underline:"Podvučеno",strong:"Podеbljano",em:"Istaknuto",del:"Obrisano",unorderedList:"Nеnabrojiva lista",orderedList:"Nabrojiva lista",insertImage:"Unеsi sliku",insertVideo:"Unеsi vidеo",link:"Link",createLink:"Unеsi link",unlink:"Ukloni link",justifyLeft:"Lеvo ravnanjе",justifyCenter:"Cеntralno ravnanjе",justifyRight:"Dеsno ravnanjе",justifyFull:"Obostrano ravnanjе",horizontalRule:"Horizontalna linija",fullscreen:"Rеžim čitavog еkrana",close:"Zatvori",submit:"Unеsi",reset:"Otkaži",required:"Obavеzno poljе",invalidUrl:"URL",description:"Opis",title:"Naslov",text:"Tеkst"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/ru.min.js b/resources/assets/js/vendor/trumbowyg/langs/ru.min.js new file mode 100644 index 00000000..8132efea --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/ru.min.js @@ -0,0 +1,8 @@ +/* =========================================================== + * ru.js + * Russion translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Yuri Lya + */ +jQuery.trumbowyg.langs.ru={viewHTML:"Посмотреть HTML",formatting:"Форматирование",p:"Обычный",blockquote:"Цитата",code:"Код",header:"Заголовок",bold:"Полужирный",italic:"Курсив",strikethrough:"Зачеркнутый",underline:"Подчеркнутый",strong:"Полужирный",em:"Курсив",del:"Зачеркнутый",unorderedList:"Обычный список",orderedList:"Нумерованный список",insertImage:"Вставить изображение",insertVideo:"Вставить видео",link:"Ссылка",createLink:"Вставить ссылку",unlink:"Удалить ссылку",justifyLeft:"По левому краю",justifyCenter:"По центру",justifyRight:"По правому краю",justifyFull:"По ширине",horizontalRule:"Горизонтальная линия",fullscreen:"Во весь экран",close:"Закрыть",submit:"Вставить",reset:"Отменить",required:"Обязательное",description:"Описание",title:"Подсказка",text:"Текст"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/sk.min.js b/resources/assets/js/vendor/trumbowyg/langs/sk.min.js new file mode 100644 index 00000000..cb74fd2a --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/sk.min.js @@ -0,0 +1,8 @@ +/* =========================================================== + * sk.js + * Slovak translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : VeeeneX (https://github.com/VeeeneX) + */ +jQuery.trumbowyg.langs.sk={viewHTML:"Zobraziť HTML",formatting:"Formátovanie",p:"Paragraf",blockquote:"Citácia",code:"Kód",header:"Nadpis",bold:"Tučné",italic:"Kurzíva",strikethrough:"Preškrtnuté",underline:"Podčiarknuté",strong:"Tučné",em:"Zvýrazniť",del:"Zmazať",unorderedList:"Netriedený zoznam",orderedList:"Triedený zoznam",insertImage:"Vložiť obrázok",insertVideo:"Vložiť video",link:"Odkaz",createLink:"Vložiť odkaz",unlink:"Zmazať odkaz",justifyLeft:"Zarovnať doľava",justifyCenter:"Zarovnať na stred",justifyRight:"Zarovnať doprava",justifyFull:"Zarovnať do bloku",horizontalRule:"Vložit vodorovnú čiaru",fullscreen:"Režim celej obrazovky",close:"Zavrieť",submit:"Potvrdiť",reset:"Zrušiť",required:"Povinné",description:"Popis",title:"Nadpis",text:"Text"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/sv.min.js b/resources/assets/js/vendor/trumbowyg/langs/sv.min.js new file mode 100644 index 00000000..78d73280 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/sv.min.js @@ -0,0 +1,9 @@ +/* =========================================================== + * sv.js + * Swedish translation for Trumbowyg + * http://www.tim-international.net + * =========================================================== + * Author : T. Almroth + * Github : https://github.com/timint + */ +jQuery.trumbowyg.langs.sv={viewHTML:"Visa HTML",formatting:"Formatera",p:"Avsnitt",blockquote:"Citat",code:"Kod",header:"Överskrift",bold:"Fet",italic:"Kursiv",strikethrough:"Genomstruken",underline:"Understreck",strong:"Viktig",em:"Framhäv",del:"Rensa formatering",unorderedList:"Lista",orderedList:"Numrerad lista",insertImage:"Infoga bild",insertVideo:"Infoga video",link:"Länk",createLink:"Infoga länk",unlink:"Ta bort länk",justifyLeft:"Vänsterjustera",justifyCenter:"Centrera",justifyRight:"Högerjustera",justifyFull:"Marginaljustera",horizontalRule:"Horisontell linje",fullscreen:"Fullskärm",close:"Stäng",submit:"Bekräfta",reset:"Återställ",required:"Obligatorisk",description:"Beskrivning",title:"Titel",text:"Text"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/tr.min.js b/resources/assets/js/vendor/trumbowyg/langs/tr.min.js new file mode 100644 index 00000000..8d36ef21 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/tr.min.js @@ -0,0 +1,9 @@ +/* =========================================================== + * tr.js + * Turkish translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Emrah Bilbay (munzur) + * Github : https://github.com/munzur + */ +jQuery.trumbowyg.langs.tr={viewHTML:"HTML Kodu",formatting:"Biçimlendirme",p:"Paragraf",blockquote:"Alıntı",code:"Kod",header:"Başlık",bold:"Kalın",italic:"İtalik",strikethrough:"Üzeri çizgili",underline:"Altı çizgili",strong:"Koyu",em:"Vurgulu",del:"Üzeri çizgili",unorderedList:"Simgeli liste",orderedList:"Numaralı liste",insertImage:"Resim yerleştir",insertVideo:"Video yerleştir",link:"Link",createLink:"Link yerleştir",unlink:"Linki sil",justifyLeft:"Sola hizala",justifyCenter:"Ortaya hizala",justifyRight:"Sağa hizala",justifyFull:"Yasla",horizontalRule:"Yatay satır ekle",fullscreen:"Tam ekran",close:"Kapat",submit:"Onayla",reset:"Sıfırla",required:"Gerekli",description:"Açıklama",title:"Başlık",text:"Metin"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/ua.min.js b/resources/assets/js/vendor/trumbowyg/langs/ua.min.js new file mode 100644 index 00000000..dab81062 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/ua.min.js @@ -0,0 +1,8 @@ +/* =========================================================== + * ua.js + * Ukrainian translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Igor Buksha + */ +jQuery.trumbowyg.langs.ua={viewHTML:"Подивитись HTML",formatting:"Форматування",p:"Звичайний",blockquote:"Витяг",code:"Код",header:"Заголовок",bold:"Напівжирний",italic:"Курсив",strikethrough:"Закреслений",underline:"Підкреслений",strong:"Напівжирний",em:"Курсив",del:"Закреслений",unorderedList:"Звичайний список",orderedList:"Нумерований список",insertImage:"Вставити зображення",insertVideo:"Вставити відео",link:"Посилання",createLink:"Вставити посилання",unlink:"Видалити посилання",justifyLeft:"По лівому краю",justifyCenter:"В центрі",justifyRight:"По правому краю",justifyFull:"По ширині",horizontalRule:"Горизонтальна лінія",fullscreen:"На весь екран",close:"Закрити",submit:"Вставити",reset:"Скасувати",required:"Обов'язкове",description:"Опис",title:"Підказка",text:"Текст"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/vi.min.js b/resources/assets/js/vendor/trumbowyg/langs/vi.min.js new file mode 100644 index 00000000..96734f30 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/vi.min.js @@ -0,0 +1,9 @@ +/* =========================================================== + * vi.js + * Vietnamese translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : heocoi + * Github: https://github.com/heocoi + */ +jQuery.trumbowyg.langs.vi={viewHTML:"Hiển thị HTML",formatting:"Định dạng",p:"Đoạn",blockquote:"Trích dẫn",code:"Code",header:"Đầu trang",bold:"In đậm",italic:"In nghiêng",strikethrough:"Gạch ngang",underline:"Gạch chân",strong:"In đậm",em:"In nghiêng",del:"Gạch ngang",unorderedList:"Danh sách không thứ tự",orderedList:"Danh sách có thứ tự",insertImage:"Chèn hình ảnh",insertVideo:"Chèn video",link:"Đường dẫn",createLink:"Tạo đường dẫn",unlink:"Hủy đường dẫn",justifyLeft:"Canh lề trái",justifyCenter:"Canh giữa",justifyRight:"Canh lề phải",justifyFull:"Canh đều",horizontalRule:"Thêm đường kẻ ngang",fullscreen:"Toàn màn hình",close:"Đóng",submit:"Đồng ý",reset:"Hủy bỏ",required:"Bắt buộc",description:"Mô tả",title:"Tiêu đề",text:"Nội dung"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/zh_cn.min.js b/resources/assets/js/vendor/trumbowyg/langs/zh_cn.min.js new file mode 100644 index 00000000..0f4c13d1 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/zh_cn.min.js @@ -0,0 +1,10 @@ +/* =========================================================== + * zh_cn.js + * Simplified Chinese translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Liu Kai (akai) + * Twitter : @akai404 + * Github : https://github.com/akai + */ +jQuery.trumbowyg.langs.zh_cn={viewHTML:"源代码",formatting:"格式",p:"段落",blockquote:"引用",code:"代码",header:"标题",bold:"加粗",italic:"斜体",strikethrough:"删除线",underline:"下划线",strong:"加粗",em:"斜体",del:"删除线",unorderedList:"无序列表",orderedList:"有序列表",insertImage:"插入图片",insertVideo:"插入视频",link:"超链接",createLink:"插入链接",unlink:"取消链接",justifyLeft:"居左对齐",justifyCenter:"居中对齐",justifyRight:"居右对齐",justifyFull:"两端对齐",horizontalRule:"插入分隔线",fullscreen:"全屏",close:"关闭",submit:"确定",reset:"取消",required:"必需的",description:"描述",title:"标题",text:"文字"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/langs/zh_tw.min.js b/resources/assets/js/vendor/trumbowyg/langs/zh_tw.min.js new file mode 100644 index 00000000..1f5b1d9a --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/langs/zh_tw.min.js @@ -0,0 +1,10 @@ +/* =========================================================== + * zh_tw.js + * Traditional Chinese translation for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Peter Dave Hello (PeterDaveHello) + * Twitter : @PeterDaveHello + * Github : https://github.com/PeterDaveHello + */ +jQuery.trumbowyg.langs.zh_tw={viewHTML:"原始碼",formatting:"格式",p:"段落",blockquote:"引用",code:"代碼",header:"標題",bold:"加粗",italic:"斜體",strikethrough:"刪除線",underline:"底線",strong:"加粗",em:"斜體",del:"刪除線",unorderedList:"無序列表",orderedList:"有序列表",insertImage:"插入圖片",insertVideo:"插入影片",link:"超連結",createLink:"插入連結",unlink:"取消連結",justifyLeft:"靠左對齊",justifyCenter:"置中對齊",justifyRight:"靠右對齊",justifyFull:"左右對齊",horizontalRule:"插入分隔線",fullscreen:"全螢幕",close:"關閉",submit:"確定",reset:"取消",required:"必需的",description:"描述",title:"標題",text:"文字"}; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/plugins/base64/trumbowyg.base64.js b/resources/assets/js/vendor/trumbowyg/plugins/base64/trumbowyg.base64.js new file mode 100644 index 00000000..fd7fef3c --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/base64/trumbowyg.base64.js @@ -0,0 +1,81 @@ +/* =========================================================== + * trumbowyg.base64.js v1.0 + * Base64 plugin for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Cyril Biencourt (lizardK) + */ + +(function ($) { + 'use strict'; + + $.extend(true, $.trumbowyg, { + langs: { + en: { + base64: 'Image as base64', + file: 'File', + errFileReaderNotSupported: 'FileReader is not supported by your browser.' + }, + fr: { + base64: 'Image en base64', + file: 'Fichier' + }, + cs: { + base64: 'Vložit obrázek', + file: 'Soubor' + } + }, + + opts: { + btnsDef: { + base64: { + isSupported: function () { + if (typeof FileReader === 'undefined') { + if (window.console !== undefined) { + console.err('[Trumbowyg - Plugin base64] FileReader is not supported by your browser.'); + } + return false; + } + return true; + }, + func: function (params, tbw) { + var file; + tbw.openModalInsert( + // Title + tbw.lang.base64, + + // Fields + { + file: { + type: 'file', + required: true + }, + alt: { + label: 'description' + } + }, + + // Callback + function (values) { + var fReader = new FileReader(); + + fReader.onloadend = function () { + tbw.execCmd('insertImage', fReader.result); + $(['img[src="', fReader.result, '"]:not([alt])'].join(''), tbw.$box).attr('alt', values.alt); + tbw.closeModal(); + }; + + fReader.readAsDataURL(file); + } + ); + + $('input[type=file]').on('change', function (e) { + file = e.target.files[0]; + }); + }, + ico: 'insertImage' + } + } + } + }); +})(jQuery); \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/plugins/base64/trumbowyg.base64.min.js b/resources/assets/js/vendor/trumbowyg/plugins/base64/trumbowyg.base64.min.js new file mode 100644 index 00000000..8ba7c172 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/base64/trumbowyg.base64.min.js @@ -0,0 +1 @@ +!function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{base64:"Image as base64",file:"File",errFileReaderNotSupported:"FileReader is not supported by your browser."},fr:{base64:"Image en base64",file:"Fichier"},cs:{base64:"Vložit obrázek",file:"Soubor"}},opts:{btnsDef:{base64:{isSupported:function(){return"undefined"==typeof FileReader?(void 0!==window.console&&console.err("[Trumbowyg - Plugin base64] FileReader is not supported by your browser."),!1):!0},func:function(o,r){var n;r.openModalInsert(r.lang.base64,{file:{type:"file",required:!0},alt:{label:"description"}},function(o){var t=new FileReader;t.onloadend=function(){r.execCmd("insertImage",t.result),e(['img[src="',t.result,'"]:not([alt])'].join(""),r.$box).attr("alt",o.alt),r.closeModal()},t.readAsDataURL(n)}),e("input[type=file]").on("change",function(e){n=e.target.files[0]})},ico:"insertImage"}}}})}(jQuery); \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/plugins/colors/trumbowyg.colors.js b/resources/assets/js/vendor/trumbowyg/plugins/colors/trumbowyg.colors.js new file mode 100644 index 00000000..15c356b8 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/colors/trumbowyg.colors.js @@ -0,0 +1,82 @@ +/* =========================================================== + * trumbowyg.colors.js v1.1 + * Colors picker plugin for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Alexandre Demode (Alex-D) + * Twitter : @AlexandreDemode + * Website : alex-d.fr + */ + +(function ($) { + 'use strict'; + + $.extend(true, $.trumbowyg, { + langs: { + cs: { + foreColor: 'Barva textu', + backColor: 'Barva pozadí' + }, + en: { + foreColor: 'Text color', + backColor: 'Background color' + }, + fr: { + foreColor: 'Couleur du texte', + backColor: 'Couleur de fond' + }, + sk: { + foreColor: 'Farba textu', + backColor: 'Farba pozadia' + } + } + }); + + // Create btnsDef entry + $.extend(true, $.trumbowyg, { + opts: { + btnsDef: {} + } + }); + + // Set default colors + if (!$.trumbowyg.opts.colors) + $.trumbowyg.opts.colors = ['ffffff', '000000', 'eeece1', '1f497d', '4f81bd', 'c0504d', '9bbb59', '8064a2', '4bacc6', 'f79646', 'ffff00', 'f2f2f2', '7f7f7f', 'ddd9c3', 'c6d9f0', 'dbe5f1', 'f2dcdb', 'ebf1dd', 'e5e0ec', 'dbeef3', 'fdeada', 'fff2ca', 'd8d8d8', '595959', 'c4bd97', '8db3e2', 'b8cce4', 'e5b9b7', 'd7e3bc', 'ccc1d9', 'b7dde8', 'fbd5b5', 'ffe694', 'bfbfbf', '3f3f3f', '938953', '548dd4', '95b3d7', 'd99694', 'c3d69b', 'b2a2c7', 'b7dde8', 'fac08f', 'f2c314', 'a5a5a5', '262626', '494429', '17365d', '366092', '953734', '76923c', '5f497a', '92cddc', 'e36c09', 'c09100', '7f7f7f', '0c0c0c', '1d1b10', '0f243e', '244061', '632423', '4f6128', '3f3151', '31859b', '974806', '7f6000']; + + // Add all colors in two dropdowns + $.extend(true, $.trumbowyg, { + opts: { + btnsDef: { + foreColor: { + dropdown: buildDropdown('foreColor') + }, + backColor: { + dropdown: buildDropdown('backColor') + } + } + } + }); + + + function buildDropdown(func) { + var dropdown = []; + + $.each($.trumbowyg.opts.colors, function (i, color) { + var btn = '_' + func + color; + $.trumbowyg.opts.btnsDef[btn] = { + func: func, + param: '#' + color, + style: 'background-color: #' + color + ';' + }; + dropdown.push(btn); + }); + var btn = '_' + func + 'transparent'; + $.trumbowyg.opts.btnsDef[btn] = { + func: func, + param: 'transparent', + style: 'background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQIW2NkQAAfEJMRmwBYhoGBYQtMBYoAADziAp0jtJTgAAAAAElFTkSuQmCC);' + }; + dropdown.push(btn); + return dropdown; + } +})(jQuery); diff --git a/resources/assets/js/vendor/trumbowyg/plugins/colors/trumbowyg.colors.min.js b/resources/assets/js/vendor/trumbowyg/plugins/colors/trumbowyg.colors.min.js new file mode 100644 index 00000000..26962a71 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/colors/trumbowyg.colors.min.js @@ -0,0 +1 @@ +!function(o){"use strict";function f(f){var r=[];o.each(o.trumbowyg.opts.colors,function(e,d){var c="_"+f+d;o.trumbowyg.opts.btnsDef[c]={func:f,param:"#"+d,style:"background-color: #"+d+";"},r.push(c)});var e="_"+f+"transparent";return o.trumbowyg.opts.btnsDef[e]={func:f,param:"transparent",style:"background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQIW2NkQAAfEJMRmwBYhoGBYQtMBYoAADziAp0jtJTgAAAAAElFTkSuQmCC);"},r.push(e),r}o.extend(!0,o.trumbowyg,{langs:{cs:{foreColor:"Barva textu",backColor:"Barva pozadí"},en:{foreColor:"Text color",backColor:"Background color"},fr:{foreColor:"Couleur du texte",backColor:"Couleur de fond"},sk:{foreColor:"Farba textu",backColor:"Farba pozadia"}}}),o.extend(!0,o.trumbowyg,{opts:{btnsDef:{}}}),o.trumbowyg.opts.colors||(o.trumbowyg.opts.colors=["ffffff","000000","eeece1","1f497d","4f81bd","c0504d","9bbb59","8064a2","4bacc6","f79646","ffff00","f2f2f2","7f7f7f","ddd9c3","c6d9f0","dbe5f1","f2dcdb","ebf1dd","e5e0ec","dbeef3","fdeada","fff2ca","d8d8d8","595959","c4bd97","8db3e2","b8cce4","e5b9b7","d7e3bc","ccc1d9","b7dde8","fbd5b5","ffe694","bfbfbf","3f3f3f","938953","548dd4","95b3d7","d99694","c3d69b","b2a2c7","b7dde8","fac08f","f2c314","a5a5a5","262626","494429","17365d","366092","953734","76923c","5f497a","92cddc","e36c09","c09100","7f7f7f","0c0c0c","1d1b10","0f243e","244061","632423","4f6128","3f3151","31859b","974806","7f6000"]),o.extend(!0,o.trumbowyg,{opts:{btnsDef:{foreColor:{dropdown:f("foreColor")},backColor:{dropdown:f("backColor")}}}})}(jQuery); \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/images/icons-black-2x.png b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/images/icons-black-2x.png new file mode 100644 index 00000000..1be27fb1 Binary files /dev/null and b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/images/icons-black-2x.png differ diff --git a/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/images/icons-black.png b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/images/icons-black.png new file mode 100644 index 00000000..f98394e4 Binary files /dev/null and b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/images/icons-black.png differ diff --git a/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/images/icons-white-2x.png b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/images/icons-white-2x.png new file mode 100644 index 00000000..4518d226 Binary files /dev/null and b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/images/icons-white-2x.png differ diff --git a/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/images/icons-white.png b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/images/icons-white.png new file mode 100644 index 00000000..a7949e9c Binary files /dev/null and b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/images/icons-white.png differ diff --git a/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/_sprite-black-2x.scss b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/_sprite-black-2x.scss new file mode 100644 index 00000000..402ddfd5 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/_sprite-black-2x.scss @@ -0,0 +1,18 @@ +/** + * Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor + * Colors plugin stylesheet for Trumbowyg editor + * ------------------------ + * @link http://alex-d.github.io/Trumbowyg + * @license MIT + * @author Alexandre Demode (Alex-D) + * Twitter : @AlexandreDemode + * Website : alex-d.fr + */ + +$backcolor-black-2x: 0px 0px; +$forecolor-black-2x: -50px 0px; + + +$sprite-height-black-2x: 50px; +$sprite-width-black-2x: 100px; +$icons-black-2x: "./images/icons-black-2x.png"; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/_sprite-black.scss b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/_sprite-black.scss new file mode 100644 index 00000000..2d84ca03 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/_sprite-black.scss @@ -0,0 +1,18 @@ +/** + * Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor + * Colors plugin stylesheet for Trumbowyg editor + * ------------------------ + * @link http://alex-d.github.io/Trumbowyg + * @license MIT + * @author Alexandre Demode (Alex-D) + * Twitter : @AlexandreDemode + * Website : alex-d.fr + */ + +$backcolor-black: 0px 0px; +$forecolor-black: -25px 0px; + + +$sprite-height-black: 25px; +$sprite-width-black: 50px; +$icons-black: "./images/icons-black.png"; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/_sprite-white-2x.scss b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/_sprite-white-2x.scss new file mode 100644 index 00000000..f90169ad --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/_sprite-white-2x.scss @@ -0,0 +1,18 @@ +/** + * Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor + * Colors plugin stylesheet for Trumbowyg editor + * ------------------------ + * @link http://alex-d.github.io/Trumbowyg + * @license MIT + * @author Alexandre Demode (Alex-D) + * Twitter : @AlexandreDemode + * Website : alex-d.fr + */ + +$backcolor-white-2x: 0px 0px; +$forecolor-white-2x: -50px 0px; + + +$sprite-height-white-2x: 50px; +$sprite-width-white-2x: 100px; +$icons-white-2x: "./images/icons-white-2x.png"; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/_sprite-white.scss b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/_sprite-white.scss new file mode 100644 index 00000000..b7e8f8c1 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/_sprite-white.scss @@ -0,0 +1,18 @@ +/** + * Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor + * Colors plugin stylesheet for Trumbowyg editor + * ------------------------ + * @link http://alex-d.github.io/Trumbowyg + * @license MIT + * @author Alexandre Demode (Alex-D) + * Twitter : @AlexandreDemode + * Website : alex-d.fr + */ + +$backcolor-white: 0px 0px; +$forecolor-white: -25px 0px; + + +$sprite-height-white: 25px; +$sprite-width-white: 50px; +$icons-white: "./images/icons-white.png"; \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/trumbowyg.colors.scss b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/trumbowyg.colors.scss new file mode 100644 index 00000000..4f353fc3 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/sass/trumbowyg.colors.scss @@ -0,0 +1,105 @@ +/** + * Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor + * Colors plugin stylesheet for Trumbowyg editor + * ------------------------ + * @link http://alex-d.github.io/Trumbowyg + * @license MIT + * @author Alexandre Demode (Alex-D) + * Twitter : @AlexandreDemode + * Website : alex-d.fr + */ + +@import "sprite-black"; +@import "sprite-black-2x"; +@import "sprite-white"; +@import "sprite-white-2x"; + +@import "sprite-pos"; + +.foreColor-trumbowyg-dropdown, +.backColor-trumbowyg-dropdown { + width: 276px; + padding: 7px 5px; + + button { + display: block; + position: relative; + float: left; + text-indent: -9999px; + height: 20px; + width: 20px; + border: 1px solid #333; + padding: 0; + margin: 2px; + + &:hover, + &:focus { + &::after { + content: " "; + display: block; + height: 27px; + width: 27px; + background: inherit; + position: absolute; + top: -5px; + left: -5px; + border: 1px solid #FFF; + box-shadow: #000 0 0 2px; + z-index: 10; + } + } + } +} + + + +/* + * Buttons icons + */ +.trumbowyg-button-pane li button { + &.trumbowyg-foreColor-button, + &.trumbowyg-backColor-button { + background-image: url($icons-black); + } + + &.trumbowyg-foreColor-button { @include sprite-pos($forecolor-black); } + &.trumbowyg-backColor-button { @include sprite-pos($backcolor-black); } +} + +.trumbowyg-black { + .trumbowyg-button-pane li button { + &.trumbowyg-foreColor-button, + &.trumbowyg-backColor-button { + background-image: url($icons-white); + } + + &.trumbowyg-foreColor-button { @include sprite-pos($forecolor-white); } + &.trumbowyg-backColor-button { @include sprite-pos($backcolor-white); } + } +} + + +@media only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 4/3), only screen and (min-device-pixel-ratio: 1.3), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){ + .trumbowyg-button-pane li button { + &.trumbowyg-foreColor-button, + &.trumbowyg-backColor-button { + background-image: url($icons-black-2x) !important; + background-size: round($sprite-width-black-2x / 2) round($sprite-height-black-2x / 2) !important; + } + + &.trumbowyg-foreColor-button { @include sprite-pos($forecolor-black-2x, true); } + &.trumbowyg-backColor-button { @include sprite-pos($backcolor-black-2x, true); } + } + + .trumbowyg-black { + .trumbowyg-button-pane li button { + &.trumbowyg-foreColor-button, + &.trumbowyg-backColor-button { + background-image: url($icons-white-2x) !important; + } + + &.trumbowyg-foreColor-button { @include sprite-pos($forecolor-white-2x, true); } + &.trumbowyg-backColor-button { @include sprite-pos($backcolor-white-2x, true); } + } + } +} \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/trumbowyg.colors.css b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/trumbowyg.colors.css new file mode 100644 index 00000000..72561baf --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/trumbowyg.colors.css @@ -0,0 +1,76 @@ +/** + * Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor + * Colors plugin stylesheet for Trumbowyg editor + * ------------------------ + * @link http://alex-d.github.io/Trumbowyg + * @license MIT + * @author Alexandre Demode (Alex-D) + * Twitter : @AlexandreDemode + * Website : alex-d.fr + */ + +.foreColor-trumbowyg-dropdown, +.backColor-trumbowyg-dropdown { + width: 276px; + padding: 7px 5px; } + .foreColor-trumbowyg-dropdown button, + .backColor-trumbowyg-dropdown button { + display: block; + position: relative; + float: left; + text-indent: -9999px; + height: 20px; + width: 20px; + border: 1px solid #333; + padding: 0; + margin: 2px; } + .foreColor-trumbowyg-dropdown button:hover::after, .foreColor-trumbowyg-dropdown button:focus::after, + .backColor-trumbowyg-dropdown button:hover::after, + .backColor-trumbowyg-dropdown button:focus::after { + content: " "; + display: block; + height: 27px; + width: 27px; + background: inherit; + position: absolute; + top: -5px; + left: -5px; + border: 1px solid #FFF; + box-shadow: #000 0 0 2px; + z-index: 10; } + +/* + * Buttons icons + */ +.trumbowyg-button-pane li button.trumbowyg-foreColor-button, .trumbowyg-button-pane li button.trumbowyg-backColor-button { + background-image: url("./images/icons-black.png"); } + +.trumbowyg-button-pane li button.trumbowyg-foreColor-button { + background-position: -20px 5px; } + +.trumbowyg-button-pane li button.trumbowyg-backColor-button { + background-position: 5px 5px; } + +.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-foreColor-button, .trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-backColor-button { + background-image: url("./images/icons-white.png"); } + +.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-foreColor-button { + background-position: -20px 5px; } + +.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-backColor-button { + background-position: 5px 5px; } + +@media only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (min-device-pixel-ratio: 1.3), only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { + .trumbowyg-button-pane li button.trumbowyg-foreColor-button, .trumbowyg-button-pane li button.trumbowyg-backColor-button { + background-image: url("./images/icons-black-2x.png") !important; + background-size: 50px 25px !important; } + .trumbowyg-button-pane li button.trumbowyg-foreColor-button { + background-position: -20px 5px; } + .trumbowyg-button-pane li button.trumbowyg-backColor-button { + background-position: 5px 5px; } + .trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-foreColor-button, .trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-backColor-button { + background-image: url("./images/icons-white-2x.png") !important; } + .trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-foreColor-button { + background-position: -20px 5px; } + .trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-backColor-button { + background-position: 5px 5px; } } diff --git a/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/trumbowyg.colors.min.css b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/trumbowyg.colors.min.css new file mode 100644 index 00000000..6ccc2889 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/colors/ui/trumbowyg.colors.min.css @@ -0,0 +1,2 @@ +/** Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor - alex-d.github.io/Trumbowyg - License MIT - Author : Alexandre Demode (Alex-D) / alex-d.fr */ +.backColor-trumbowyg-dropdown,.foreColor-trumbowyg-dropdown{width:276px;padding:7px 5px}.backColor-trumbowyg-dropdown button,.foreColor-trumbowyg-dropdown button{display:block;position:relative;float:left;text-indent:-9999px;height:20px;width:20px;border:1px solid #333;padding:0;margin:2px}.backColor-trumbowyg-dropdown button:focus::after,.backColor-trumbowyg-dropdown button:hover::after,.foreColor-trumbowyg-dropdown button:focus::after,.foreColor-trumbowyg-dropdown button:hover::after{content:" ";display:block;height:27px;width:27px;background:inherit;position:absolute;top:-5px;left:-5px;border:1px solid #FFF;box-shadow:#000 0 0 2px;z-index:10}.trumbowyg-button-pane li button.trumbowyg-backColor-button,.trumbowyg-button-pane li button.trumbowyg-foreColor-button{background-image:url(images/icons-black.png)}.trumbowyg-button-pane li button.trumbowyg-foreColor-button{background-position:-20px 5px}.trumbowyg-button-pane li button.trumbowyg-backColor-button{background-position:5px 5px}.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-backColor-button,.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-foreColor-button{background-image:url(images/icons-white.png)}.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-foreColor-button{background-position:-20px 5px}.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-backColor-button{background-position:5px 5px}@media only screen and (-webkit-min-device-pixel-ratio:1.3),only screen and (min--moz-device-pixel-ratio:1.3),only screen and (min-device-pixel-ratio:1.3),only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.trumbowyg-button-pane li button.trumbowyg-backColor-button,.trumbowyg-button-pane li button.trumbowyg-foreColor-button{background-image:url(images/icons-black-2x.png)!important;background-size:50px 25px!important}.trumbowyg-button-pane li button.trumbowyg-foreColor-button{background-position:-20px 5px}.trumbowyg-button-pane li button.trumbowyg-backColor-button{background-position:5px 5px}.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-backColor-button,.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-foreColor-button{background-image:url(images/icons-white-2x.png)!important}.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-foreColor-button{background-position:-20px 5px}.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-backColor-button{background-position:5px 5px}} \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/plugins/editlink/trumbowyg.editlink.js b/resources/assets/js/vendor/trumbowyg/plugins/editlink/trumbowyg.editlink.js new file mode 100644 index 00000000..ded1de95 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/editlink/trumbowyg.editlink.js @@ -0,0 +1,112 @@ +/* =========================================================== + * trumbowyg.editlink.js v1.0 + * Link editation plugin for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Rastislav Švarba (ra100) + * Twitter : @ra100 + * Website : ra100.net + */ + +(function ($) { + 'use strict'; + + $.extend(true, $.trumbowyg, { + langs: { + en: { + editLink: 'Edit Link' + }, + fr: { + editLink: 'Editer un lien' + }, + cs: { + editLink: 'Upravit odkaz' + }, + sk: { + editLink: 'Upraviť odkaz' + } + }, + opts: { + btnsDef: { + editLink: { + func: function (params, tbw) { + var t = tbw, + url = '', + title = '', + target = '_blank', + node = '', + edit = false; + + var sel = t.doc.getSelection(); + var range = new Range(); + if (sel.type === 'Caret') { //if range is not selected, select whole element + range.selectNode(sel.baseNode); + sel.addRange(range); + t.saveSelection(); + node = t.selection.commonAncestorContainer; + } else { + if ((sel.anchorOffset + sel.focusOffset) === sel.focusNode.length) { //if selection is large as whole + range.selectNode(sel.focusNode); + sel.addRange(range); + t.saveSelection(); + node = t.selection.commonAncestorContainer; + } else { + t.saveSelection(); + node = t.selection.commonAncestorContainer.parentNode; + } + } + + if (node !== '' && $(node).prop('tagName') === 'A') { + var $a = $(node); + url = $a.attr('href'); + title = ($a.attr('title') !== undefined) ? $a.attr('title') : $a.text(); + target = ($a.attr('target') !== undefined) ? $a.attr('target') : target; + edit = true; + } + + t.openModalInsert(t.lang.editLink, { + url: { + label: 'URL', + required: true, + value: url + }, + title: { + label: t.lang.title, + value: title + }, + text: { + label: t.lang.text, + value: t.getSelectedText() + }, + target: { + label: t.lang.target, + value: target + } + }, function (v) { // v is value + t.execCmd('createLink', v.url); + if (!edit) return true; + var l = $('a[href="' + v.url + '"]:not([title])', t.$box); + if (v.text.length > 0) { + l.text(v.text); + } + if (v.title.length > 0) { + l.attr('title', v.title); + } else { + l.removeAttr('title'); + } + if (v.target.length > 0) { + l.attr('target', v.target); + } else { + l.removeAttr('target'); + } + return true; + }); + } + }, + link: { + dropdown: ['createLink', 'editLink', 'unlink'] + } + } + } + }); +})(jQuery); \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/plugins/editlink/trumbowyg.editlink.min.js b/resources/assets/js/vendor/trumbowyg/plugins/editlink/trumbowyg.editlink.min.js new file mode 100644 index 00000000..94ecee0f --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/editlink/trumbowyg.editlink.min.js @@ -0,0 +1 @@ +!function(e){"use strict";e.extend(!0,e.trumbowyg,{langs:{en:{editLink:"Edit Link"},fr:{editLink:"Editer un lien"},cs:{editLink:"Upravit odkaz"},sk:{editLink:"Upraviť odkaz"}},opts:{btnsDef:{editLink:{func:function(t,n){var a=n,r="",i="",l="_blank",o="",d=!1,c=a.doc.getSelection(),s=new Range;if("Caret"===c.type?(s.selectNode(c.baseNode),c.addRange(s),a.saveSelection(),o=a.selection.commonAncestorContainer):c.anchorOffset+c.focusOffset===c.focusNode.length?(s.selectNode(c.focusNode),c.addRange(s),a.saveSelection(),o=a.selection.commonAncestorContainer):(a.saveSelection(),o=a.selection.commonAncestorContainer.parentNode),""!==o&&"A"===e(o).prop("tagName")){var g=e(o);r=g.attr("href"),i=void 0!==g.attr("title")?g.attr("title"):g.text(),l=void 0!==g.attr("target")?g.attr("target"):l,d=!0}a.openModalInsert(a.lang.editLink,{url:{label:"URL",required:!0,value:r},title:{label:a.lang.title,value:i},text:{label:a.lang.text,value:a.getSelectedText()},target:{label:a.lang.target,value:l}},function(t){if(a.execCmd("createLink",t.url),!d)return!0;var n=e('a[href="'+t.url+'"]:not([title])',a.$box);return t.text.length>0&&n.text(t.text),t.title.length>0?n.attr("title",t.title):n.removeAttr("title"),t.target.length>0?n.attr("target",t.target):n.removeAttr("target"),!0})}},link:{dropdown:["createLink","editLink","unlink"]}}}})}(jQuery); \ No newline at end of file diff --git a/resources/assets/js/vendor/trumbowyg/plugins/preformatted/trumbowyg.preformatted.js b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/trumbowyg.preformatted.js new file mode 100755 index 00000000..64555477 --- /dev/null +++ b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/trumbowyg.preformatted.js @@ -0,0 +1,106 @@ +/* =========================================================== + * trumbowyg.preformatted.js v1.0 + * Preformatted plugin for Trumbowyg + * http://alex-d.github.com/Trumbowyg + * =========================================================== + * Author : Casella Edoardo (Civile) + */ + + +(function ($) { + 'use strict'; + + $.extend(true, $.trumbowyg, { + langs: { + en: { + preformatted: 'Code sample'
+ },
+ fr: {
+ preformatted: 'Exemple de code'
+ },
+ it: {
+ preformatted: 'Codice '
+ }
+ },
+ opts: {
+ btnsDef: {
+ preformatted: {
+ func: function (params, tbw) {
+ var text = String(tbw.doc.getSelection());
+ if (text.replace(/\s/g, '') !== '') {
+ try {
+ var curtag = getSelectionParentElement().tagName.toLowerCase();
+ if (curtag == 'code' || curtag == 'pre') {
+ return unwrapCode();
+ }
+ else {
+ tbw.execCmd('insertHTML', '' + strip(text) + '
');
+ }
+ } catch (e) {
+ }
+ }
+ },
+ ico: 'insertCode'
+ }
+ }
+ },
+ });
+
+ /*
+ * GetSelectionParentElement
+ */
+ function getSelectionParentElement() {
+ var parentEl = null,
+ sel;
+ if (window.getSelection) {
+ sel = window.getSelection();
+ if (sel.rangeCount) {
+ parentEl = sel.getRangeAt(0).commonAncestorContainer;
+ if (parentEl.nodeType != 1) {
+ parentEl = parentEl.parentNode;
+ }
+ }
+ } else if ((sel = document.selection) && sel.type != 'Control') {
+ parentEl = sel.createRange().parentElement();
+ }
+ return parentEl;
+ }
+
+ /*
+ * Strip
+ * returns a text without HTML tags
+ */
+ function strip(html) {
+ var tmp = document.createElement('DIV');
+ tmp.innerHTML = html;
+ return tmp.textContent || tmp.innerText || '';
+ }
+
+ /*
+ * UnwrapCode
+ * ADD/FIX: to improve, works but can be better
+ * "paranoic" solution
+ */
+ function unwrapCode() {
+ var container = null;
+ if (document.selection) //for IE
+ container = document.selection.createRange().parentElement();
+ else {
+ var select = window.getSelection();
+ if (select.rangeCount > 0)
+ container = select.getRangeAt(0).startContainer.parentNode;
+ }
+ //'paranoic' unwrap
+ var ispre = $(container).contents().closest('pre').length;
+ var iscode = $(container).contents().closest('code').length;
+ if (ispre && iscode) {
+ $(container).contents().unwrap('code').unwrap('pre');
+ } else if (ispre) {
+ $(container).contents().unwrap('pre');
+ } else if (iscode) {
+ $(container).contents().unwrap('code');
+ }
+ }
+
+
+})(jQuery);
\ No newline at end of file
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/preformatted/trumbowyg.preformatted.min.js b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/trumbowyg.preformatted.min.js
new file mode 100755
index 00000000..a419fa93
--- /dev/null
+++ b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/trumbowyg.preformatted.min.js
@@ -0,0 +1 @@
+!function(e){"use strict";function t(){var e,t=null;return window.getSelection?(e=window.getSelection(),e.rangeCount&&(t=e.getRangeAt(0).commonAncestorContainer,1!=t.nodeType&&(t=t.parentNode))):(e=document.selection)&&"Control"!=e.type&&(t=e.createRange().parentElement()),t}function n(e){var t=document.createElement("DIV");return t.innerHTML=e,t.textContent||t.innerText||""}function o(){var t=null;if(document.selection)t=document.selection.createRange().parentElement();else{var n=window.getSelection();n.rangeCount>0&&(t=n.getRangeAt(0).startContainer.parentNode)}var o=e(t).contents().closest("pre").length,r=e(t).contents().closest("code").length;o&&r?e(t).contents().unwrap("code").unwrap("pre"):o?e(t).contents().unwrap("pre"):r&&e(t).contents().unwrap("code")}e.extend(!0,e.trumbowyg,{langs:{en:{preformatted:"Code sample "},fr:{preformatted:"Exemple de code"},it:{preformatted:"Codice "}},opts:{btnsDef:{preformatted:{func:function(e,r){var c=String(r.doc.getSelection());if(""!==c.replace(/\s/g,""))try{var a=t().tagName.toLowerCase();if("code"==a||"pre"==a)return o();r.execCmd("insertHTML",""+n(c)+"
")}catch(i){}},ico:"insertCode"}}}})}(jQuery);
\ No newline at end of file
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/images/icons-black-2x.png b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/images/icons-black-2x.png
new file mode 100644
index 00000000..78a6e729
Binary files /dev/null and b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/images/icons-black-2x.png differ
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/images/icons-black.png b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/images/icons-black.png
new file mode 100644
index 00000000..6269bbc8
Binary files /dev/null and b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/images/icons-black.png differ
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/images/icons-white-2x.png b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/images/icons-white-2x.png
new file mode 100644
index 00000000..b7104afc
Binary files /dev/null and b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/images/icons-white-2x.png differ
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/images/icons-white.png b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/images/icons-white.png
new file mode 100644
index 00000000..093306b6
Binary files /dev/null and b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/images/icons-white.png differ
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/_sprite-black-2x.scss b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/_sprite-black-2x.scss
new file mode 100644
index 00000000..af37eef7
--- /dev/null
+++ b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/_sprite-black-2x.scss
@@ -0,0 +1,17 @@
+/**
+ * Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor
+ * Preformatted text supplier
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+$preformatted-black-2x: 0px 0px;
+
+
+$sprite-height-black-2x: 50px;
+$sprite-width-black-2x: 50px;
+$icons-black-2x: "./images/icons-black-2x.png";
\ No newline at end of file
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/_sprite-black.scss b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/_sprite-black.scss
new file mode 100644
index 00000000..361fa886
--- /dev/null
+++ b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/_sprite-black.scss
@@ -0,0 +1,17 @@
+/**
+ * Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor
+ * Preformatted text supplier
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+$preformatted-black: 0px 0px;
+
+
+$sprite-height-black: 25px;
+$sprite-width-black: 25px;
+$icons-black: "./images/icons-black.png";
\ No newline at end of file
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/_sprite-white-2x.scss b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/_sprite-white-2x.scss
new file mode 100644
index 00000000..49f3f604
--- /dev/null
+++ b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/_sprite-white-2x.scss
@@ -0,0 +1,17 @@
+/**
+ * Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor
+ * Preformatted text supplier
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+$preformatted-white-2x: 0px 0px;
+
+
+$sprite-height-white-2x: 50px;
+$sprite-width-white-2x: 50px;
+$icons-white-2x: "./images/icons-white-2x.png";
\ No newline at end of file
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/_sprite-white.scss b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/_sprite-white.scss
new file mode 100644
index 00000000..3821dacd
--- /dev/null
+++ b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/_sprite-white.scss
@@ -0,0 +1,17 @@
+/**
+ * Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor
+ * Preformatted text supplier
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+$preformatted-white: 0px 0px;
+
+
+$sprite-height-white: 25px;
+$sprite-width-white: 25px;
+$icons-white: "./images/icons-white.png";
\ No newline at end of file
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/trumbowyg.preformatted.scss b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/trumbowyg.preformatted.scss
new file mode 100755
index 00000000..f57ab5ef
--- /dev/null
+++ b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/sass/trumbowyg.preformatted.scss
@@ -0,0 +1,56 @@
+/**
+ * Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor
+ * Preformatted text supplier
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+@import "sprite-black";
+@import "sprite-black-2x";
+@import "sprite-white";
+@import "sprite-white-2x";
+
+@import "sprite-pos";
+
+/*
+ * Buttons icons
+ */
+.trumbowyg-button-pane li button {
+ &.trumbowyg-preformatted-button {
+ background-image: url($icons-black);
+ }
+ &.trumbowyg-preformatted-button { @include sprite-pos($preformatted-black); }
+}
+
+.trumbowyg-black {
+ .trumbowyg-button-pane li button {
+ &.trumbowyg-preformatted-button {
+ background-image: url($icons-white);
+ }
+ &.trumbowyg-preformatted-button { @include sprite-pos($preformatted-white); }
+ }
+}
+
+
+@media only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (-o-min-device-pixel-ratio: 4/3), only screen and (min-device-pixel-ratio: 1.3), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){
+ .trumbowyg-button-pane li button {
+ &.trumbowyg-preformatted-button {
+ background-image: url($icons-black-2x) !important;
+ background-size: round($sprite-width-black-2x / 2) round($sprite-height-black-2x / 2) !important;
+ }
+ &.trumbowyg-preformatted-button { @include sprite-pos($preformatted-black-2x, true); }
+ }
+
+ .trumbowyg-black {
+ .trumbowyg-button-pane li button {
+ &.trumbowyg-preformatted-button {
+ background-image: url($icons-white-2x) !important;
+ }
+ &.trumbowyg-preformatted-button { @include sprite-pos($preformatted-white-2x, true); }
+ }
+ }
+}
\ No newline at end of file
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/trumbowyg.preformatted.css b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/trumbowyg.preformatted.css
new file mode 100755
index 00000000..2aac95c2
--- /dev/null
+++ b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/trumbowyg.preformatted.css
@@ -0,0 +1,36 @@
+/**
+ * Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor
+ * Preformatted text supplier
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+/*
+ * Buttons icons
+ */
+.trumbowyg-button-pane li button.trumbowyg-preformatted-button {
+ background-image: url("./images/icons-black.png"); }
+
+.trumbowyg-button-pane li button.trumbowyg-preformatted-button {
+ background-position: 5px 5px; }
+
+.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-preformatted-button {
+ background-image: url("./images/icons-white.png"); }
+
+.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-preformatted-button {
+ background-position: 5px 5px; }
+
+@media only screen and (-webkit-min-device-pixel-ratio: 1.3), only screen and (min--moz-device-pixel-ratio: 1.3), only screen and (min-device-pixel-ratio: 1.3), only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) {
+ .trumbowyg-button-pane li button.trumbowyg-preformatted-button {
+ background-image: url("./images/icons-black-2x.png") !important;
+ background-size: 25px 25px !important; }
+ .trumbowyg-button-pane li button.trumbowyg-preformatted-button {
+ background-position: 5px 5px; }
+ .trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-preformatted-button {
+ background-image: url("./images/icons-white-2x.png") !important; }
+ .trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-preformatted-button {
+ background-position: 5px 5px; } }
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/trumbowyg.preformatted.min.css b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/trumbowyg.preformatted.min.css
new file mode 100755
index 00000000..833e5caf
--- /dev/null
+++ b/resources/assets/js/vendor/trumbowyg/plugins/preformatted/ui/trumbowyg.preformatted.min.css
@@ -0,0 +1,2 @@
+/** Trumbowyg v2.0.0-beta.7 - A lightweight WYSIWYG editor - alex-d.github.io/Trumbowyg - License MIT - Author : Alexandre Demode (Alex-D) / alex-d.fr */
+.trumbowyg-button-pane li button.trumbowyg-preformatted-button{background-image:url(images/icons-black.png);background-position:5px 5px}.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-preformatted-button{background-image:url(images/icons-white.png);background-position:5px 5px}@media only screen and (-webkit-min-device-pixel-ratio:1.3),only screen and (min--moz-device-pixel-ratio:1.3),only screen and (min-device-pixel-ratio:1.3),only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.trumbowyg-button-pane li button.trumbowyg-preformatted-button{background-image:url(images/icons-black-2x.png)!important;background-size:25px 25px!important;background-position:5px 5px}.trumbowyg-black .trumbowyg-button-pane li button.trumbowyg-preformatted-button{background-image:url(images/icons-white-2x.png)!important;background-position:5px 5px}}
\ No newline at end of file
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/upload/trumbowyg.upload.js b/resources/assets/js/vendor/trumbowyg/plugins/upload/trumbowyg.upload.js
new file mode 100644
index 00000000..77284982
--- /dev/null
+++ b/resources/assets/js/vendor/trumbowyg/plugins/upload/trumbowyg.upload.js
@@ -0,0 +1,187 @@
+/* ===========================================================
+ * trumbowyg.upload.js v1.1
+ * Upload plugin for Trumbowyg
+ * http://alex-d.github.com/Trumbowyg
+ * ===========================================================
+ * Author : Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+(function ($) {
+ 'use strict';
+
+ function getDeep(object, propertyParts) {
+ var mainProperty = propertyParts.shift(),
+ otherProperties = propertyParts;
+
+ if (object !== null) {
+ if (otherProperties.length === 0) {
+ return object[mainProperty];
+ }
+
+ if (typeof object === 'object') {
+ return getDeep(object[mainProperty], otherProperties);
+ }
+ }
+ return object;
+ }
+
+ addXhrProgressEvent();
+
+ $.extend(true, $.trumbowyg, {
+ langs: {
+ en: {
+ upload: 'Upload',
+ file: 'File',
+ uploadError: 'Error'
+ },
+ sk: {
+ upload: 'Nahrať',
+ file: 'Súbor',
+ uploadError: 'Chyba'
+ },
+ fr: {
+ upload: 'Envoi',
+ file: 'Fichier',
+ uploadError: 'Erreur'
+ },
+ cs: {
+ upload: 'Nahrát obrázek',
+ file: 'Soubor',
+ uploadError: 'Chyba'
+ }
+ },
+
+ upload: {
+ serverPath: './src/plugins/upload/trumbowyg.upload.php',
+ fileFieldName: 'fileToUpload',
+ data: [],
+ headers: {},
+ urlPropertyName: 'file',
+ statusPropertyName: 'success',
+ success: undefined,
+ error: undefined
+ },
+
+ opts: {
+ btnsDef: {
+ upload: {
+ func: function (params, tbw) {
+ var file,
+ prefix = tbw.o.prefix;
+
+ var $modal = tbw.openModalInsert(
+ // Title
+ tbw.lang.upload,
+
+ // Fields
+ {
+ file: {
+ type: 'file',
+ required: true
+ },
+ alt: {
+ label: 'description'
+ }
+ },
+
+ // Callback
+ function (values) {
+ var data = new FormData();
+ data.append($.trumbowyg.upload.fileFieldName, file);
+
+ $.trumbowyg.upload.data.map(function (cur) {
+ data.append(cur.name, cur.value);
+ });
+
+ if ($('.' + prefix + 'progress', $modal).length === 0) {
+ $('.' + prefix + 'modal-title', $modal)
+ .after(
+ $('', {
+ 'class': prefix + 'progress'
+ }).append(
+ $('', {
+ 'class': prefix + 'progress-bar'
+ })
+ )
+ );
+ }
+
+ $.ajax({
+ url: $.trumbowyg.upload.serverPath,
+ headers: $.trumbowyg.upload.headers,
+ type: 'POST',
+ data: data,
+ cache: false,
+ dataType: 'json',
+ processData: false,
+ contentType: false,
+
+ progressUpload: function (e) {
+ $('.' + prefix + 'progress-bar').stop().animate({
+ width: Math.round(e.loaded * 100 / e.total) + '%'
+ }, 200);
+ },
+
+ success: $.trumbowyg.upload.success || function (data) {
+ if (!!getDeep(data, $.trumbowyg.upload.statusPropertyName.split('.'))) {
+ var url = getDeep(data, $.trumbowyg.upload.urlPropertyName.split('.'));
+ tbw.execCmd('insertImage', url);
+ $('img[src="' + url + '"]:not([alt])', tbw.$box).attr('alt', values.alt);
+ setTimeout(function () {
+ tbw.closeModal();
+ }, 250);
+ } else {
+ tbw.addErrorOnModalField(
+ $('input[type=file]', $modal),
+ tbw.lang[data.message]
+ );
+ }
+ },
+ error: $.trumbowyg.upload.error || function () {
+ tbw.addErrorOnModalField(
+ $('input[type=file]', $modal),
+ tbw.lang.uploadError
+ );
+ }
+ });
+ }
+ );
+
+ $('input[type=file]').on('change', function (e) {
+ try {
+ // If multiple files allowed, we just get the first.
+ file = e.target.files[0];
+ } catch (err) {
+ // In IE8, multiple files not allowed
+ file = e.target.value;
+ }
+ });
+ },
+ ico: 'insertImage'
+ }
+ }
+ }
+ });
+
+
+ function addXhrProgressEvent() {
+ if (!$.trumbowyg && !$.trumbowyg.addedXhrProgressEvent) { // Avoid adding progress event multiple times
+ var originalXhr = $.ajaxSettings.xhr;
+ $.ajaxSetup({
+ xhr: function () {
+ var req = originalXhr(),
+ that = this;
+ if (req && typeof req.upload == 'object' && that.progressUpload !== undefined)
+ req.upload.addEventListener('progress', function (e) {
+ that.progressUpload(e);
+ }, false);
+
+ return req;
+ }
+ });
+ $.trumbowyg.addedXhrProgressEvent = true;
+ }
+ }
+})(jQuery);
diff --git a/resources/assets/js/vendor/trumbowyg/plugins/upload/trumbowyg.upload.min.js b/resources/assets/js/vendor/trumbowyg/plugins/upload/trumbowyg.upload.min.js
new file mode 100644
index 00000000..43c401b7
--- /dev/null
+++ b/resources/assets/js/vendor/trumbowyg/plugins/upload/trumbowyg.upload.min.js
@@ -0,0 +1 @@
+!function(r){"use strict";function e(r,a){var o=a.shift(),t=a;if(null!==r){if(0===t.length)return r[o];if("object"==typeof r)return e(r[o],t)}return r}function a(){if(!r.trumbowyg&&!r.trumbowyg.addedXhrProgressEvent){var e=r.ajaxSettings.xhr;r.ajaxSetup({xhr:function(){var r=e(),a=this;return r&&"object"==typeof r.upload&&void 0!==a.progressUpload&&r.upload.addEventListener("progress",function(r){a.progressUpload(r)},!1),r}}),r.trumbowyg.addedXhrProgressEvent=!0}}a(),r.extend(!0,r.trumbowyg,{langs:{en:{upload:"Upload",file:"File",uploadError:"Error"},sk:{upload:"Nahrať",file:"Súbor",uploadError:"Chyba"},fr:{upload:"Envoi",file:"Fichier",uploadError:"Erreur"},cs:{upload:"Nahrát obrázek",file:"Soubor",uploadError:"Chyba"}},upload:{serverPath:"./src/plugins/upload/trumbowyg.upload.php",fileFieldName:"fileToUpload",data:[],headers:{},urlPropertyName:"file",statusPropertyName:"success",success:void 0,error:void 0},opts:{btnsDef:{upload:{func:function(a,o){var t,l=o.o.prefix,u=o.openModalInsert(o.lang.upload,{file:{type:"file",required:!0},alt:{label:"description"}},function(a){var s=new FormData;s.append(r.trumbowyg.upload.fileFieldName,t),r.trumbowyg.upload.data.map(function(r){s.append(r.name,r.value)}),0===r("."+l+"progress",u).length&&r("."+l+"modal-title",u).after(r("",{"class":l+"progress"}).append(r("",{"class":l+"progress-bar"}))),r.ajax({url:r.trumbowyg.upload.serverPath,headers:r.trumbowyg.upload.headers,type:"POST",data:s,cache:!1,dataType:"json",processData:!1,contentType:!1,progressUpload:function(e){r("."+l+"progress-bar").stop().animate({width:Math.round(100*e.loaded/e.total)+"%"},200)},success:r.trumbowyg.upload.success||function(t){if(e(t,r.trumbowyg.upload.statusPropertyName.split("."))){var l=e(t,r.trumbowyg.upload.urlPropertyName.split("."));o.execCmd("insertImage",l),r('img[src="'+l+'"]:not([alt])',o.$box).attr("alt",a.alt),setTimeout(function(){o.closeModal()},250)}else o.addErrorOnModalField(r("input[type=file]",u),o.lang[t.message])},error:r.trumbowyg.upload.error||function(){o.addErrorOnModalField(r("input[type=file]",u),o.lang.uploadError)}})});r("input[type=file]").on("change",function(r){try{t=r.target.files[0]}catch(e){t=r.target.value}})},ico:"insertImage"}}}})}(jQuery);
\ No newline at end of file
diff --git a/resources/assets/js/vendor/trumbowyg/trumbowyg.js b/resources/assets/js/vendor/trumbowyg/trumbowyg.js
new file mode 100644
index 00000000..cc54346c
--- /dev/null
+++ b/resources/assets/js/vendor/trumbowyg/trumbowyg.js
@@ -0,0 +1,1213 @@
+/**
+ * Trumbowyg v2.0.0-beta.5 - A lightweight WYSIWYG editor
+ * Trumbowyg core file
+ * ------------------------
+ * @link http://alex-d.github.io/Trumbowyg
+ * @license MIT
+ * @author Alexandre Demode (Alex-D)
+ * Twitter : @AlexandreDemode
+ * Website : alex-d.fr
+ */
+
+jQuery.trumbowyg = {
+ langs: {
+ en: {
+ viewHTML: "View HTML",
+
+ formatting: "Formatting",
+ p: "Paragraph",
+ blockquote: "Quote",
+ code: "Code",
+ header: "Header",
+
+ bold: "Bold",
+ italic: "Italic",
+ strikethrough: "Stroke",
+ underline: "Underline",
+
+ strong: "Strong",
+ em: "Emphasis",
+ del: "Deleted",
+
+ unorderedList: "Unordered list",
+ orderedList: "Ordered list",
+
+ insertImage: "Insert Image",
+ insertVideo: "Insert Video",
+ link: "Link",
+ createLink: "Insert link",
+ unlink: "Remove link",
+
+ justifyLeft: "Align Left",
+ justifyCenter: "Align Center",
+ justifyRight: "Align Right",
+ justifyFull: "Align Justify",
+
+ horizontalRule: "Insert horizontal rule",
+ removeformat: "Remove format",
+
+ fullscreen: "fullscreen",
+
+ close: "Close",
+
+ submit: "Confirm",
+ reset: "Cancel",
+
+ required: "Required",
+ description: "Description",
+ title: "Title",
+ text: "Text",
+ target: "Target"
+ }
+ },
+
+ // User default options
+ opts: {},
+
+ btnsGrps: {
+ design: ['bold', 'italic', 'underline', 'strikethrough'],
+ semantic: ['strong', 'em', 'del'],
+ justify: ['justifyLeft', 'justifyCenter', 'justifyRight', 'justifyFull'],
+ lists: ['unorderedList', 'orderedList']
+ }
+};
+
+
+(function (navigator, window, document, $, undefined) {
+ 'use strict';
+
+ // @param : o are options
+ // @param : p are params
+ $.fn.trumbowyg = function (options, params) {
+ if (options === Object(options) || !options) {
+ return this.each(function () {
+ if (!$(this).data('trumbowyg'))
+ $(this).data('trumbowyg', new Trumbowyg(this, options));
+ });
+ }
+ if (this.length === 1) {
+ try {
+ var t = $(this).data('trumbowyg');
+ switch (options) {
+ // Modal box
+ case 'openModal':
+ return t.openModal(params.title, params.content);
+ case 'closeModal':
+ return t.closeModal();
+ case 'openModalInsert':
+ return t.openModalInsert(params.title, params.fields, params.callback);
+
+ // Selection
+ case 'saveSelection':
+ return t.saveSelection();
+ case 'getSelection':
+ return t.selection;
+ case 'getSelectedText':
+ return t.getSelectedText();
+ case 'restoreSelection':
+ return t.restoreSelection();
+
+ // Destroy
+ case 'destroy':
+ return t.destroy();
+
+ // Empty
+ case 'empty':
+ return t.empty();
+
+ // Public options
+ case 'lang':
+ return t.lang;
+
+ // HTML
+ case 'html':
+ return t.html(params);
+ }
+ } catch (e) {
+ }
+ }
+
+ return false;
+ };
+
+ // @param : editorElem is the DOM element
+ // @param : o are options
+ var Trumbowyg = function (editorElem, o) {
+ var t = this;
+ // Get the document of the element. It use to makes the plugin
+ // compatible on iframes.
+ t.doc = editorElem.ownerDocument || document;
+ // jQuery object of the editor
+ t.$ta = $(editorElem); // $ta : Textarea
+ t.$c = $(editorElem); // $c : creator
+
+ // Extend with options
+ o = $.extend(true, {}, o, $.trumbowyg.opts);
+
+ // Localization management
+ if (typeof o.lang === 'undefined' || typeof $.trumbowyg.langs[o.lang] === 'undefined')
+ t.lang = $.trumbowyg.langs.en;
+ else
+ t.lang = $.extend(true, {}, $.trumbowyg.langs.en, $.trumbowyg.langs[o.lang]);
+
+ // Header translation
+ var h = t.lang.header;
+
+ // Defaults Options
+ t.o = $.extend(true, {}, {
+ lang: 'en',
+ dir: 'ltr',
+
+ closable: false,
+ fullscreenable: true,
+ fixedBtnPane: false,
+ fixedFullWidth: false,
+ autogrow: false,
+
+ prefix: 'trumbowyg-',
+
+ // WYSIWYG only
+ semantic: true,
+ resetCss: false,
+ removeformatPasted: false,
+ tagsToRemove: [],
+
+ btns: [
+ 'viewHTML',
+ '|', 'formatting',
+ '|', 'btnGrp-design',
+ '|', 'link',
+ '|', 'insertImage',
+ '|', 'btnGrp-justify',
+ '|', 'btnGrp-lists',
+ '|', 'horizontalRule',
+ '|', 'removeformat'
+ ],
+ btnsAdd: [],
+
+ /**
+ * When the button is associated to a empty object
+ * func and title attributs are defined from the button key value
+ *
+ * For example
+ * foo: {}
+ * is equivalent to :
+ * foo: {
+ * func: 'foo',
+ * title: this.lang.foo
+ * }
+ */
+ btnsDef: {
+ viewHTML: {
+ func: 'toggle'
+ },
+
+ p: {
+ func: 'formatBlock'
+ },
+ blockquote: {
+ func: 'formatBlock'
+ },
+ h1: {
+ func: 'formatBlock',
+ title: h + ' 1'
+ },
+ h2: {
+ func: 'formatBlock',
+ title: h + ' 2'
+ },
+ h3: {
+ func: 'formatBlock',
+ title: h + ' 3'
+ },
+ h4: {
+ func: 'formatBlock',
+ title: h + ' 4'
+ },
+
+ bold: {
+ key: 'B'
+ },
+ italic: {
+ key: 'I'
+ },
+ underline: {},
+ strikethrough: {},
+
+ strong: {
+ func: 'bold',
+ key: 'B'
+ },
+ em: {
+ func: 'italic',
+ key: 'I'
+ },
+ del: {
+ func: 'strikethrough'
+ },
+
+ createLink: {
+ key: 'K'
+ },
+ unlink: {},
+
+ insertImage: {},
+
+ justifyLeft: {},
+ justifyCenter: {},
+ justifyRight: {},
+ justifyFull: {},
+
+ unorderedList: {
+ func: 'insertUnorderedList'
+ },
+ orderedList: {
+ func: 'insertOrderedList'
+ },
+
+ horizontalRule: {
+ func: 'insertHorizontalRule'
+ },
+
+ removeformat: {},
+
+ // Dropdowns
+ formatting: {
+ dropdown: ['p', 'blockquote', 'h1', 'h2', 'h3', 'h4']
+ },
+ link: {
+ dropdown: ['createLink', 'unlink']
+ }
+ },
+
+ inlineElementsSelector: 'a, abbr, acronym, b, caption, cite, code, col, dfn, dir, dt, dd, em, font, hr, i, kbd, li, q, span, strikeout, strong, sub, sup, u'
+ }, o);
+
+ if (o.btns)
+ t.o.btns = o.btns;
+ else if (t.o.semantic)
+ t.o.btns[4] = 'btnGrp-semantic';
+
+ // Keyboard shortcuts are load in this array
+ t.keys = [];
+
+ t.init();
+ };
+
+ Trumbowyg.prototype = {
+ init: function () {
+ var t = this;
+ t.height = t.$ta.height();
+
+ t.buildEditor();
+ t.buildBtnPane();
+
+ t.fixedBtnPaneEvents();
+
+ t.buildOverlay();
+ },
+
+ buildEditor: function () {
+ var t = this,
+ prefix = t.o.prefix,
+ html = '';
+
+ t.$box = $('', {
+ 'class': prefix + 'box ' + prefix + 'editor-visible ' + prefix + t.o.lang + ' trumbowyg'
+ });
+
+ // $ta = Textarea
+ // $ed = Editor
+ t.isTextarea = t.$ta.is('textarea');
+ if (t.isTextarea) {
+ html = t.$ta.val();
+ t.$ed = $('');
+ t.$box
+ .insertAfter(t.$ta)
+ .append(t.$ed, t.$ta);
+ } else {
+ t.$ed = t.$ta;
+ html = t.$ed.html();
+
+ t.$ta = $('', {
+ name: t.$ta.attr('id'),
+ height: t.height
+ }).val(html);
+
+ t.$box
+ .insertAfter(t.$ed)
+ .append(t.$ta, t.$ed);
+ t.syncCode();
+ }
+
+ t.$ta
+ .addClass(prefix + 'textarea')
+ .attr('tabindex', -1)
+ ;
+
+ t.$ed
+ .addClass(prefix + 'editor')
+ .attr({
+ 'contenteditable': true,
+ 'dir': t.lang._dir || t.o.dir
+ })
+ .html(html)
+ ;
+
+ if (t.o.tabindex) {
+ t.$ed.attr('tabindex', t.o.tabindex);
+ }
+
+ if (t.$c.is('[placeholder]')) {
+ t.$ed.attr('placeholder', t.$c.attr('placeholder'));
+ }
+
+ if (t.o.resetCss) {
+ t.$ed.addClass(prefix + 'reset-css');
+ }
+
+ if (!t.o.autogrow) {
+ t.$ta.add(t.$ed).css({
+ height: t.height
+ });
+ }
+
+ t.semanticCode();
+
+
+ t._ctrl = false;
+ t.$ed
+ .on('dblclick', 'img', function () {
+ var $img = $(this);
+ t.openModalInsert(t.lang.insertImage, {
+ url: {
+ label: 'URL',
+ value: $img.attr('src'),
+ required: true
+ },
+ alt: {
+ label: t.lang.description,
+ value: $img.attr('alt')
+ }
+ }, function (v) {
+ return $img.attr({
+ src: v.url,
+ alt: v.alt
+ });
+ });
+ return false;
+ })
+ .on('keydown', function (e) {
+ t._composition = (e.which === 229);
+
+ if (e.ctrlKey) {
+ t._ctrl = true;
+ var k = t.keys[String.fromCharCode(e.which).toUpperCase()];
+
+ try {
+ t.execCmd(k.func, k.param);
+ return false;
+ } catch (e) {
+ }
+ }
+ })
+ .on('keyup', function (e) {
+ if (!t._ctrl && e.which !== 17 && !t._composition) {
+ t.semanticCode(false, e.which === 13);
+ t.$c.trigger('tbwchange');
+ }
+
+ setTimeout(function () {
+ t._ctrl = false;
+ }, 200);
+ })
+ .on('focus blur', function (e) {
+ t.$c.trigger('tbw' + e.type);
+ })
+ .on('paste', function (e) {
+ if (t.o.removeformatPasted) {
+ e.preventDefault();
+
+ try {
+ // IE
+ var text = window.clipboardData.getData("Text");
+
+ try {
+ // <= IE10
+ t.doc.selection.createRange().pasteHTML(text);
+ } catch (err) {
+ // IE 11
+ t.doc.getSelection().getRangeAt(0).insertNode(document.createTextNode(text));
+ }
+ } catch (err) {
+ // Not IE
+ t.execCmd('insertText', (e.originalEvent || e).clipboardData.getData('text/plain'));
+ }
+ }
+
+ setTimeout(function () {
+ if (t.o.semantic) {
+ t.semanticCode(false, true);
+ } else {
+ t.syncCode();
+ }
+ t.$c.trigger('tbwpaste', e);
+ }, 0);
+
+ });
+ t.$ta.on('keyup paste', function () {
+ t.$c.trigger('tbwchange');
+ });
+
+ $(t.doc).on('keydown', function (e) {
+ if (e.which === 27) {
+ t.closeModal();
+ return false;
+ }
+ });
+ },
+
+
+ // Build button pane, use o.btns and o.btnsAdd options
+ buildBtnPane: function () {
+ var t = this,
+ prefix = t.o.prefix;
+
+ if (t.o.btns === false)
+ return;
+
+ t.$btnPane = $('+ semanticCode: function (force, full) { + var t = this; + t.syncCode(force); + t.saveSelection(); + + if (t.o.tagsToRemove.length > 0) { + $(t.o.tagsToRemove.join(', '), t.$ed).remove(); + } + + if (t.o.semantic) { + t.semanticTag('b', 'strong'); + t.semanticTag('i', 'em'); + t.semanticTag('strike', 'del'); + + if (full) { + var inlineElementsSelector = t.o.inlineElementsSelector, + blockElementsSelector = ':not(' + t.o.inlineElementsSelector + ')'; + + // Wrap text nodes in span for easier processing + t.$ed.contents().filter(function () { + return this.nodeType === 3 && $.trim(this.nodeValue).length > 0; + }).wrap(''); + + // Wrap groups of inline elements in paragraphs (recursive) + var wrapInlinesInParagraphsFrom = function ($from) { + if ($from.length !== 0) { + var $finalParagraph = $from.nextUntil(blockElementsSelector).andSelf() + .wrapAll('
').parent(); + + $finalParagraph.next('br').remove(); + + var $nextElement = $finalParagraph.nextAll(inlineElementsSelector).first(); + if ($nextElement.length) { + wrapInlinesInParagraphsFrom($nextElement); + } + } + }; + wrapInlinesInParagraphsFrom(t.$ed.children(inlineElementsSelector).first()); + + t.semanticTag('div', 'p', true); + + // Unwrap paragraphs content, containing nothing usefull + t.$ed.find('p').filter(function () { + if (t.selection && this === t.selection.startContainer) { + // Don't remove currently being edited element + return false; + } + return $(this).text().trim().length === 0 && $(this).children().not('br, span').length === 0; + }).contents().unwrap(); + + // Get rid of temporial span's + $('[data-trumbowyg-textnode]', t.$ed).contents().unwrap(); + + // Replace empty with
(IE loves adding empty
)
+ t.$ed.find('p:empty').replaceWith('
');
+ }
+
+ t.restoreSelection();
+
+ t.$ta.val(t.$ed.html());
+ }
+ },
+
+ semanticTag: function (oldTag, newTag, copyAttributes) {
+ $(oldTag, this.$ed).each(function () {
+ var $oldTag = $(this);
+ $oldTag.wrap('<' + newTag + '/>');
+ if (copyAttributes) {
+ $.each($oldTag.prop('attributes'), function () {
+ $oldTag.parent().attr(this.name, this.value);
+ });
+ }
+ $oldTag.contents().unwrap();
+ });
+ },
+
+ // Function call when user click on "Insert Link"
+ createLink: function () {
+ var t = this;
+ t.saveSelection();
+ t.openModalInsert(t.lang.createLink, {
+ url: {
+ label: 'URL',
+ required: true
+ },
+ title: {
+ label: t.lang.title
+ },
+ text: {
+ label: t.lang.text,
+ value: t.getSelectedText()
+ },
+ target: {
+ label: t.lang.target
+ }
+ }, function (v) { // v is value
+ var link = $(['', v.text, ''].join(''));
+ if (v.title.length > 0)
+ link.attr('title', v.title);
+ if (v.target.length > 0)
+ link.attr('target', v.target);
+ t.selection.deleteContents();
+ t.selection.insertNode(link.get(0));
+ t.restoreSelection();
+ return true;
+ });
+ },
+ insertImage: function () {
+ var t = this;
+ t.saveSelection();
+ t.openModalInsert(t.lang.insertImage, {
+ url: {
+ label: 'URL',
+ required: true
+ },
+ alt: {
+ label: t.lang.description,
+ value: t.getSelectedText()
+ }
+ }, function (v) { // v are values
+ t.execCmd('insertImage', v.url);
+ $('img[src="' + v.url + '"]:not([alt])', t.$box).attr('alt', v.alt);
+ return true;
+ });
+ },
+
+
+ /*
+ * Call method of trumbowyg if exist
+ * else try to call anonymous function
+ * and finaly native execCommand
+ */
+ execCmd: function (cmd, param) {
+ var t = this;
+ if (cmd != 'dropdown')
+ t.$ed.focus();
+
+ try {
+ t[cmd](param);
+ } catch (e) {
+ try {
+ cmd(param, t);
+ } catch (e2) {
+ if (cmd == 'insertHorizontalRule')
+ param = null;
+ else if (cmd == 'formatBlock' && (navigator.userAgent.indexOf('MSIE') !== -1 || navigator.appVersion.indexOf('Trident/') !== -1))
+ param = '<' + param + '>';
+
+ t.doc.execCommand(cmd, false, param);
+ }
+ }
+
+ if (cmd != 'dropdown')
+ t.syncCode();
+ },
+
+
+ // Open a modal box
+ openModal: function (title, content) {
+ var t = this,
+ prefix = t.o.prefix;
+
+ // No open a modal box when exist other modal box
+ if ($('.' + prefix + 'modal-box', t.$box).length > 0)
+ return false;
+
+ t.saveSelection();
+ t.showOverlay();
+
+ // Disable all btnPane btns
+ t.$btnPane.addClass(prefix + 'disable');
+
+ // Build out of ModalBox, it's the mask for animations
+ var $modal = $('