Merge branch 'cwbs_template' of binarity.cz:/opt/git/internal/cms/minicms into cwbs_template

This commit is contained in:
peter
2016-04-01 19:37:29 +02:00
99 changed files with 2952 additions and 136 deletions
+11 -14
View File
@@ -1,23 +1,20 @@
APP_ENV=local
APP_ENV=testing
APP_DEBUG=true
APP_KEY=SomeRandomString
APP_KEY=
DB_HOST=localhost
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync
REDIS_HOST=localhost
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_USERNAME=@binarity.cz
MAIL_PASSWORD=
MAIL_DRIVER=smtp
MAIL_HOST=mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
SITE_URL=/
UPLOAD_URL=/public/uploads
THUMBNAILS_URL=/uploads/thumbnails
THEME=
+1
View File
@@ -2,6 +2,7 @@
/resources/views/modules
/public/modules
/resources/views/vendor
/public/assets
# directories with custom templates
**/views/**/custom/*
+65
View File
@@ -0,0 +1,65 @@
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class SetupDatabase extends Command
{
/**
* The name and signature of the console command.
* @var string
*/
protected $signature = 'db:setup {host} {user} {password} {database}';
/**
* The console command description.
* @var string
*/
protected $description = 'Setup database credentials';
/**
* Create a new command instance.
* @return void
*/
public function __construct()
{
parent::__construct();
}
/**
* Execute the console command.
* @return mixed
*/
public function handle()
{
echo "zpracovavam";
$host = $this->argument('host');
$user = $this->argument('user');
$password = $this->argument('password');
$database = $this->argument('database');
// try to connect with this settings
// @todo add credentials verification
// if pass, proceed to creating .env file
$parameters = [
'DB_HOST' => $host,
'DB_USERNAME' => $user,
'DB_PASSWORD' => $password,
'DB_DATABASE' => $database
];
$envPath = base_path('.env');
$env = file_get_contents($envPath);
if (!file_exists($envPath))
$env = file_get_contents($envPath.'.example');
foreach ($parameters as $parameter => $value) {
$env = preg_replace('/'.$parameter.'=(.*)/i', $parameter.'='.$value, $env);
}
file_put_contents($envPath, $env);
}
}
+5 -5
View File
@@ -65,7 +65,7 @@ abstract class Handler implements AppHandler
// create instance of main menu
\Menu::create('mainMenu', function ($menu) {
$menu->route('admin.dashboard', trans('admin/mainMenu.dashboard'), [], 10, ['icon' => 'fa fa-dashboard']);
// $menu->route('admin.dashboard', trans('admin/mainMenu.dashboard'), [], 10, ['icon' => 'fa fa-dashboard']);
$menu->dropdown(trans('admin/mainMenu.userManagement'), function ($sub) {
$sub->route('users.new', trans('admin/mainMenu.newUser'), [], 10, ['icon' => 'fa fa-user-plus']);
$sub->route('users.detail', trans('admin/mainMenu.userDetail'), [], 20, ['icon' => 'fa fa-user']);
@@ -118,10 +118,10 @@ abstract class Handler implements AppHandler
}
}, 29, ['icon' => 'fa fa-folder-open']);
}
$menu->dropdown(trans('admin/mainMenu.customFields'), function ($sub) {
$sub->route('customfields.new', trans('admin/mainMenu.customFieldsNew'), [], 10, ['icon' => 'fa fa-code']);
$sub->route('customfields.overview', trans('admin/mainMenu.customFieldsOverview'), [], 50, ['icon' => 'fa fa-code-fork']);
}, 30, ['icon' => 'fa fa-code']);
// $menu->dropdown(trans('admin/mainMenu.customFields'), function ($sub) {
// $sub->route('customfields.new', trans('admin/mainMenu.customFieldsNew'), [], 10, ['icon' => 'fa fa-code']);
// $sub->route('customfields.overview', trans('admin/mainMenu.customFieldsOverview'), [], 50, ['icon' => 'fa fa-code-fork']);
// }, 30, ['icon' => 'fa fa-code']);
$menu->route('log.overview', trans('admin/mainMenu.actionLog'), [], 40, ['icon' => 'fa fa-history']);
$menu->route('settings.overview', trans('admin/mainMenu.settings'), [], 50, ['icon' => 'fa fa-gear']);
});
+2 -2
View File
@@ -39,8 +39,8 @@ class History implements HistoryHandler
break;
default:
return trans('admin/history.changedFromTo', [
'from' => $changeset->old_value,
'to' => $changeset->new_value
'from' => is_null($changeset->old_value) ? trans('admin/history.emptyValue') : $changeset->old_value,
'to' => is_null($changeset->new_value) ? trans('admin/history.emptyValue') : $changeset->new_value,
]);
break;
}
@@ -21,7 +21,6 @@ class TemplateRegistrator
protected $namespace;
/**
* @var string absolute path to currently registered directory
*
* This variable is set in register() method as $baseDirectory/$path
*/
protected $registeredPath;
@@ -78,7 +77,6 @@ class TemplateRegistrator
/**
* Registers new template path.
*
* This method registeres given path itself with all subdirectories
*
* @param string $path path relatively to root of the project
@@ -140,7 +138,13 @@ class TemplateRegistrator
{
// skip custom directories (contains updated templates only)
$dirName = basename($path);
if ($dirName == Template::EDITED_TEMPLATES_DIRECTORY) {
$ignoredDirectories = [
Template::EDITED_TEMPLATES_DIRECTORY,
Template::ASSETS_DIRECTORY,
Template::MODULES_DIRECTORY
];
if (in_array($dirName, $ignoredDirectories)) {
return;
}
@@ -156,7 +160,6 @@ class TemplateRegistrator
/**
* Registers all templates
*
* This method takes all templates in given directory and registers them into database. Templates registered in
* this way may be used for further manipulation.
*
@@ -259,7 +262,6 @@ class TemplateRegistrator
/**
* Get template name
*
* Converts path to template to corresponding name
*
* @param $template
@@ -38,9 +38,9 @@ class WidgetRegistrator
'name' => $widgetName,
'description' => $widgetDescription
]);
}
// install widget (if neccessary)
call_user_func($classname . '::install');
// install widget (if neccessary)
call_user_func($classname . '::install');
}
}
}
+4
View File
@@ -39,4 +39,8 @@ class Template
return $view;
}
public static function asset($path) {
return env('SITE_URL').'/assets/'.config('app.theme').'/'.$path;
}
}
@@ -4,14 +4,30 @@ namespace App\Http\Controllers\Admin;
use App\Enumerations\ActiveContentStatuses;
use App\Http\Requests\CreateNewContentRequest;
use App\Models\Content;
use App\Models\File;
use App\Models\Module;
use App\Models\Template;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Str;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class CreateNewContent extends Controller
{
/**
* @var File
*/
private $file;
/**
* @var Content
*/
private $content;
public function __construct(File $file, Content $content)
{
parent::__construct();
$this->file = $file;
$this->content = $content;
}
/**
* Display form for new content page
*
@@ -30,15 +46,15 @@ class CreateNewContent extends Controller
->get();
// create default content object
$page = new Content();
$page->status = Content::STATUS_DRAFT;
$this->content->status = Content::STATUS_DRAFT;
// render view
return view('admin.content.new', [
'contentStatuses' => $statuses,
'templates' => $templates,
'moduleId' => $moduleId,
'page' => $page,
'page' => $this->content,
'rootPages' => $this->content->rootPages(),
'moduleName' => trans($module->name),
'formSectionNames' => call_user_func([$module->handler, 'getExtendedFormSections']),
'formSections' => call_user_func([$module->handler, 'getExtendedFormInputsCreate']),
@@ -78,13 +94,22 @@ class CreateNewContent extends Controller
$page->template = $request->template;
$page->module_handler = $module->handler;
if ($request->parentPage) {
$page->parent_id = $request->parentPage;
}
// upload file - if provided
if ($request->hasFile('titlePhoto')) {
$file = $this->file->upload($request->file('titlePhoto'), $request);
$page->title_photo = $file['filename'];
}
// save module-specific stuff
call_user_func_array([$module->handler, 'createNew'], [&$page, $request]);
$page->save();
Event::fire(new \Modules\StaticPages\Events\CreateNewStaticPage($page));
return redirect()
->route('content.overview')
->with('success', trans('admin/contents.successfullyCreated'));
+4 -1
View File
@@ -9,6 +9,9 @@ use Illuminate\Support\Facades\Session;
class Dashboard extends Controller
{
public function getIndex(Request $request) {
return view('admin.dashboard');
return redirect()->route('content.overview');
// return view('admin.dashboard');
}
}
+43 -21
View File
@@ -6,14 +6,9 @@ use App\Enumerations\ModulesHandlerToId;
use App\Http\Requests\EditContentRequest;
use App\Models\Content;
use App\Models\ContentHistory;
use App\Models\File;
use App\Models\Template;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\Str;
use Modules\StaticPages\Events\DeleteStaticPage;
use Modules\StaticPages\Events\EditStaticPage as EditStaticPageEvent;
use Modules\StaticPages\Events\MakeDraftFromStaticPage;
use Modules\StaticPages\Events\PublishStaticPage;
use Modules\StaticPages\Http\Requests\EditStaticPageRequest;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class EditContent extends Controller
@@ -22,10 +17,15 @@ class EditContent extends Controller
* @var ContentHistory
*/
private $history;
/**
* @var File
*/
private $file;
public function __construct(ContentHistory $history)
public function __construct(ContentHistory $history, File $file)
{
$this->history = $history;
$this->file = $file;
}
/**
@@ -41,11 +41,11 @@ class EditContent extends Controller
$statuses = ContentStatuses::getWithTranslations();
// try to find requested page
$page = Content::where('module_handler', config('staticpages.handler'))
->findOrFail($id);
$page = Content::findOrFail($id);
$page->module_settings = json_decode($page->module_settings);
$allModules = ModulesHandlerToId::getWithTranslations();
$moduleId = $allModules[config('staticpages.handler')];
$moduleId = $allModules[$page->module_handler];
$templates = Template::where('module_id', $moduleId)
->select(['template_name', 'name', 'description'])
->get();
@@ -56,6 +56,7 @@ class EditContent extends Controller
return view('admin.content.edit', [
'contentStatuses' => $statuses,
'page' => $page,
'rootPages' => $page->rootPages(),
'templates' => $templates,
'formSectionNames' => call_user_func([$page->module_handler, 'getExtendedFormSections']),
'formSections' => call_user_func([$page->module_handler, 'getExtendedFormInputsCreate']),
@@ -84,6 +85,15 @@ class EditContent extends Controller
}
$request->url = Str::slug($request->url);
$request->parentPage = $request->parentPage ? $request->parentPage : null;
$request->titlePhotoFilename = $page->title_photo;
// upload file - if provided
if ($request->hasFile('titlePhoto')) {
$file = $this->file->upload($request->file('titlePhoto'), $request);
$request->titlePhotoFilename = $file['filename'];
}
// array of fields in database and fields from request
$fields = [
@@ -95,11 +105,13 @@ class EditContent extends Controller
'meta_keywords' => 'metaKeywords',
'meta_description' => 'metaDescription',
'content' => 'pageContent',
'status' => 'status'
'parent_id' => 'parentPage',
'status' => 'status',
'title_photo' => 'titlePhotoFilename'
];
// save new values with history
list($revision, $changedColumns) = $page->updateWithHistory($fields, $request->all());
list($revision, $changedColumns) = $page->updateWithHistory($fields, $this->getFields($request, $fields));
$changedColumns += call_user_func_array([$page->module_handler, 'edit'], [&$page, $request, $revision]);
@@ -111,7 +123,7 @@ class EditContent extends Controller
}
// fire event with
Event::fire(new EditStaticPageEvent($page, $revision));
// Event::fire(new EditStaticPageEvent($page, $revision));
// something was changed, inform user
return redirect()
@@ -121,7 +133,6 @@ class EditContent extends Controller
/**
* 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.
*
@@ -164,11 +175,11 @@ class EditContent extends Controller
}
// fire events
if ($status != Content::STATUS_DRAFT) {
Event::fire(new PublishStaticPage($page, $revision));
} else {
Event::fire(new MakeDraftFromStaticPage($page, $revision));
}
// 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()
@@ -205,7 +216,7 @@ class EditContent extends Controller
}
// trigger delete event
Event::fire(new DeleteStaticPage($page, $revision));
// Event::fire(new DeleteStaticPage($page, $revision));
// redirect back to overview with info for user
return redirect()
@@ -253,7 +264,7 @@ class EditContent extends Controller
}
// trigger delete event
// Event::fire(new DeleteStaticPage($page, $revision));
// Event::fire(new DeleteStaticPage($page, $revision));
// redirect back to overview with info for user
return redirect()
@@ -263,4 +274,15 @@ class EditContent extends Controller
'url' => $page->url
]));
}
private function getFields(EditContentRequest $request, $fields)
{
$requestData = [];
foreach ($fields as $field) {
$requestData[$field] = $request->$field;
}
return $requestData;
}
}
@@ -55,6 +55,7 @@ class EditUploadedFile extends Controller
}
// set values from form
$file->name = $request->name;
$file->keywords = $request->keywords;
$file->description = $request->description;
$file->save();
@@ -12,12 +12,6 @@ class EditWidget extends Controller
{
$widget = Widget::findOrFail($id);
// decompose widget settings
$settings = json_decode($widget->settings);
$widget->containerClass = $settings->containerClass;
$widget->code = $settings->code;
$presenter = call_user_func([$widget->widget_type_handler, 'getPresenter']);
return call_user_func([$presenter, 'renderEditForm'], $widget);
+16 -7
View File
@@ -43,18 +43,27 @@ class Settings extends Controller
$settings = $this->settings->getAll();
$updated = 0;
foreach($data as $key => $value) {
if ($settings->$key != $value) {
$updated ++;
\App\Models\Settings::where('key', $key)->update(['value' => $value]);
foreach ($data as $key => $value) {
if (isset($settings->$key)) {
if ($settings->$key != $value) {
$updated++;
\App\Models\Settings::where('key', $key)
->update(['value' => $value]);
}
} else {
\App\Models\Settings::create(['key' => $key, 'value' => $value]);
$updated++;
}
}
if ($updated > 0) {
return redirect()->route('settings.overview')->with('success', trans('admin/settings.successfullySaved'));
return redirect()
->route('settings.overview')
->with('success', trans('admin/settings.successfullySaved'));
} else {
return redirect()->route('settings.overview')->with('error', trans('admin/settings.nothingToSave'));
return redirect()
->route('settings.overview')
->with('error', trans('admin/settings.nothingToSave'));
}
}
}
@@ -12,14 +12,15 @@ class CreateNewContentRequest extends Request
public function rules()
{
return [
'title' => 'required',
'url' => 'required|unique:contents,url',
'template' => 'required|exists:templates,template_name',
'published_from' => 'date',
'published_to' => 'date',
'title_photo' => 'exists:files,id',
'module_settings' => 'json',
'status' => 'required|in:draft,protected,public'
'titlePhoto' => 'image',
'title' => 'required',
'url' => 'required|unique:contents,url',
'template' => 'required|exists:templates,template_name',
'status' => 'required|in:draft,protected,public',
'title_photo' => 'exists:files,id',
'parentPage' => 'exists:contents,id',
'published_from' => 'date',
'published_to' => 'date',
];
}
}
+2 -1
View File
@@ -24,7 +24,8 @@ class EditContentRequest extends Request
'published_from' => 'date',
'published_to' => 'date',
'title_photo' => 'exists:files,id',
'status' => 'required|in:' . $statuses
'status' => 'required|in:' . $statuses,
'parentPage' => 'exists:contents,id'
];
}
}
+32 -4
View File
@@ -43,7 +43,6 @@ class Content extends Model
/**
* Getter for homepage content page
*
* @return Content
*/
public function getHomepage()
@@ -68,8 +67,36 @@ class Content extends Model
}
/**
* Getter for overview of all content pages.
* Get list of all subpages
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function subpages()
{
return $this->getPageQuery()
->where('parent_id', $this->id)
->get();
}
/**
* Returns list of all root pages - those pages, which parent_id is null
*
* @return mixed
*/
public function rootPages()
{
$rootPages = $this->getPageQuery()
->where('parent_id', null);
if ($this->id) {
$rootPages = $rootPages->where('id', '!=', $this->id);
}
return $rootPages->get();
}
/**
* Getter for overview of all content pages.
* These content pages may be filtered by using some handler
*
* @param bool $handler
@@ -125,14 +152,15 @@ class Content extends Model
foreach ($fields as $fieldDB => $fieldRequest) {
// ignore non-existing fields
if (!isset($this->$fieldDB) || !isset($request[$fieldRequest])) {
if ((!isset($this->$fieldDB) && !is_null($this->$fieldDB)) || (!isset($request[$fieldRequest]) && !is_null($request[$fieldRequest]))) {
continue;
}
// remove any whitespaces around real content
if (!is_null($request[$fieldRequest]))
$request[$fieldRequest] = trim($request[$fieldRequest]);
if ($this->$fieldDB != $request[$fieldRequest]) {
if (trim($this->$fieldDB) != $request[$fieldRequest]) {
// setup history object
$history = [
+13 -11
View File
@@ -3,7 +3,7 @@
namespace App\Models;
use App\Events\UploadFile;
use App\Http\Requests\UploadRequest;
use App\Http\Requests\Request;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Event;
@@ -49,13 +49,13 @@ class File extends Model
/**
* Saves file into FS and creates new record in database
*
* @param UploadedFile $file
* @param UploadRequest $request
* @param UploadedFile $file
* @param Request $request
*
* @return array associative array - key 'file' is type of SymphonyFile and contains info about real file, key 'id'
* is ID of row in files table
*/
public function upload(UploadedFile $file, UploadRequest $request)
public function upload(UploadedFile $file, Request $request)
{
$destination = config('app.upload_path');
$filename = $this->getFilename($file);
@@ -70,8 +70,9 @@ class File extends Model
Event::fire(new UploadFile($uploadedFile, $id));
return [
'file' => $file,
'id' => $id
'filename' => $filename,
'file' => $file,
'id' => $id
];
}
@@ -81,12 +82,12 @@ class File extends Model
* This file saves new record into database. It also calculates hash of given file, obtains MIME type etc.
*
* @param SymphonyFile $file
* @param UploadRequest $request
* @param Request $request
* @param $originalFilename
*
* @return mixed
*/
protected function saveIntoDatabase(SymphonyFile $file, UploadRequest $request, $originalFilename)
protected function saveIntoDatabase(SymphonyFile $file, Request $request, $originalFilename)
{
// get path and hash of uploaded file
$path = config('app.upload_path') . DIRECTORY_SEPARATOR . $file->getFilename();
@@ -101,13 +102,14 @@ class File extends Model
$newFile->hash_algorithm = self::HASH_ALGORITHM;
$newFile->mime_type = $file->getMimeType();
$newFile->file_size = $file->getSize();
$newFile->directory_id = $request->directoryId;
// save optional fields
$optionalFields = ['description', 'keywords'];
$optionalFields = ['name', 'description', 'keywords', 'directoryId'];
foreach ($optionalFields as $field) {
if ($request->has($field)) {
$newFile->$field = $request->$field;
$snakeField = snake_case($field);
$newFile->$snakeField = $request->$field;
}
}
+3
View File
@@ -21,6 +21,9 @@ class Template extends Model
protected $guarded = [];
protected $pathModel = null;
const EDITED_TEMPLATES_DIRECTORY = 'custom';
const ASSETS_DIRECTORY = 'assets';
const MODULES_DIRECTORY = 'modules';
const TEMPLATE_SUFFIX = '.blade.php';
const CUSTOM_EDIT_DIRECTORY = 1;
const ORIGINAL_DIRECTORY = 2;
+47 -2
View File
@@ -10,21 +10,25 @@ use App\Handlers\Search\Content;
use App\Handlers\Search\Files;
use App\Handlers\Search\Presenters\AdminContent as AdminContentPresenter;
use App\Handlers\Search\Presenters\AdminFiles;
use App\Models\Template;
use App\Widgets\HtmlCode\HtmlCode;
use App\Widgets\OrbitSlider\OrbitSlider;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\File;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
// ignore running from artisan
if (App::runningInConsole()) {
$this->publishViewResources();
return;
}
@@ -36,7 +40,6 @@ class AppServiceProvider extends ServiceProvider
/**
* Register any application services.
*
* @return void
*/
public function register()
@@ -81,6 +84,7 @@ class AppServiceProvider extends ServiceProvider
// register all available widgets
$registrator->register(HtmlCode::class);
$registrator->register(OrbitSlider::class);
}
/**
@@ -118,4 +122,45 @@ class AppServiceProvider extends ServiceProvider
$registrator->register(new Content(), new AdminContentPresenter());
$registrator->register(new Files(), new AdminFiles());
}
/**
* Publish all public assets from all themes
*/
private function publishViewResources()
{
$themes = File::directories(resource_path('views/visitor'));
$assets = [];
foreach ($themes as $theme) {
$themeName = basename($theme);
if (is_dir($theme . '/'.Template::ASSETS_DIRECTORY)) {
$assets[$theme . '/'.Template::ASSETS_DIRECTORY] = public_path('assets/' . $themeName);
}
if (is_dir($theme . '/'.Template::MODULES_DIRECTORY)) {
$this->publishModuleViews($theme . '/'.Template::MODULES_DIRECTORY, $themeName);
}
}
if (!empty($assets)) {
$this->publishes($assets, 'public-assets');
}
}
private function publishModuleViews($themeModules, $themeName)
{
$modules = File::directories($themeModules);
$moduleViews = [];
foreach ($modules as $module) {
$moduleName = strtolower(basename($module));
$moduleViews[$module] = resource_path('views/modules/' . $moduleName . '/visitor/' . $themeName);
}
if (!empty($moduleViews)) {
$this->publishes($moduleViews, 'module-views');
}
}
}
+8 -1
View File
@@ -39,7 +39,7 @@ class GlobalViewDataProvider extends ServiceProvider
*/
private function createPattern($function)
{
return '/(?<!\w)(\s*)@' . $function . '\(\s*(.*)\)/';
return '/(?<!\w)(\s*)@' . $function.'\(([^)]+)*\)/';
}
/**
@@ -65,6 +65,13 @@ class GlobalViewDataProvider extends ServiceProvider
return preg_replace($pattern, $code, $view);
});
Blade::extend(function ($view) {
$pattern = $this->createPattern('asset');
$code = '<?php echo \App\Helpers\Template::asset($2); ?>';
return preg_replace($pattern, $code, $view);
});
// register extension for rendering widget areas
Blade::extend(function ($view) {
$pattern = $this->createPattern('widgetArea');
+1 -1
View File
@@ -56,7 +56,7 @@ class ModuleManager extends ServiceProvider
$path = config('modules.paths.modules') . DIRECTORY_SEPARATOR . $config->staticName . DIRECTORY_SEPARATOR . 'module.json';
// check if module config is writable
if (!is_writable($path)) {
if (!is_writable(dirname($path))) {
return;
}
@@ -0,0 +1,14 @@
<?php
namespace App\Widgets\Exceptions;
use Exception;
class WidgetExistsException extends \Exception
{
public function __construct($message = "", $code = 0, Exception $previous = null)
{
$message = trans('admin/widgets.widgetExists', ['id' => $message]);
parent::__construct($message, $code, $previous);
}
}
+2 -1
View File
@@ -47,6 +47,7 @@ class HtmlCode implements WidgetRenderer
*/
public static function renderEditForm(Widget $widget)
{
return view('admin.widgets.htmlCode.edit', ['widget' => $widget]);
$settings = json_decode($widget->settings);
return view('admin.widgets.htmlCode.edit', ['widget' => $widget, 'settings' => $settings]);
}
}
+129
View File
@@ -0,0 +1,129 @@
<?php
namespace App\Widgets\OrbitSlider;
use App\Http\Requests\Request;
use App\Models\Directory;
use App\Models\Widget;
use App\Widgets\Contracts\PublicWidget;
use App\Widgets\Contracts\WidgetRenderer;
use App\Widgets\Exceptions\WidgetExistsException;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
class OrbitSlider implements PublicWidget
{
const DIRECTORY_NAME = 'orbit-slider-data';
const CONFIG_FILENAME = 'orbit-slider-directory-id';
/**
* Name getter
*
* @return string
*/
public static function getName()
{
return 'widgets/orbitSlider.widgetName';
}
/**
* Getter for description
*
* @return string
*/
public static function getDescription()
{
return 'widgets/orbitSlider.widgetDescription';
}
/**
* @param Widget $widget
* @param Request $request
*
* @throws WidgetExistsException
*
* @return Widget
*/
public static function save(Widget $widget, Request $request)
{
$settings = json_decode($widget->settings);
$parentDirectoryId = Storage::get(self::CONFIG_FILENAME);
$directoryId = isset($settings->directoryId) ? $settings->directoryId : null;
$edit = false;
// check if directory does not exists
$exists = Directory::where('name', $request->name)
->where('parent_id', $parentDirectoryId);
if ($directoryId) {
$edit = true;
$exists = $exists->where('id', '!=', $directoryId);
}
$exists = $exists->exists();
if ($exists) {
throw new WidgetExistsException($request->name);
}
$directory = new Directory;
if ($edit) {
$directory = Directory::find($directoryId);
}
// setup some information about directory
$directory->user_id = Auth::user()->id;
$directory->parent_id = $parentDirectoryId;
$directory->name = $request->name;
$directory->description = $request->description;
$directory->save();
$settings = [
'directoryId' => $directory->id,
'sliderClass' => isset($request->containerClass) ? $request->containerClass : '',
'code' => $request->code
];
$widget->settings = json_encode($settings);
return $widget;
}
/**
* Getter for presenter/renderer of this widget
*
* @return WidgetRenderer
*/
public static function getPresenter()
{
return Presenters\OrbitSlider::class;
}
/**
* Function for installing given widget
*
* @return mixed
*/
public static function install()
{
$directory = Directory::where('name', self::DIRECTORY_NAME)
->first();
if (!count($directory)) {
$directory = Directory::create([
'name' => self::DIRECTORY_NAME,
'hidden' => true
]);
}
Storage::put(self::CONFIG_FILENAME, $directory->id);
}
/**
* Function for uninstalling widget
*/
public static function uninstall()
{
// TODO: Implement uninstall() method.
}
}
@@ -0,0 +1,56 @@
<?php
namespace App\Widgets\OrbitSlider\Presenters;
use App\Models\File;
use App\Models\Widget;
use App\Models\WidgetType;
use App\Widgets\Contracts\WidgetRenderer;
class OrbitSlider implements WidgetRenderer
{
/**
* Method used for displaying widget.
*
* This method renders some HTML code for displaying.
*
* @param object $settings
*
* @return mixed
*/
public static function render($settings)
{
$directoryId = $settings->directoryId;
$images = File::where('directory_id', $directoryId)
->where('mime_type', 'LIKE', 'image%')
->get();
return view('widgets.orbitSlider.element', ['images' => $images, 'settings' => $settings]);
}
/**
* Display form for creating new instance of widget
*
* @param WidgetType $type
*
* @return mixed
*/
public static function renderAddForm(WidgetType $type)
{
return view('admin.widgets.orbitSlider.new', ['type' => $type]);
}
/**
* Display form for editing already existing widget
*
* @param Widget $widget
*
* @return mixed
*/
public static function renderEditForm(Widget $widget)
{
$settings = json_decode($widget->settings);
return view('admin.widgets.orbitSlider.edit', ['widget' => $widget, 'settings' => $settings]);
}
}
+2 -2
View File
@@ -28,7 +28,7 @@ return [
|
*/
'host' => env('MAIL_HOST', 'smtp.mailgun.org'),
'host' => env('MAIL_HOST', 'mail.binarity.cz'),
/*
|--------------------------------------------------------------------------
@@ -41,7 +41,7 @@ return [
|
*/
'port' => env('MAIL_PORT', 587),
'port' => env('MAIL_PORT', 25),
/*
|--------------------------------------------------------------------------
@@ -0,0 +1,42 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddSubpages extends Migration
{
/**
* Run the migrations.
* @return void
*/
public function up()
{
Schema::table('contents', function (Blueprint $table) {
$table->integer('parent_id')
->after('id')
->nullable()
->default(null)
->index()
->comment('ID of parent page');
$table->foreign('parent_id')
->references('id')
->on('contents')
->onDelete('cascade')
->onUpdate('cascade');
});
}
/**
* Reverse the migrations.
* @return void
*/
public function down()
{
Schema::table('contents', function (Blueprint $table) {
$table->dropForeign('contents_parent_id_foreign');
$table->dropColumn('parent_id');
});
}
}
@@ -0,0 +1,86 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
class ChangeContentTitleImageIdForFilename extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
try {
Schema::table('contents', function (Blueprint $table) {
$table->dropForeign('fk_content_file1');
});
} catch (\Illuminate\Database\QueryException $e) {
// probably foreign does not exist, try to remove one from migration
try {
Schema::table('contents', function (Blueprint $table) {
$table->dropForeign('contents_title_photo_foreign');
});
} catch (\Illuminate\Database\QueryException $ex) {
// ignore this error
}
}
// force Doctrine to consider enum type as string
$platform = Schema::getConnection()
->getDoctrineSchemaManager()
->getDatabasePlatform();
$platform->registerDoctrineTypeMapping('enum', 'string');
Schema::table('contents', function (Blueprint $table) {
$table->string('title_photo', 128)
->nullable()
->default(null)
->comment('This photo is supposed to be displayed e.g. on list of all pages.')
->change();
$table->foreign('title_photo')
->references('filename')
->on('files')
->onUpdate('cascade')
->onDelete('set null');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
// force Doctrine to consider enum type as string
$platform = Schema::getConnection()
->getDoctrineSchemaManager()
->getDatabasePlatform();
$platform->registerDoctrineTypeMapping('enum', 'string');
// delete all title photos
DB::statement('UPDATE contents SET title_photo = NULL');
Schema::table('contents', function (Blueprint $table) {
$table->dropForeign('contents_title_photo_foreign');
});
Schema::table('contents', function (Blueprint $table) {
$table->integer('title_photo', false)
->change();
});
Schema::table('contents', function (Blueprint $table) {
$table->foreign('title_photo')
->references('id')
->on('files');
});
}
}
@@ -0,0 +1,37 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class MakeUserIdNotMandatoryInDirectories extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('directories', function (Blueprint $table) {
$table->integer('user_id', false)
->nullable()
->default(null)
->change();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('directories', function (Blueprint $table) {
$table->integer('user_id', false)
->nullable(false)
->change();
});
}
}
@@ -0,0 +1,34 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddNameForFiles extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('files', function (Blueprint $table) {
$table->string('name')
->after('file_size')
->comment('Some human readable name of file. May be used in different ways');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('files', function (Blueprint $table) {
$table->dropColumn('name');
});
}
}
+4
View File
@@ -179,6 +179,10 @@ if [ ! -e $THEME_SET_FILE ]; then
echo $THEME_NAME > $THEME_SET_FILE
fi
# publish assets and views
php artisan vendor:publish --tag=module-views
php artisan vendor:publish --tag=public-assets
if [ ! -e $ADMIN_CREATED_FILE ]; then
echo ""
echo " ------------------------------ "
View File
+12
View File
@@ -0,0 +1,12 @@
<?php
return [
'name' => 'ContactForm',
'translatedName' => 'contactform::module.name',
'translatedDescription' => 'contactform::module.description',
'alias' => 'contactform',
'handler' => '\\Modules\\ContactForm\\Handlers\\ContactForm',
'providers' => [\Modules\ContactForm\Providers\ContactFormServiceProvider::class],
'files' => ['start.php'],
'order' => 0,
];
@@ -0,0 +1,20 @@
<?php namespace Modules\Contactform\Database\Seeders;
use Illuminate\Database\Seeder;
use Illuminate\Database\Eloquent\Model;
class ContactFormDatabaseSeeder extends Seeder {
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
Model::unguard();
// $this->call("OthersTableSeeder");
}
}
@@ -0,0 +1,153 @@
<?php
namespace Modules\ContactForm\Handlers;
use App\Enumerations\ModulesHandlerToId;
use App\Handlers\Handler;
use App\Http\Controllers\Controller;
use App\Http\Requests\Request;
use App\Models\Content;
use App\Models\User;
class ContactForm extends Handler
{
/**
* 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)
{
$content->module_settings = json_decode($content->module_settings);
return Controller::VisitorsView($content->template, ['page' => $content]);
}
public static function getHistoryHandler()
{
return ContactFormHistory::class;
}
/**
* Save module-specific values into database
*
* @param Content $content
* @param Request $request
*
* @return mixed
* @internal param Widget $widget
*/
public static function createNew(Content &$content, Request $request)
{
$settings = [
'phone' => $request->phone,
'email' => $request->email,
'companyName' => $request->companyName,
'address' => $request->address,
'gpsLat' => $request->gpsLat,
'gpsLng' => $request->gpsLng,
];
// save settings
$content->module_settings = json_encode($settings);
}
/**
* Method used for editing existing content page.
*
* Reason why it is separated from createNew() method is simple - we need to save history of changes.
*
* @param Content $content
* @param Request $request
*
* @param $revisionID string ID of revision used
*
* @return int number of edited fields
*/
public static function edit(Content &$content, Request $request, $revisionID)
{
// TODO: Implement edit() method.
}
public static function getModuleId()
{
$handler = config('contactform.handler');
$allModules = ModulesHandlerToId::getWithTranslations();
$moduleId = isset($allModules[$handler]) ? $allModules[$handler] : null;
return $moduleId;
}
/**
* Getter for section names in creating/editing content resource
*
* @return mixed
*/
public static function getExtendedFormSections()
{
$sections = parent::getExtendedFormSections();
$sections['content'] = trans('contactform::admin/content.content');
return $sections;
}
/**
* Getter for views used in extended part of form for creating new content
*
* This method should return pairs <section, view-name>. View is returned only as name in plain text
*
* @return array of views/templates/html codes divided into section
*/
public static function getExtendedFormInputsCreate()
{
return [
'basicInfo' => 'contactform::admin.form.basicInfo',
'meta' => 'admin.content.formParts.metaInformation',
'appearance' => 'admin.content.formParts.appearance',
'publication' => 'admin.content.formParts.publicationSetup',
'content' => 'contactform::admin.form.content',
];
}
/**
* Register admin menu (or multiple ones)
*
* This cannot be in ServiceProvider because Session is started at middleware. And ServiceProvider is called before
* starting any middleware..
*
* @param User $user model of logged user
*/
public static function registerAdminMenu(User $user)
{
// register links in admin menu
$menu = \Menu::instance('mainMenu');
$menu->dropdown(trans('contactform::admin/adminMenu.contactForm'), function ($submenu) use ($user) {
$submenu->route('content.new', trans('contactform::admin/adminMenu.new'), ['moduleId' => self::getModuleId()], 10, ['icon' => 'fa fa-plus']);
$submenu->route('content.overview', trans('contactform::admin/adminMenu.overview'), ['moduleId' => self::getModuleId()], 20, ['icon' => 'fa fa-list']);
$submenu->route('emails.sent', trans('contactform::admin/adminMenu.sentMessages'), [], 30, ['icon' => 'fa fa-send']);
}, 25, ['icon' => 'fa fa-envelope-o']);
}
/**
* Does given module manage content? Or is it just module with widgets/something internal/something absolutely else?
*
* @return bool
*/
public static function managesContent()
{
return true;
}
/**
* Install module
*
* @return mixed
*/
public static function install()
{
// TODO: Implement install() method.
}
}
@@ -0,0 +1,16 @@
<?php
namespace Modules\ContactForm\Handlers;
use App\Handlers\History;
class ContactFormHistory extends History
{
public static function parseChangedValue($changeset)
{
switch ($changeset->column) {
default:
return parent::parseChangedValue($changeset);
break;
}
}
}
@@ -0,0 +1,50 @@
<?php
namespace Modules\ContactForm\Http\Controllers\Visitor;
use App\Helpers\Template;
use App\Models\Content;
use Illuminate\Mail\Message;
use Illuminate\Support\Facades\Mail;
use Modules\ContactForm\Http\Requests\SendNewEmailRequest;
use Pingpong\Modules\Routing\Controller;
class CreateNewMessage extends Controller
{
/**
* Method for sending emails via contact form
*
* @param SendNewEmailRequest $request
* @param $formId
*
* @return mixed
*/
public function postMessage(SendNewEmailRequest $request, $formId)
{
// load form settings
$form = Content::where('module_handler', config('contactform.handler'))
->findOrFail($formId);
$form->module_settings = json_decode($form->module_settings);
// select template
$template = isset($form->module_settings->emailTemplate) ? $form->module_settings->emailTemplate : 'contactform::emails.default';
// send email
$status = Mail::send(Template::name($template), ['data' => $request], function (Message $message) use ($request, $form) {
$message->from($request->email, $request->name);
$message->to($form->module_settings->email)
->subject('Your Reminder!');
});
// inform user about success or failure
if ($status) {
return redirect()
->route('page.content', ['url' => $form->url])
->with('success', '');
} else {
return redirect()
->route('page.content', ['url' => $form->url])
->with('error', '');
}
}
}
@@ -0,0 +1,20 @@
<?php namespace Modules\ContactForm\Http\Requests;
use App\Http\Requests\Request;
class SendNewEmailRequest extends Request
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required',
'email' => 'required|email',
'message' => 'required',
];
}
}
+24
View File
@@ -0,0 +1,24 @@
<?php
use App\Http\Requests\Request;
Route::group([
'middleware' => ['web', 'auth', 'adminMenu'],
'namespace' => '\Modules\ContactForm\Http\Controllers\Admin',
'prefix' => 'admin/contactform'
], function () {
Route::get('messsages/sent', 'SentMessagesOverview@getList')
->name('emails.sent');
});
Route::group([
'middleware' => ['web'],
'namespace' => '\Modules\ContactForm\Http\Controllers\Visitor',
'prefix' => 'contactform'
], function () {
// method for sending new message
Route::post('/message/{formId}', 'CreateNewMessage@postMessage')
->name('email.send');
});
@@ -0,0 +1,108 @@
<?php namespace Modules\ContactForm\Providers;
use App\Handlers\Registrators\TemplateRegistrator;
use Illuminate\Support\Facades\App;
use Illuminate\Support\ServiceProvider;
use InvalidArgumentException;
class ContactFormServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = false;
/**
* Boot the application events.
*
* @return void
*/
public function boot()
{
$this->registerTranslations();
$this->registerConfig();
$this->registerViews();
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$registrator = $this->app->make('registerSettingsExtension');
$registrator->register('contactForm', 'contactform::module.name', 'contactform::admin.settings.form');
}
/**
* Register config.
*
* @return void
*/
protected function registerConfig()
{
$this->publishes([
__DIR__ . '/../Config/config.php' => config_path('contactform.php'),
]);
$this->mergeConfigFrom(__DIR__ . '/../Config/config.php', 'contactform');
}
/**
* Register views.
*
* @return void
*/
public function registerViews()
{
$viewPath = base_path('resources/views/modules/contactform');
$sourcePath = __DIR__ . '/../Resources/views';
$this->publishes([
$sourcePath => $viewPath
]);
$this->loadViewsFrom(array_merge(array_map(function ($path) {
return $path . '/modules/contactform';
}, \Config::get('view.paths')), [$sourcePath]), 'contactform');
/**
* @var $registrator TemplateRegistrator
*/
$registrator = $this->app->make('registerTemplateDir');
try {
// setup some global variables
$registrator->setBaseDirectory('resources/views/modules/contactform/visitor');
$registrator->setNamespace('contactform');
$registrator->setModuleId(call_user_func([config('contactform.handler'), 'getModuleId']));
// register path with current template name
$registrator->register(config('app.theme'), 'contactform::admin.templatePath');
} catch (InvalidArgumentException $e) {
// ignore this exception
}
}
/**
* Register translations.
*
* @return void
*/
public function registerTranslations()
{
$this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'contactform');
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return array ();
}
}
@@ -0,0 +1,7 @@
<?php
return [
'contactForm' => 'Contact form',
'new' => 'New',
'overview' => 'All contact forms',
'sentMessages' => 'Messages'
];
@@ -0,0 +1,12 @@
<?php
return [
'content' => 'Contact form content',
'address' => 'Address',
'emailList' => 'Send emails to these addresses',
'gpsLat' => 'GPS latitude',
'gpsLng' => 'GPS longitude',
'compName' => 'Name displayed above address',
'phone' => 'Contact phone',
'contactEmail' => 'E-mail, where messages from this form will be delivered',
'contactInformation' => 'Contact information'
];
@@ -0,0 +1,5 @@
<?php
return [
'recaptchaSiteKey' => 'reCAPTCHA site key',
'recaptchaSecret' => 'reCAPTCHA application secret key',
];
@@ -0,0 +1,5 @@
<?php
return [
'name' => 'Contact form',
'description' => 'Simple contact form'
];
@@ -0,0 +1,113 @@
<div class="row">
<div class="columns large-6">
<label>
@lang('admin/contents.field_title')
<input type="text" name="title" placeholder="@lang('admin/contents.field_title')"
value="{{old('title', $page->title)}}" />
</label>
</div>
<div class="columns large-6">
<label>
@lang('admin/contents.field_url')
<input type="text" name="url" placeholder="@lang('admin/contents.field_url')"
value="{{old('url', $page->url)}}" />
@if (isset($errors) && $errors->has('url'))
<div class="callout alert">
{{ $errors->first('url') }}
</div>
@endif
</label>
</div>
</div>
<div class="row">
<div class="columns large-6">
<label>
<select name="status">
@foreach($contentStatuses as $status => $translation)
<option value="{{$status}}" @if(old('status', $page->status) == $status) selected @endif>
{{$translation}}
</option>
@endforeach
</select>
</label>
@if (isset($errors) && $errors->has('status'))
<div class="callout alert">
{{ $errors->first('status') }}
</div>
@endif
</div>
<div class="column large-6">
<label>
<select name="parentPage">
<option value="">@lang('admin/contents.noParentPage')</option>
@foreach($rootPages as $rootPage)
<option value="{{$rootPage->id}}"
@if(old('parent_page', $page->parent_id) == $rootPage->id) selected @endif>
{{$rootPage->title}}
</option>
@endforeach
</select>
</label>
@if (isset($errors) && $errors->has('parentPage'))
<div class="callout alert">
{{ $errors->first('parentPage') }}
</div>
@endif
</div>
</div>
<h2>@lang('contactform::admin/content.contactInformation')</h2>
<div class="row">
<div class="column large-6">
<label>
@lang('contactform::admin/content.phone')
<input type="tel" name="phone" value="{{$page->module_settings->phone or ""}}" />
</label>
</div>
<div class="column large-6">
<label>
@lang('contactform::admin/content.contactEmail')
<input type="email" name="email" value="{{$page->module_settings->email or \Auth::user()->email}}" />
</label>
</div>
</div>
<div class="row">
<div class="column large-6">
<label>
@lang('contactform::admin/content.compName')
<input type="text" name="companyName" value="{{$page->module_settings->companyName or ""}}" />
</label>
<label>
@lang('contactform::admin/content.address')
<textarea rows="3" name="address">{{$page->module_settings->address or ""}}</textarea>
</label>
</div>
<div class="column large-6">
<label>
@lang('contactform::admin/content.gpsLat')
<input type="text" value="{{$page->module_settings->gpsLat or ""}}" name="gpsLat" />
</label>
<label>
@lang('contactform::admin/content.gpsLng')
<input type="text" value="{{$page->module_settings->gpsLng or ""}}" name="gpsLng" />
</label>
</div>
</div>
@@ -0,0 +1,10 @@
<div class="row">
<div class="columns large-12">
<label>
<textarea name="pageContent" id="pageContent" class="wysiwyg-editor">
{{old('pageContent', $page->content)}}
</textarea>
</label>
</div>
</div>
@@ -0,0 +1,13 @@
<label>
@lang('contactform::admin/settings.recaptchaSiteKey')
<input type="text" name="recaptchaSiteKey" value="{{old('recaptchaSiteKey', isset($settings->recaptchaSiteKey) ? $settings->recaptchaSiteKey : null)}}" />
</label>
<label>
@lang('contactform::admin/settings.recaptchaSecret')
<input type="text" name="recaptchaSecret" value="{{old('recaptchaSecret', isset($settings->recaptchaSecret) ? $settings->recaptchaSecret : null)}}" />
</label>
<em><a href="https://www.google.com/recaptcha/admin#list" target="_blank">reCAPTCHA</a></em>
@@ -0,0 +1,4 @@
<p>
<strong>Ahoj {{$data->name}}</strong>
</p>
<p>Diky za zpravu: <em>{{$data->message}}</em></p>
View File
+15
View File
@@ -0,0 +1,15 @@
{
"name": "pingpong-modules/contactform",
"description": "",
"authors": [
{
"name": "Pingpong Labs",
"email": "pingpong.labs@gmail.com"
}
],
"autoload": {
"psr-4": {
"Modules\\ContactForm\\": ""
}
}
}
+15
View File
@@ -0,0 +1,15 @@
<?php
/*
|--------------------------------------------------------------------------
| Register Namespaces And Routes
|--------------------------------------------------------------------------
|
| When a module starting, this file will executed automatically. This helps
| to register some namespaces like translator or view. Also this file
| will load the routes file for each module. You may also modify
| this file as you want.
|
*/
require __DIR__ . '/Http/routes.php';
@@ -1,6 +1,4 @@
@extends('visitor.layout')
@section('pageName', @trans('admin/userManagement.detail', ['name' => $user->name, 'email' => $user->email]))
@extendVisitor('layout')
@section('content')
{!! $page->content !!}
+4
View File
@@ -127,6 +127,10 @@ code {
font-size: 80%;
}
#appearance .title-photo img {
max-height: 10em;
}
.red {
color: red;
}
+3 -1
View File
@@ -35,5 +35,7 @@ return [
'template' => 'Template of this page',
'overview' => 'List of all content pages',
'homepageSetup' => 'Homepage successfully set up.',
'setHomepage' => 'Set page as homepage'
'setHomepage' => 'Set page as homepage',
'noParentPage' => ' -- No parent page -- ',
'uploadTitleImage' => 'Upload title image'
];
+1
View File
@@ -20,6 +20,7 @@ return [
'noFileSpecified' => 'You have not specified any file for upload',
'uploadSuccessfull' => 'Your file was successfully uploaded',
'selectFile' => 'Select file for upload',
'name' => 'Name',
'keywords' => 'Keywords (comma separated)',
'description' => 'File description',
'noFiles' => 'No files were found. Try to upload some.',
+19 -16
View File
@@ -1,20 +1,23 @@
<?php
return [
'pageName' => 'History of :name',
'columnPageContent' => 'Page content',
'columnUrl' => 'URL',
'columnTitle' => 'Title',
'columnMetaKeywords' => 'Meta keywords',
'columnMetaDescription' => 'Description',
'columnStatus' => 'Page visibility',
'columnTemplate' => 'Template',
'columnIs_homepage' => 'Homepage',
'changedFromTo' => 'Changed from <del>:from</del> to <ins>:to</ins>',
'numOfChanges' => 'One change|:count changes',
'diff' => 'Difference',
'diffPageName' => 'Difference of :column',
'backToOverview' => 'Back to history overview',
'backToEdit' => 'Back to editation form',
'setupAsHomepage' => 'Setup as homepage'
'pageName' => 'History of :name',
'columnPageContent' => 'Page content',
'columnUrl' => 'URL',
'columnTitle' => 'Title',
'columnMetaKeywords' => 'Meta keywords',
'columnMetaDescription' => 'Description',
'columnStatus' => 'Page visibility',
'columnTemplate' => 'Template',
'columnIs_homepage' => 'Homepage',
'columnParentPage' => 'Parent page',
'columnTitlePhotoFilename' => 'Title photo',
'emptyValue' => '<em>none</em>',
'changedFromTo' => 'Changed from <del>:from</del> to <ins>:to</ins>',
'numOfChanges' => 'One change|:count changes',
'diff' => 'Difference',
'diffPageName' => 'Difference of :column',
'backToOverview' => 'Back to history overview',
'backToEdit' => 'Back to editation form',
'setupAsHomepage' => 'Setup as homepage'
];
+1
View File
@@ -21,5 +21,6 @@ return [
'successfullyAssociated' => 'Association successfull',
'associationDoesNotExists' => 'This association does not exist',
'successfullyDeassociated' => 'Successfully removed from widget area',
'widgetExists' => 'Widget :id already exists.'
];
+15
View File
@@ -0,0 +1,15 @@
<?php
return [
'widgetName' => 'Orbit slider',
'widgetDescription' => 'Slider for images. Uses Foundation framework.',
'name' => 'Slider name',
'description' => 'Slider description',
'containerClass' => 'Extra HTML class for slider',
'createNew' => 'Create new',
'new' => 'Create new orbit slider',
'edit' => 'Edit slider :name',
'editExisting' => 'Save',
'preview' => 'Slider preview',
'upload' => 'Add photos into slider',
'code' => 'Some extra HTML/JS code for slider'
];
@@ -10,7 +10,7 @@
</div>
@endif
<form method="POST" action="{{route('content.editPost', ['pageId' => $page->id])}}">
<form method="POST" enctype="multipart/form-data" action="{{route('content.editPost', ['pageId' => $page->id])}}">
{!! csrf_field() !!}
@include('admin.content.formInputs')
@@ -1,3 +1,26 @@
@if($page->title_photo)
<div class="row">
<div class="column large-12 title-photo text-center">
<img src="{{config('app.upload_url')}}/{{$page->title_photo}}" alt="" />
</div>
</div>
@endif
<div class="row">
<div class="column large-12">
<label>
@lang('admin/contents.uploadTitleImage')
<input type="file" id="titlePhoto" name="titlePhoto" />
</label>
@if (isset($errors) && $errors->has('titlePhoto'))
<div class="callout alert">
{{ $errors->first('titlePhoto') }}
</div>
@endif
</div>
</div>
<div class="row">
<div class="columns large-12">
<label>
@@ -24,7 +24,7 @@
</div>
<div class="row">
<div class="columns large-12">
<div class="columns large-6">
<label>
<select name="status">
@foreach($contentStatuses as $status => $translation)
@@ -41,7 +41,26 @@
</div>
@endif
</div>
<div class="column large-6">
<label>
<select name="parentPage">
<option value="">@lang('admin/contents.noParentPage')</option>
@foreach($rootPages as $rootPage)
<option value="{{$rootPage->id}}"
@if(old('parent_page', $page->parent_id) == $rootPage->id) selected @endif>
{{$rootPage->title}}
</option>
@endforeach
</select>
</label>
@if (isset($errors) && $errors->has('parentPage'))
<div class="callout alert">
{{ $errors->first('parentPage') }}
</div>
@endif
</div>
</div>
<div class="row">
@@ -10,7 +10,7 @@
</div>
@endif
<form method="POST" action="{{route('content.newPost', ['moduleId' => $moduleId])}}">
<form method="POST" enctype="multipart/form-data" action="{{route('content.newPost', ['moduleId' => $moduleId])}}">
{!! csrf_field() !!}
@include('admin.content.formInputs')
@@ -1,7 +1,12 @@
<div class="row" id="static-page-overview" data-equalizer>
<div class="row" id="static-page-overview" data-equalizer data-equalize-by-row="true">
@forelse($pages as $page)
<div class="columns @if(!isset($tileClass)) large-3 @else {{$tileClass}} @endif">
<div class="page callout" data-equalizer-watch>
@if ($page->title_photo)
<img src="{{config('app.upload_url')}}/{{$page->title_photo}}" alt="" />
@endif
<h4>{{$page->title}}</h4>
<span class="date">{{date('d.m.Y', strtotime($page->created_at))}}</span>
<span class="author">{{$page->author_name}}</span>
@@ -24,22 +29,36 @@
@if($page->is_homepage)
<a class="button tiny disabled"><i class="fa fa-home"></i></a>
@else
<a href="{{route('content.setHomepage', ['id' => $page->id])}}" class="button tiny success has-tip" data-tooltip aria-haspopup="true" title="@lang('admin/contents.setHomepage', ['name' => $page->title])"><i class="fa fa-home"></i></a>
<a href="{{route('content.setHomepage', ['id' => $page->id])}}"
class="button tiny success has-tip" data-tooltip aria-haspopup="true"
title="@lang('admin/contents.setHomepage', ['name' => $page->title])"><i
class="fa fa-home"></i></a>
@endif
<a href="{{route('content.edit', ['id' => $page->id])}}" class="button tiny success has-tip" data-tooltip aria-haspopup="true" title="@lang('admin/contents.edit', ['name' => $page->title])"><i class="fa fa-edit"></i></a>
<a href="{{route('content.edit', ['id' => $page->id])}}" class="button tiny success has-tip"
data-tooltip aria-haspopup="true"
title="@lang('admin/contents.edit', ['name' => $page->title])"><i class="fa fa-edit"></i></a>
@if($page->status == \App\Models\Content::STATUS_DRAFT)
<a href="{{route('content.changeStatus', ['id' => $page->id, 'status' => \App\Models\Content::STATUS_PUBLIC])}}" class="button tiny success confirm has-tip" data-tooltip aria-haspopup="true" title="@lang('admin/contents.makePublic')"><i class="fa fa-eye"></i></a>
<a href="{{route('content.changeStatus', ['id' => $page->id, 'status' => \App\Models\Content::STATUS_PROTECTED])}}" class="button tiny warning confirm has-tip" data-tooltip aria-haspopup="true" title="@lang('admin/contents.makeProtected')"><i class="fa fa-lock"></i></a>
<a href="{{route('content.changeStatus', ['id' => $page->id, 'status' => \App\Models\Content::STATUS_PUBLIC])}}"
class="button tiny success confirm has-tip" data-tooltip aria-haspopup="true"
title="@lang('admin/contents.makePublic')"><i class="fa fa-eye"></i></a>
<a href="{{route('content.changeStatus', ['id' => $page->id, 'status' => \App\Models\Content::STATUS_PROTECTED])}}"
class="button tiny warning confirm has-tip" data-tooltip aria-haspopup="true"
title="@lang('admin/contents.makeProtected')"><i class="fa fa-lock"></i></a>
@else
<a href="{{route('page.content', ['url' => $page->url])}}" target="_blank" class="button tiny secondary has-tip" data-tooltip aria-haspopup="true" title="@lang('admin/contents.viewPage')"><i class="fa fa-desktop"></i></a>
<a href="{{route('content.changeStatus', ['id' => $page->id, 'status' => \App\Models\Content::STATUS_DRAFT])}}" class="button tiny warning confirm has-tip" data-tooltip aria-haspopup="true" title="@lang('admin/contents.makeDraft')"><i class="fa fa-eye-slash"></i></a>
<a href="{{route('page.content', ['url' => $page->url])}}" target="_blank"
class="button tiny secondary has-tip" data-tooltip aria-haspopup="true"
title="@lang('admin/contents.viewPage')"><i class="fa fa-desktop"></i></a>
<a href="{{route('content.changeStatus', ['id' => $page->id, 'status' => \App\Models\Content::STATUS_DRAFT])}}"
class="button tiny warning confirm has-tip" data-tooltip aria-haspopup="true"
title="@lang('admin/contents.makeDraft')"><i class="fa fa-eye-slash"></i></a>
@endif
<a href="{{route('content.delete', ['id' => $page->id])}}" class="button tiny alert confirm has-tip" data-tooltip aria-haspopup="true" title="@lang('admin/contents.deletePage')"><i class="fa fa-remove"></i></a>
<a href="{{route('content.delete', ['id' => $page->id])}}"
class="button tiny alert confirm has-tip" data-tooltip aria-haspopup="true"
title="@lang('admin/contents.deletePage')"><i class="fa fa-remove"></i></a>
</p>
</div>
</div>
@empty
@@ -14,6 +14,18 @@
<form method="POST" action="{{route('upload.postEdit', ['id' => $file->id])}}" enctype="multipart/form-data">
{!! csrf_field() !!}
<label>
@lang('admin/fileManager.name')
<input type="text" name="name" id="name" value="{{$file->name}}"/>
@if (isset($errors) && $errors->has('name'))
<div class="callout alert">
{{ $errors->first('name') }}
</div>
@endif
</label>
<label>
@lang('admin/fileManager.keywords')
@@ -18,6 +18,19 @@
</div>
@endif
</label>
<label>
@lang('admin/fileManager.name')
<input type="text" name="name" id="name" value="{{old('name')}}"/>
@if (isset($errors) && $errors->has('name'))
<div class="callout alert">
{{ $errors->first('name') }}
</div>
@endif
</label>
<label>
@lang('admin/fileManager.keywords')
@@ -24,7 +24,7 @@
<input type="text" name="password" value="">
</label>
@if (\Auth::user()->role == \App\Models\User::ROLE_ADMIN)
@if (\Auth::user()->role == \App\Models\User::ROLE_ADMIN && \Auth::user()->id != $user->id)
<label>
@lang('admin/userManagement.roles')
@@ -43,7 +43,7 @@
@lang('widgets/htmlCode.containerClass')
<input type="text" name="containerClass" placeholder="@lang('widgets/htmlCode.containerClass')"
value="{{$widget->containerClass}}" />
value="{{$settings->containerClass}}" />
@if (isset($errors) && $errors->has('containerClass'))
<div class="callout alert">
@@ -55,7 +55,7 @@
<label>
@lang('widgets/htmlCode.code')
<textarea rows="4" name="code" placeholder="@lang('widgets/htmlCode.code')">{{$widget->code}}</textarea>
<textarea rows="4" name="code" placeholder="@lang('widgets/htmlCode.code')">{{$settings->code}}</textarea>
@if (isset($errors) && $errors->has('code'))
<div class="callout alert">
@@ -0,0 +1,20 @@
@extends('admin.layout')
@section('pageName', @trans('widgets/orbitSlider.edit', ['name' => $widget->name]))
@section('content')
<h1>@lang('widgets/orbitSlider.edit', ['name' => $widget->name])</h1>
<div class="row">
<div class="column large-8">
@include('admin.widgets.orbitSlider.editForm')
</div>
<div class="column large-4">
<h3>@lang('widgets/orbitSlider.preview')</h3>
@widgetPreview($widget)
</div>
</div>
@stop
@@ -0,0 +1,74 @@
@if (!isset($hideMessages))
@if (session('success'))
<div class="callout success">
{{ session('success') }}
</div>
@endif
@if (session('error'))
<div class="callout alert">
{{ session('error') }}
</div>
@endif
@endif
<form action="{{route('widgets.postEdit', ['id' => $widget->id])}}" method="POST">
{!! csrf_field() !!}
<label>
@lang('widgets/orbitSlider.name')
<input type="text" name="name" value="{{$widget->name}}" placeholder="@lang('widgets/orbitSlider.name')" />
@if (isset($errors) && $errors->has('name'))
<div class="callout alert">
{{ $errors->first('name') }}
</div>
@endif
</label>
<label>
@lang('widgets/orbitSlider.description')
<input type="text" name="description" placeholder="@lang('widgets/orbitSlider.description')"
value="{{$widget->description}}" />
@if (isset($errors) && $errors->has('description'))
<div class="callout alert">
{{ $errors->first('description') }}
</div>
@endif
</label>
<label>
@lang('widgets/orbitSlider.containerClass')
<input type="text" name="containerClass" placeholder="@lang('widgets/orbitSlider.containerClass')"
value="{{$settings->sliderClass}}" />
@if (isset($errors) && $errors->has('containerClass'))
<div class="callout alert">
{{ $errors->first('description') }}
</div>
@endif
</label>
<label>
@lang('widgets/orbitSlider.code')
<textarea rows="4" name="code" placeholder="@lang('widgets/orbitSlider.code')">{{$settings->code}}</textarea>
@if (isset($errors) && $errors->has('code'))
<div class="callout alert">
{{ $errors->first('code') }}
</div>
@endif
</label>
<div class="row column text-center">
<a href="{{route('upload.overview', ['id' => $settings->directoryId])}}"
class="button expanded large success">@lang('widgets/orbitSlider.upload')</a>
</div>
<button type="submit" class="button success">@lang('widgets/orbitSlider.editExisting')</button>
</form>
@@ -0,0 +1,10 @@
@extends('admin.layout')
@section('pageName', @trans('widgets/htmlCode.new'))
@section('content')
<h1>@lang('widgets/orbitSlider.new')</h1>
@include('admin.widgets.orbitSlider.newForm')
@stop
@@ -0,0 +1,69 @@
@if (!isset($hideMessages))
@if (session('success'))
<div class="callout success">
{{ session('success') }}
</div>
@endif
@if (session('error'))
<div class="callout alert">
{{ session('error') }}
</div>
@endif
@endif
<form action="{{route('widgets.postNew', ['type' => $type])}}" method="POST">
{!! csrf_field() !!}
<label>
@lang('widgets/orbitSlider.name')
<input type="text" name="name" value="{{old("name")}}" placeholder="@lang('widgets/orbitSlider.name')" />
@if (isset($errors) && $errors->has('name'))
<div class="callout alert">
{{ $errors->first('name') }}
</div>
@endif
</label>
<label>
@lang('widgets/orbitSlider.description')
<input type="text" name="description" placeholder="@lang('widgets/orbitSlider.description')"
value="{{old("description")}}" />
@if (isset($errors) && $errors->has('description'))
<div class="callout alert">
{{ $errors->first('description') }}
</div>
@endif
</label>
<label>
@lang('widgets/orbitSlider.containerClass')
<input type="text" name="containerClass" placeholder="@lang('widgets/orbitSlider.containerClass')"
value="{{old("containerClass")}}" />
@if (isset($errors) && $errors->has('containerClass'))
<div class="callout alert">
{{ $errors->first('description') }}
</div>
@endif
</label>
<label>
@lang('widgets/orbitSlider.code')
<textarea rows="4" name="code" placeholder="@lang('widgets/orbitSlider.code')">{{old('code')}}</textarea>
@if (isset($errors) && $errors->has('code'))
<div class="callout alert">
{{ $errors->first('code') }}
</div>
@endif
</label>
<button type="submit" class="button success">@lang('widgets/orbitSlider.createNew')</button>
</form>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 937 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

+656
View File
@@ -0,0 +1,656 @@
.slide-in-down.mui-enter, .slide-in-left.mui-enter, .slide-in-up.mui-enter, .slide-in-right.mui-enter, .slide-out-down.mui-leave, .slide-out-right.mui-leave, .slide-out-up.mui-leave, .slide-out-left.mui-leave, .fade-in.mui-enter, .fade-out.mui-leave, .hinge-in-from-top.mui-enter, .hinge-in-from-right.mui-enter, .hinge-in-from-bottom.mui-enter, .hinge-in-from-left.mui-enter, .hinge-in-from-middle-x.mui-enter, .hinge-in-from-middle-y.mui-enter, .hinge-out-from-top.mui-leave, .hinge-out-from-right.mui-leave, .hinge-out-from-bottom.mui-leave, .hinge-out-from-left.mui-leave, .hinge-out-from-middle-x.mui-leave, .hinge-out-from-middle-y.mui-leave, .scale-in-up.mui-enter, .scale-in-down.mui-enter, .scale-out-up.mui-leave, .scale-out-down.mui-leave, .spin-in.mui-enter, .spin-out.mui-leave, .spin-in-ccw.mui-enter, .spin-out-ccw.mui-leave {
transition-duration: 500ms;
transition-timing-function: linear;
}
.slide-in-down.mui-enter {
-webkit-transform: translateY(-100%);
transform: translateY(-100%);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.slide-in-down.mui-enter.mui-enter-active {
-webkit-transform: translateY(0);
transform: translateY(0);
}
.slide-in-left.mui-enter {
-webkit-transform: translateX(-100%);
transform: translateX(-100%);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.slide-in-left.mui-enter.mui-enter-active {
-webkit-transform: translateX(0);
transform: translateX(0);
}
.slide-in-up.mui-enter {
-webkit-transform: translateY(100%);
transform: translateY(100%);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.slide-in-up.mui-enter.mui-enter-active {
-webkit-transform: translateY(0);
transform: translateY(0);
}
.slide-in-right.mui-enter {
-webkit-transform: translateX(100%);
transform: translateX(100%);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.slide-in-right.mui-enter.mui-enter-active {
-webkit-transform: translateX(0);
transform: translateX(0);
}
.slide-out-down.mui-leave {
-webkit-transform: translateY(0);
transform: translateY(0);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.slide-out-down.mui-leave.mui-leave-active {
-webkit-transform: translateY(-100%);
transform: translateY(-100%);
}
.slide-out-right.mui-leave {
-webkit-transform: translateX(0);
transform: translateX(0);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.slide-out-right.mui-leave.mui-leave-active {
-webkit-transform: translateX(100%);
transform: translateX(100%);
}
.slide-out-up.mui-leave {
-webkit-transform: translateY(0);
transform: translateY(0);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.slide-out-up.mui-leave.mui-leave-active {
-webkit-transform: translateY(-100%);
transform: translateY(-100%);
}
.slide-out-left.mui-leave {
-webkit-transform: translateX(0);
transform: translateX(0);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
-webkit-backface-visibility: hidden;
backface-visibility: hidden;
}
.slide-out-left.mui-leave.mui-leave-active {
-webkit-transform: translateX(-100%);
transform: translateX(-100%);
}
.fade-in.mui-enter {
opacity: 0;
transition-property: opacity;
}
.fade-in.mui-enter.mui-enter-active {
opacity: 1;
}
.fade-out.mui-leave {
opacity: 1;
transition-property: opacity;
}
.fade-out.mui-leave.mui-leave-active {
opacity: 0;
}
.hinge-in-from-top.mui-enter {
-webkit-transform: perspective(2000px) rotateX(-90deg);
transform: perspective(2000px) rotateX(-90deg);
-webkit-transform-origin: top;
transform-origin: top;
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 0;
}
.hinge-in-from-top.mui-enter.mui-enter-active {
-webkit-transform: perspective(2000px) rotate(0deg);
transform: perspective(2000px) rotate(0deg);
opacity: 1;
}
.hinge-in-from-right.mui-enter {
-webkit-transform: perspective(2000px) rotateY(-90deg);
transform: perspective(2000px) rotateY(-90deg);
-webkit-transform-origin: right;
transform-origin: right;
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 0;
}
.hinge-in-from-right.mui-enter.mui-enter-active {
-webkit-transform: perspective(2000px) rotate(0deg);
transform: perspective(2000px) rotate(0deg);
opacity: 1;
}
.hinge-in-from-bottom.mui-enter {
-webkit-transform: perspective(2000px) rotateX(90deg);
transform: perspective(2000px) rotateX(90deg);
-webkit-transform-origin: bottom;
transform-origin: bottom;
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 0;
}
.hinge-in-from-bottom.mui-enter.mui-enter-active {
-webkit-transform: perspective(2000px) rotate(0deg);
transform: perspective(2000px) rotate(0deg);
opacity: 1;
}
.hinge-in-from-left.mui-enter {
-webkit-transform: perspective(2000px) rotateY(90deg);
transform: perspective(2000px) rotateY(90deg);
-webkit-transform-origin: left;
transform-origin: left;
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 0;
}
.hinge-in-from-left.mui-enter.mui-enter-active {
-webkit-transform: perspective(2000px) rotate(0deg);
transform: perspective(2000px) rotate(0deg);
opacity: 1;
}
.hinge-in-from-middle-x.mui-enter {
-webkit-transform: perspective(2000px) rotateX(-90deg);
transform: perspective(2000px) rotateX(-90deg);
-webkit-transform-origin: center;
transform-origin: center;
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 0;
}
.hinge-in-from-middle-x.mui-enter.mui-enter-active {
-webkit-transform: perspective(2000px) rotate(0deg);
transform: perspective(2000px) rotate(0deg);
opacity: 1;
}
.hinge-in-from-middle-y.mui-enter {
-webkit-transform: perspective(2000px) rotateY(-90deg);
transform: perspective(2000px) rotateY(-90deg);
-webkit-transform-origin: center;
transform-origin: center;
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 0;
}
.hinge-in-from-middle-y.mui-enter.mui-enter-active {
-webkit-transform: perspective(2000px) rotate(0deg);
transform: perspective(2000px) rotate(0deg);
opacity: 1;
}
.hinge-out-from-top.mui-leave {
-webkit-transform: perspective(2000px) rotate(0deg);
transform: perspective(2000px) rotate(0deg);
-webkit-transform-origin: top;
transform-origin: top;
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 1;
}
.hinge-out-from-top.mui-leave.mui-leave-active {
-webkit-transform: perspective(2000px) rotateX(-90deg);
transform: perspective(2000px) rotateX(-90deg);
opacity: 0;
}
.hinge-out-from-right.mui-leave {
-webkit-transform: perspective(2000px) rotate(0deg);
transform: perspective(2000px) rotate(0deg);
-webkit-transform-origin: right;
transform-origin: right;
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 1;
}
.hinge-out-from-right.mui-leave.mui-leave-active {
-webkit-transform: perspective(2000px) rotateY(-90deg);
transform: perspective(2000px) rotateY(-90deg);
opacity: 0;
}
.hinge-out-from-bottom.mui-leave {
-webkit-transform: perspective(2000px) rotate(0deg);
transform: perspective(2000px) rotate(0deg);
-webkit-transform-origin: bottom;
transform-origin: bottom;
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 1;
}
.hinge-out-from-bottom.mui-leave.mui-leave-active {
-webkit-transform: perspective(2000px) rotateX(90deg);
transform: perspective(2000px) rotateX(90deg);
opacity: 0;
}
.hinge-out-from-left.mui-leave {
-webkit-transform: perspective(2000px) rotate(0deg);
transform: perspective(2000px) rotate(0deg);
-webkit-transform-origin: left;
transform-origin: left;
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 1;
}
.hinge-out-from-left.mui-leave.mui-leave-active {
-webkit-transform: perspective(2000px) rotateY(90deg);
transform: perspective(2000px) rotateY(90deg);
opacity: 0;
}
.hinge-out-from-middle-x.mui-leave {
-webkit-transform: perspective(2000px) rotate(0deg);
transform: perspective(2000px) rotate(0deg);
-webkit-transform-origin: center;
transform-origin: center;
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 1;
}
.hinge-out-from-middle-x.mui-leave.mui-leave-active {
-webkit-transform: perspective(2000px) rotateX(-90deg);
transform: perspective(2000px) rotateX(-90deg);
opacity: 0;
}
.hinge-out-from-middle-y.mui-leave {
-webkit-transform: perspective(2000px) rotate(0deg);
transform: perspective(2000px) rotate(0deg);
-webkit-transform-origin: center;
transform-origin: center;
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 1;
}
.hinge-out-from-middle-y.mui-leave.mui-leave-active {
-webkit-transform: perspective(2000px) rotateY(-90deg);
transform: perspective(2000px) rotateY(-90deg);
opacity: 0;
}
.scale-in-up.mui-enter {
-webkit-transform: scale(0.5);
transform: scale(0.5);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 0;
}
.scale-in-up.mui-enter.mui-enter-active {
-webkit-transform: scale(1);
transform: scale(1);
opacity: 1;
}
.scale-in-down.mui-enter {
-webkit-transform: scale(1.5);
transform: scale(1.5);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 0;
}
.scale-in-down.mui-enter.mui-enter-active {
-webkit-transform: scale(1);
transform: scale(1);
opacity: 1;
}
.scale-out-up.mui-leave {
-webkit-transform: scale(1);
transform: scale(1);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 1;
}
.scale-out-up.mui-leave.mui-leave-active {
-webkit-transform: scale(1.5);
transform: scale(1.5);
opacity: 0;
}
.scale-out-down.mui-leave {
-webkit-transform: scale(1);
transform: scale(1);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 1;
}
.scale-out-down.mui-leave.mui-leave-active {
-webkit-transform: scale(0.5);
transform: scale(0.5);
opacity: 0;
}
.spin-in.mui-enter {
-webkit-transform: rotate(-0.75turn);
transform: rotate(-0.75turn);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 0;
}
.spin-in.mui-enter.mui-enter-active {
-webkit-transform: rotate(0);
transform: rotate(0);
opacity: 1;
}
.spin-out.mui-leave {
-webkit-transform: rotate(0);
transform: rotate(0);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 1;
}
.spin-out.mui-leave.mui-leave-active {
-webkit-transform: rotate(0.75turn);
transform: rotate(0.75turn);
opacity: 0;
}
.spin-in-ccw.mui-enter {
-webkit-transform: rotate(0.75turn);
transform: rotate(0.75turn);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 0;
}
.spin-in-ccw.mui-enter.mui-enter-active {
-webkit-transform: rotate(0);
transform: rotate(0);
opacity: 1;
}
.spin-out-ccw.mui-leave {
-webkit-transform: rotate(0);
transform: rotate(0);
transition-property: -webkit-transform, opacity;
transition-property: transform, opacity;
opacity: 1;
}
.spin-out-ccw.mui-leave.mui-leave-active {
-webkit-transform: rotate(-0.75turn);
transform: rotate(-0.75turn);
opacity: 0;
}
.slow {
transition-duration: 750ms !important;
}
.fast {
transition-duration: 250ms !important;
}
.linear {
transition-timing-function: linear !important;
}
.ease {
transition-timing-function: ease !important;
}
.ease-in {
transition-timing-function: ease-in !important;
}
.ease-out {
transition-timing-function: ease-out !important;
}
.ease-in-out {
transition-timing-function: ease-in-out !important;
}
.bounce-in {
transition-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important;
}
.bounce-out {
transition-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important;
}
.bounce-in-out {
transition-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important;
}
.short-delay {
transition-delay: 300ms !important;
}
.long-delay {
transition-delay: 700ms !important;
}
.shake {
-webkit-animation-name: shake-7;
animation-name: shake-7;
}
@-webkit-keyframes shake-7 {
0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% {
-webkit-transform: translateX(7%);
transform: translateX(7%);
}
5%, 15%, 25%, 35%, 45%, 55%, 65%, 75%, 85%, 95% {
-webkit-transform: translateX(-7%);
transform: translateX(-7%);
}
}
@keyframes shake-7 {
0%, 10%, 20%, 30%, 40%, 50%, 60%, 70%, 80%, 90% {
-webkit-transform: translateX(7%);
transform: translateX(7%);
}
5%, 15%, 25%, 35%, 45%, 55%, 65%, 75%, 85%, 95% {
-webkit-transform: translateX(-7%);
transform: translateX(-7%);
}
}
.spin-cw {
-webkit-animation-name: spin-cw-1turn;
animation-name: spin-cw-1turn;
}
@-webkit-keyframes spin-cw-1turn {
0% {
-webkit-transform: rotate(-1turn);
transform: rotate(-1turn);
}
100% {
-webkit-transform: rotate(0);
transform: rotate(0);
}
}
@keyframes spin-cw-1turn {
0% {
-webkit-transform: rotate(-1turn);
transform: rotate(-1turn);
}
100% {
-webkit-transform: rotate(0);
transform: rotate(0);
}
}
.spin-ccw {
-webkit-animation-name: spin-cw-1turn;
animation-name: spin-cw-1turn;
}
@keyframes spin-cw-1turn {
0% {
-webkit-transform: rotate(0);
transform: rotate(0);
}
100% {
-webkit-transform: rotate(1turn);
transform: rotate(1turn);
}
}
.wiggle {
-webkit-animation-name: wiggle-7deg;
animation-name: wiggle-7deg;
}
@-webkit-keyframes wiggle-7deg {
40%, 50%, 60% {
-webkit-transform: rotate(7deg);
transform: rotate(7deg);
}
35%, 45%, 55%, 65% {
-webkit-transform: rotate(-7deg);
transform: rotate(-7deg);
}
0%, 30%, 70%, 100% {
-webkit-transform: rotate(0);
transform: rotate(0);
}
}
@keyframes wiggle-7deg {
40%, 50%, 60% {
-webkit-transform: rotate(7deg);
transform: rotate(7deg);
}
35%, 45%, 55%, 65% {
-webkit-transform: rotate(-7deg);
transform: rotate(-7deg);
}
0%, 30%, 70%, 100% {
-webkit-transform: rotate(0);
transform: rotate(0);
}
}
.infinite {
-webkit-animation-iteration-count: infinite;
animation-iteration-count: infinite;
}
.slow {
-webkit-animation-duration: 750ms !important;
animation-duration: 750ms !important;
}
.fast {
-webkit-animation-duration: 250ms !important;
animation-duration: 250ms !important;
}
.linear {
-webkit-animation-timing-function: linear !important;
animation-timing-function: linear !important;
}
.ease {
-webkit-animation-timing-function: ease !important;
animation-timing-function: ease !important;
}
.ease-in {
-webkit-animation-timing-function: ease-in !important;
animation-timing-function: ease-in !important;
}
.ease-out {
-webkit-animation-timing-function: ease-out !important;
animation-timing-function: ease-out !important;
}
.ease-in-out {
-webkit-animation-timing-function: ease-in-out !important;
animation-timing-function: ease-in-out !important;
}
.bounce-in {
-webkit-animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important;
animation-timing-function: cubic-bezier(0.485, 0.155, 0.24, 1.245) !important;
}
.bounce-out {
-webkit-animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important;
animation-timing-function: cubic-bezier(0.485, 0.155, 0.515, 0.845) !important;
}
.bounce-in-out {
-webkit-animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important;
animation-timing-function: cubic-bezier(0.76, -0.245, 0.24, 1.245) !important;
}
.short-delay {
-webkit-animation-delay: 300ms !important;
animation-delay: 300ms !important;
}
.long-delay {
-webkit-animation-delay: 700ms !important;
animation-delay: 700ms !important;
}
+133
View File
@@ -0,0 +1,133 @@
@font-face {font-family: "Lobster"; src: url(fonts/lobster_1_4.woff);}
body,h1,h2,h3,h4,h5,h6, * {font-family: 'Ubuntu', sans-serif; color: #414042;}
a, a:link, a:hover {color: #46c1be; font-weight: 500;}
a:hover {text-decoration: underline;}
.m-t-25 {margin-top: 25px;}
.m-t-50 {margin-top: 50px;}
.m-b-25 {margin-bottom: 25px;}
.m-l-40 {margin-left: 40px;}
.p-lr-15 {padding-left: 15px; padding-right: 15px;}
.p-lr-0 {padding-left: 0; padding-right: 0;}
.p-25 {padding: 25px !important;}
.p-b-0 {padding-bottom: 0 !important;}
.rounded {border-radius: 3px;}
.large.rounded,.expanded.rounded {border-radius: 6px;}
.button {padding: 0.4em 2.3em; font-size: 0.7rem;}
.button.secondary {background-color: #4D4D4F;}
.button.success {background-color: #46c1be;}
.button.success:hover, .button.success:focus, .button.success:active, .button.success.active {background-color: #4D4D4F;}
.button.large, .button.expanded {font-size:0.9rem; padding: 0.9em 2.4em; font-weight: 700; margin-bottom: 0;}
.button.large.long {padding: 0.9em 4em;}
.button.expanded.long {height: 3rem; padding: 1em 4em;}
.w-t {color: #ffffff}
.green-text {color: #46c1be !important;}
.uppercase {text-transform: uppercase;}
.bold {font-weight: 700;}
[type="text"], [type="password"], [type="date"], [type="datetime"], [type="datetime-local"], [type="month"], [type="week"], [type="email"],
[type="number"], [type="search"], [type="tel"], [type="time"], [type="url"], [type="color"], textarea,
[type="text"]:focus, [type="password"]:focus, [type="date"]:focus, [type="datetime"]:focus, [type="datetime-local"]:focus, [type="month"]:focus, [type="week"]:focus,
[type="email"]:focus, [type="number"]:focus, [type="search"]:focus, [type="tel"]:focus, [type="time"]:focus, [type="url"]:focus, [type="color"]:focus, textarea:focus
{
border: 0; box-shadow: none; color: #46c1be; font-weight: 500; padding: 1rem; line-height: 2rem; height: 3rem;
}
textarea, textarea:focus {height: 120px;}
[type="text"]:focus,[type="text"]:not(:empty), [type="password"]:focus, [type="date"]:focus, [type="datetime"]:focus, [type="datetime-local"]:focus, [type="month"]:focus, [type="week"]:focus,
[type="email"]:focus, [type="number"]:focus, [type="search"]:focus, [type="tel"]:focus, [type="time"]:focus, [type="url"]:focus, [type="color"]:focus, textarea:focus {
color: #414042;
}
.top-bar {position: relative; top: 0; width: 100%;}
.top-bar.homepage {position: absolute; top: 0; width: 100%;}
.top-bar, .top-bar ul {background-color: transparent; z-index: 500;}
.menu > li:not(.menu-text) > a {font-weight: 700; text-transform:uppercase; color: #4D4D4F}
.menu > li:not(.menu-text) > a.active {color: #46c1be}
.top-bar-right {position: absolute; bottom: 5px; right: 0;}
.orbit.header {position: relative; z-index: 1;}
.orbit.header .orbit-next, .orbit.header .orbit-previous { background-color: #ffffff; color: #4d4d4f; padding: 40px;}
.orbit.header .orbit-next:hover, .orbit.header .orbit-previous:hover { background-color: #46c1be; color: #ffffff;}
.orbit.header .orbit-next {border-top-left-radius: 50%; border-bottom-left-radius: 50%; right: -70px;}
.orbit.header .orbit-next i {position: relative; left: -30px;}
.orbit.header .orbit-previous {border-top-right-radius: 50%; border-bottom-right-radius: 50%; left: -70px;}
.orbit.header .orbit-previous i {position: relative; left: 30px;}
.orbit.header .orbit-slide {position: relative;}
.orbit.header .orbit-slide:before {content: ''; position: absolute; top: 20%; width: 100%; display: block; height: 60%; background-color: rgba(77, 77, 79, 0.70); }
.orbit.header .orbit-slide .img {width: 100%; height: 800px; background-size: cover; background-position: center center}
.orbit.header .orbit-slide h2, .orbit.header .orbit-slide h3 {
position: absolute; top: 0; color: #ffffff; font-family: Lobster, Helvetica, Arial, sans-serif;
text-align: center; width: 100%;
}
.orbit.header .orbit-slide h2 {top: 35%; font-size: 5.2rem;}
.orbit.header .orbit-slide h3 {top: calc(38% + 4.2rem); font-size: 3.5rem;}
.orbit.header .orbit-bullets {position: absolute; margin: auto; width: 100%; top: 63%;}
.orbit.header .orbit-bullets button {width: .95rem; height: .95rem; margin: .35rem; background-color: #ffffff;}
.orbit.header .orbit-bullets button.is-active, .orbit-bullets button:hover {background-color: #f58020;}
#chevron-down {position: absolute; z-index: 350; display: block; top: 75%; left: calc(50% - 12px); opacity: 0.6; color: #ffffff; cursor: pointer;}
#chevron-down:hover {color: #f58020}
#content h2 {text-transform: uppercase; font-size: 1.5rem; font-weight: 400; text-align: center;}
#content h3 {text-align: center; text-transform: uppercase; }
#content h4 {font-size: 1.35rem;}
hr {border-bottom: 0;width: 5%; margin: 0 auto; position: relative; top: -15px; display:inline-block; height: 1px; background-color: #46c1be}
#content p {line-height: 1.3; font-size: 0.9rem;}
#content p.small {font-size: .75rem;}
.grey-wrapper {background-color: #f1f1f1; padding: 50px 0; display: block;}
.green-wrapper {background-color: #46c1be; padding: 50px 0; display: block;}
.white-wrapper {background-color: #ffffff; padding: 50px 0; display: block;}
.backgrounded {background-image: url(images/background_o_nás._white.jpg); background-size: cover; background-position: center center; }
.assortment-h5 {text-align: center; text-transform: uppercase; font-weight: 500; font-size: 1.1rem;}
.assortment-p {font-size: 0.8rem; text-align: center; margin: 15px auto 10px;}
.assortment-more-btn {color: #46c1be; text-transform: uppercase; font-style: italic; text-align: center; font-size: 0.85rem; width: 100%; display: inline-block; font-weight: 500;}
img.thumbnail {border-radius: 50%; box-shadow: none; border-width: 2px; border-color: #ffffff;}
img.thumbnail:focus, img.thumbnail:hover {box-shadow: none; border-color: #ffffff;}
.sale-image-holder>img {width: 100%; height: auto; border: 1px solid #414042;}
.sale-image-holder {margin-bottom: 15px; position: relative; cursor: pointer;}
.sale-item-data {display: block; opacity: 0; width: calc(100% - 0.9375rem * 2);height: 100%; position: absolute; top: 0; left: 0.9375rem; background-color: rgba(70, 193, 190, 0.7); color: #ffffff;}
.sale-item-data * {color: #ffffff;}
.sale-item-data h5 {text-transform: uppercase; font-size: 0.9rem; text-align: center; padding: 15px 10px 0 10px; font-weight: 700; margin-bottom: 0;}
.sale-item-data p {margin: -5px auto 0; padding: 0 auto; text-align: center; font-size: 0.8rem;}
.sale-item-data p.price {margin-top: 10px; font-weight: 700; font-size: 0.9rem;}
.gallery-image-holder>img {width: 100%; height: auto; border: 1px solid #414042;}
.gallery-image-holder {margin-bottom: 15px; position: relative; cursor: pointer;}
.gallery-item-data {display: block; opacity: 0; width: calc(100% - 0.9375rem * 2);height: 100%; position: absolute; top: 0; left: 0.9375rem; background-color: rgba(65, 64, 66, 0.71); color: #ffffff;}
.gallery-item-data * {color: #ffffff;}
.gallery-item-data h5 {text-transform: uppercase; font-size: 1.1rem; text-align: center; padding: 15px 10px 0 10px; font-weight: 700; margin-bottom: 0;}
.gallery-item-data p {margin: 5px; padding: 0 auto; text-align: center; font-size: 0.8rem;}
.gallery-item-data p.price {margin-top: 10px; font-weight: 700; font-size: 1.1rem;}
.white-wrapper h6 {color: #46c1be; text-transform: uppercase; font-size: 1.3rem;}
.white-wrapper h6.lowercase {text-transform: none; font-size: 1.2rem;}
.design-ul-block li {list-style-image: url(images/bullet.png); margin: 15px 30px 25px 30px;}
.design-ul-block li h6 {position: relative; top: -7px;}
.orbit.footer .orbit-next, .orbit.footer .orbit-previous { background-color: #46c1be; padding: 40px;}
.orbit.footer .orbit-next:hover, .orbit.footer .orbit-previous:hover { background-color: #f58020;}
.orbit.footer .fa {color: #ffffff;}
.orbit.footer .orbit-next {border-top-left-radius: 50%; border-bottom-left-radius: 50%; right: -70px;}
.orbit.footer .orbit-next i {position: relative; left: -30px;}
.orbit.footer .orbit-previous {border-top-right-radius: 50%; border-bottom-right-radius: 50%; left: -70px;}
.orbit.footer .orbit-previous i {position: relative; left: 30px;}
.orbit.footer .orbit-slide {position: relative; height: 260px;}
.orbit.footer .orbit-slide img {width: 100%; height: auto;}
.image-bullet {margin-right: 7px; position: relative; top: -3px;}
.contact-p {margin-bottom: 0; padding-right: 50px; line-height: 1rem; font-weight: 300;}
#content p.contact-p.green-text {color: #46c1be !important;}
footer {padding-top: 50px;}
footer .menu {display: inline-block;}
footer a {color: #414042; font-weight: 500;}
footer a:hover {color: #46c1be;}
.social-icons .fa-stack-2x {color: #46c1be;}
.social-icons a:hover .fa-stack-2x {color: #414042;}
.social-icons .fa.w-t {color: #ffffff;}
File diff suppressed because one or more lines are too long
@@ -0,0 +1 @@
!function(e,t){"function"==typeof define&&define.amd?define([],function(){return t()}):"object"==typeof exports?module.exports=t():e.whatInput=t()}(this,function(){"use strict";function e(e){clearTimeout(s),n(e),f=!0,s=setTimeout(function(){f=!1},1e3)}function t(e){f||n(e)}function n(e){var t=o(e),n=r(e),d=w[e.type];"pointer"===d&&(d=i(e)),p!==d&&(!y&&p&&"keyboard"===d&&"tab"!==v[t]&&m.indexOf(n.nodeName.toLowerCase())>=0||(p=d,a.setAttribute("data-whatinput",p),-1===h.indexOf(p)&&h.push(p))),"keyboard"===d&&u(t)}function o(e){return e.keyCode?e.keyCode:e.which}function r(e){return e.target||e.srcElement}function i(e){return"number"==typeof e.pointerType?b[e.pointerType]:e.pointerType}function u(e){-1===c.indexOf(v[e])&&v[e]&&c.push(v[e])}function d(e){var t=o(e),n=c.indexOf(v[t]);-1!==n&&c.splice(n,1)}var s,c=[],a=document.body,f=!1,p=null,m=["input","select","textarea"],y=a.hasAttribute("data-whatinput-formtyping"),w={keydown:"keyboard",mousedown:"mouse",mouseenter:"mouse",touchstart:"touch",pointerdown:"pointer",MSPointerDown:"pointer"},h=[],v={9:"tab",13:"enter",16:"shift",27:"esc",32:"space",37:"left",38:"up",39:"right",40:"down"},b={2:"touch",3:"touch",4:"mouse"};return function(){var n="mousedown";window.PointerEvent?n="pointerdown":window.MSPointerEvent&&(n="MSPointerDown"),a.addEventListener(n,t),a.addEventListener("mouseenter",t),"ontouchstart"in document.documentElement&&a.addEventListener("touchstart",e),a.addEventListener("keydown",t),a.addEventListener("keyup",d)}(),{ask:function(){return p},keys:function(){return c},types:function(){return h},set:n}});
@@ -0,0 +1,469 @@
<!doctype html>
<html>
<head>
<title>Custom Wristbands.cz</title>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<link href='https://fonts.googleapis.com/css?family=Ubuntu:400,300,500,700&subset=latin-ext,latin' rel='stylesheet' type='text/css'>
<link href="@asset('foundation.min.css')" type="text/css" rel="stylesheet">
<script src="@asset('vendor/jquery.min.js')" type="text/javascript"></script>
<script src="@asset('foundation.min.js')" type="text/javascript"></script>
<link href="@asset('layout.css')" type="text/css" rel="stylesheet">
<link href="@asset('style.css')" type="text/css" rel="stylesheet">
</head>
<body>
<div class="top-bar homepage">
<div class="top-bar-left">
<ul class="menu">
<li class="menu-text">
<a href="/"><img src="@asset('images/cwbs_logo_medium.png')" alt="Custom Wristbands Logo"></a>
</li>
</ul>
</div>
<div class="top-bar-right">
<ul class="menu">
<li><a href="#" class="active">Home</a></li>
<li><a href="#">Sortiment</a></li>
<li><a href="#">Doprodej</a></li>
<li><a href="#">Galerie</a></li>
<li><a href="#">O nás</a></li>
<li><a href="#">Kontakt</a></li>
</ul>
</div>
</div>
<div class="orbit header" role="region" aria-label="Favorite Space Pictures" data-orbit>
<ul class="orbit-container">
<button class="orbit-previous" aria-label="previous"><span class="show-for-sr">Previous Slide</span><i class="fa fa-fw fa-2x fa-chevron-left"></i></button>
<button class="orbit-next" aria-label="next"><span class="show-for-sr">Next Slide</span><i class="fa fa-fw fa-2x fa-chevron-right"></i></button>
<li class="orbit-slide is-active">
<h2>Silikonové náramky 1</h2>
<h3>všeho druhu</h3>
<div class="img" style="background-image: url(@asset('images/Sabaton.jpg')) "></div>
</li>
<li class="orbit-slide">
<h2>Silikonové náramky2</h2>
<h3>všeho druhu</h3>
<div class="img" style="background-image: url(@asset('images/background_o_nás.jpg'));"></div>
</li>
<li class="orbit-slide">
<h2>Silikonové náramky3</h2>
<h3>všeho druhu</h3>
<div class="img" style="background-image: url(@asset('images/Sabaton.jpg'));"></div>
</li>
<li class="orbit-slide">
<h2>Silikonové náramky4</h2>
<h3>všeho druhu</h3>
<div class="img" style="background-image: url(@asset('images/Sabaton.jpg'));"></div>
</li>
</ul>
<nav class="orbit-bullets">
<button class="is-active" data-slide="0"><span class="show-for-sr">First slide details.</span><span class="show-for-sr">Current Slide</span></button>
<button data-slide="1"><span class="show-for-sr">Second slide details.</span></button>
<button data-slide="2"><span class="show-for-sr">Third slide details.</span></button>
<button data-slide="3"><span class="show-for-sr">Fourth slide details.</span></button>
</nav>
<i id="chevron-down" class="fa fa-2x fa-chevron-circle-down text-center white-text pointer" onclick="animateScroll()"></i>
<script>
function animateScroll() {
var body = $("html, body");
body.stop().animate({scrollTop:$('#assortment').offset().top}, '200', 'swing');
}
</script>
</div>
<div id="content">
<div class="row column text-center m-t-25">
<hr>
@yield('content')
<hr>
<h2 id="assortment">Náš sortiment</h2>
<hr>
<p class="text-center">
The city needs Bruce Wayne, your resources, your knowledge. It doesn't need your body or your life. That time is past.
<br>
Seven hundred twelve counts of extortion. Eight hundred and forty-nine counts of racketeering. Two hundred and forty-six counts of fraud. Eighty-seven counts of conspiracy murder.Five hundred and twenty-seven counts of obstruction of justice. How do the defendants plead?
<br>
You know how to fight six men. We can teach you how to engage 600.
<br>
You have inspired good. But you spat in the faces of Gotham's criminals. Didn't you think there might be casualties? Things always get worse before they get better.
</p>
</div>
<div class="row small-up-2 large-up-4">
<div class="column">
<img class="thumbnail" src="http://placehold.it/250x250">
<h5 class="assortment-h5">Silikonové<br>náramky</h5>
<p class="assortment-p">Lorem ipsum dolor<br>
sit amet, consectetur<br>
adipiscing elit,<br>
sed do eiusmod<br>
tempor incididunt<br>
ut labore et dolore<br>
magna aliqua.</p>
<a href="#" class="assortment-more-btn text-center">- více zde -</a>
</div>
<div class="column">
<img class="thumbnail" src="http://placehold.it/250x250">
<h5 class="assortment-h5">Atypické<br>náramky</h5>
<p class="assortment-p">Lorem ipsum dolor<br>
sit amet, consectetur<br>
adipiscing elit,<br>
sed do eiusmod<br>
tempor incididunt<br>
ut labore et dolore<br>
magna aliqua.</p>
<a href="#" class="assortment-more-btn text-center">- více zde -</a>
</div>
<div class="column">
<img class="thumbnail" src="http://placehold.it/250x250">
<h5 class="assortment-h5">Papírové a látkové náramky</h5>
<p class="assortment-p">Lorem ipsum dolor<br>
sit amet, consectetur<br>
adipiscing elit,<br>
sed do eiusmod<br>
tempor incididunt<br>
ut labore et dolore<br>
magna aliqua.</p>
<a href="#" class="assortment-more-btn text-center">- více zde -</a>
</div>
<div class="column">
<img class="thumbnail" src="http://placehold.it/250x250">
<h5 class="assortment-h5">Silikonové<br>klíčenky</h5>
<p class="assortment-p">Lorem ipsum dolor<br>
sit amet, consectetur<br>
adipiscing elit,<br>
sed do eiusmod<br>
tempor incididunt<br>
ut labore et dolore<br>
magna aliqua.</p>
<a href="#" class="assortment-more-btn text-center">- více zde -</a>
</div>
</div>
<div class="grey-wrapper m-t-25 clearfix">
<div class="row column" id="sale-images">
<h2 class="m-b-25">Doprodej zboží</h2>
<div class="column medium-2 sale-image-holder">
<img src=" http://placehold.it/250x250">
<div class="sale-item-data text-center">
<h5>Název produktu</h5>
<p>popis</p>
<p>počet ks</p>
<p class="price">cena: 39,-Kč/ks</p>
<a href="#" class="button secondary rounded m-t-25">DETAIL</a>
</div>
</div>
<div class="column medium-2 sale-image-holder">
<img src=" http://placehold.it/250x250">
<div class="sale-item-data text-center">
<h5>Název produktu</h5>
<p>popis</p>
<p>počet ks</p>
<p class="price">cena: 39,-Kč/ks</p>
<a href="#" class="button secondary rounded m-t-25">DETAIL</a>
</div>
</div>
<div class="column medium-2 sale-image-holder">
<img src=" http://placehold.it/250x250">
<div class="sale-item-data text-center">
<h5>Název produktu</h5>
<p>popis</p>
<p>počet ks</p>
<p class="price">cena: 39,-Kč/ks</p>
<a href="#" class="button secondary rounded m-t-25">DETAIL</a>
</div>
</div>
<div class="column medium-2 sale-image-holder">
<img src=" http://placehold.it/250x250">
<div class="sale-item-data text-center">
<h5>Název produktu</h5>
<p>popis</p>
<p>počet ks</p>
<p class="price">cena: 39,-Kč/ks</p>
<a href="#" class="button secondary rounded m-t-25">DETAIL</a>
</div>
</div>
<div class="column medium-2 sale-image-holder">
<img src=" http://placehold.it/250x250">
<div class="sale-item-data text-center">
<h5>Název produktu</h5>
<p>popis</p>
<p>počet ks</p>
<p class="price">cena: 39,-Kč/ks</p>
<a href="#" class="button secondary rounded m-t-25">DETAIL</a>
</div>
</div>
<div class="column medium-2 sale-image-holder">
<img src=" http://placehold.it/250x250">
<div class="sale-item-data text-center">
<h5>Název produktu</h5>
<p>popis</p>
<p>počet ks</p>
<p class="price">cena: 39,-Kč/ks</p>
<a href="#" class="button secondary rounded m-t-25">DETAIL</a>
</div>
</div>
<div class="column medium-2 sale-image-holder">
<img src=" http://placehold.it/250x250">
<div class="sale-item-data text-center">
<h5>Název produktu</h5>
<p>popis</p>
<p>počet ks</p>
<p class="price">cena: 39,-Kč/ks</p>
<a href="#" class="button secondary rounded m-t-25">DETAIL</a>
</div>
</div>
<div class="column medium-2 sale-image-holder">
<img src=" http://placehold.it/250x250">
<div class="sale-item-data text-center">
<h5>Název produktu</h5>
<p>popis</p>
<p>počet ks</p>
<p class="price">cena: 39,-Kč/ks</p>
<a href="#" class="button secondary rounded m-t-25">DETAIL</a>
</div>
</div>
<div class="column medium-2 sale-image-holder">
<img src=" http://placehold.it/250x250">
<div class="sale-item-data text-center">
<h5>Název produktu</h5>
<p>popis</p>
<p>počet ks</p>
<p class="price">cena: 39,-Kč/ks</p>
<a href="#" class="button secondary rounded m-t-25">DETAIL</a>
</div>
</div>
<div class="column medium-2 sale-image-holder">
<img src=" http://placehold.it/250x250">
<div class="sale-item-data text-center">
<h5>Název produktu</h5>
<p>popis</p>
<p>počet ks</p>
<p class="price">cena: 39,-Kč/ks</p>
<a href="#" class="button secondary rounded m-t-25">DETAIL</a>
</div>
</div>
<div class="column medium-2 sale-image-holder">
<img src=" http://placehold.it/250x250">
<div class="sale-item-data text-center">
<h5>Název produktu</h5>
<p>popis</p>
<p>počet ks</p>
<p class="price">cena: 39,-Kč/ks</p>
<a href="#" class="button secondary rounded m-t-25">DETAIL</a>
</div>
</div>
<div class="column medium-2 sale-image-holder">
<img src=" http://placehold.it/250x250">
<div class="sale-item-data text-center">
<h5>Název produktu</h5>
<p>popis</p>
<p>počet ks</p>
<p class="price">cena: 39,-Kč/ks</p>
<a href="#" class="button secondary rounded m-t-25">DETAIL</a>
</div>
</div>
<div class="clearfix"></div>
</div>
<script type="text/javascript">
$('.sale-image-holder').mouseenter(function() {
$(this).find('.sale-item-data').animate({opacity: 1}, 100, 'swing');
}).mouseleave(function() {
$(this).find('.sale-item-data').animate({opacity: 0}, 300, 'swing');
})
</script>
</div>
<div class="green-wrapper clearfix">
<div class="row column text-center" id="questions">
<h4 class="w-t">MÁTE DOTAZY? NEBO NÁM CHCETE ZASLAT RYCHLOU POPTÁVKU?</h4>
<a href="#" class="button secondary m-t-25 large rounded">RYCHLÝ FORMULÁŘ</a>
</div>
</div>
<div class="white-wrapper clearfix">
<div class="row column" id="design">
<div class="columns medium-7">
<h6>Design a potisk</h6>
<p>
<strong><i>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua, amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</i></strong>
</p>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et
dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip
ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore
eu fugiat nulla pariatur.
</p>
</div>
<div class="columns medium-5">
<ul class="design-ul-block">
<li>
<h6 class="lowercase">
Proč si vybrat právě nás?
</h6>
<p class="small">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua, amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</p>
</li>
<li>
<h6 class="lowercase">
Jaký používáme materiál?
</h6>
<p class="small">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua, amet, consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</p>
</li>
</ul>
</div>
</div>
</div>
<div class="large">
<div class="row column text-center">
<h2 id="galerie">Galerie</h2>
<hr>
</div>
<div class="orbit footer" role="region" aria-label="Favorite Space Pictures" data-orbit>
<ul class="orbit-container text-center">
<button class="orbit-previous" aria-label="previous"><span class="show-for-sr">Previous Slide</span><i class="fa fa-fw fa-2x fa-chevron-left"></i></button>
<button class="orbit-next" aria-label="next"><span class="show-for-sr">Next Slide</span><i class="fa fa-fw fa-2x fa-chevron-right"></i></button>
<li class="orbit-slide is-active row p-lr-15">
<div class="column medium-3">
<img src=" http://placehold.it/250x250">.
</div>
<div class="column medium-3">
<img src=" http://placehold.it/250x250">
</div>
<div class="column medium-3">
<img src=" http://placehold.it/250x250">
</div>
<div class="column medium-3">
<img src=" http://placehold.it/250x250">
</div>
</li>
<li class="orbit-slide row p-lr-15">
<div class="column medium-3">
<img src=" http://placehold.it/250x250">.
</div>
<div class="column medium-3">
<img src=" http://placehold.it/250x250">
</div>
<div class="column medium-3">
<img src=" http://placehold.it/250x250">
</div>
<div class="column medium-3">
<img src=" http://placehold.it/250x250">
</div>
</li>
<li class="orbit-slide row p-lr-15">
<div class="column medium-3">
<img src=" http://placehold.it/250x250">.
</div>
<div class="column medium-3">
<img src=" http://placehold.it/250x250">
</div>
<div class="column medium-3">
<img src=" http://placehold.it/250x250">
</div>
<div class="column medium-3">
<img src=" http://placehold.it/250x250">
</div>
</li>
<li class="orbit-slide row p-lr-15">
<div class="column medium-3">
<img src=" http://placehold.it/250x250">.
</div>
<div class="column medium-3">
<img src=" http://placehold.it/250x250">
</div>
<div class="column medium-3">
<img src=" http://placehold.it/250x250">
</div>
<div class="column medium-3">
<img src=" http://placehold.it/250x250">
</div>
</li>
</ul>
</div>
</div>
</div>
<footer class="large">
<div class="row text-center">
<ul class="menu social-icons">
<li>
<a href="#" target="_blank">
<span class="fa-stack fa-lg">
<i class="fa fa-circle fa-stack-2x"></i>
<i class="fa fa-facebook fa-stack-1x w-t"></i>
</span>
</a>
</li>
<li>
<a href="#" target="_blank">
<span class="fa-stack fa-lg">
<i class="fa fa-circle fa-stack-2x"></i>
<i class="fa fa fa-google-plus fa-stack-1x w-t"></i>
</span>
</a>
</li>
<li>
<a href="#" target="_blank">
<span class="fa-stack fa-lg">
<i class="fa fa-circle fa-stack-2x"></i>
<i class="fa fa-instagram fa-stack-1x w-t"></i>
</span>
</a>
</li>
<li>
<a href="#" target="_blank">
<span class="fa-stack fa-lg">
<i class="fa fa-circle fa-stack-2x"></i>
<i class="fa fa-pinterest-p fa-stack-1x w-t"></i>
</span>
</a>
</li>
</ul>
<div class="clearfix"></div>
<ul class="menu">
<li><a href="#" class="active">Home</a></li>
<li><a href="#">Sortiment</a></li>
<li><a href="#">Doprodej</a></li>
<li><a href="#">Galerie</a></li>
<li><a href="#">O nás</a></li>
<li><a href="#">Kontakt</a></li>
</ul>
<div class="clearfix"></div>
<hr>
<p>
<a href="#">Název</a> -
<a href="#">Adresa</a> -
<a href="#">www.url.cz</a> -
<a href="#">email@email</a> -
<a href="#">00420147852369</a>
</p>
</div>
</footer>
<script type="text/javascript">
$(function() {
$(document).foundation();
});
</script>
</body>
</html>
@@ -0,0 +1,5 @@
@extendVisitor('visitor.layout')
@section('content')
{!! $page->content !!}
@endsection
@@ -0,0 +1,15 @@
@extendVisitor('layout')
@section('content')
{!! $page->content !!}
<h3>Subpages</h3>
@forelse($page->subpages() as $subpage)
<h3>{{$subpage->title}}</h3>
<p>{{$subpage->meta_description}}</p>
@empty
<em>None :(</em>
@endforelse
@endsection
@@ -0,0 +1,5 @@
@extendVisitor('layout')
@section('content')
{!! $page->content !!}
@endsection
@@ -0,0 +1,20 @@
<div class="orbit header {{$settings->sliderClass}}" role="region" data-orbit>
<ul class="orbit-container">
<button class="orbit-previous" aria-label="previous"><span class="show-for-sr">Previous Slide</span><i
class="fa fa-fw fa-2x fa-chevron-left"></i></button>
<button class="orbit-next" aria-label="next"><span class="show-for-sr">Next Slide</span><i
class="fa fa-fw fa-2x fa-chevron-right"></i></button>
@foreach($images as $i => $image)
@include('widgets.orbitSlider.image', ['image' => $image, 'order' => $i])
@endforeach
</ul>
<nav class="orbit-bullets">
@foreach($images as $i => $image)
<button @if($i == 0) class="is-active" @endif data-slide="{{$i}}"></button>
@endforeach
</nav>
{!! $settings->code !!}
</div>
@@ -0,0 +1,5 @@
<li class="orbit-slide @if($order == 0)is-active @endif">
<h2>{{$image->name}}</h2>
<h3>{{$image->description}}</h3>
<div class="img" style="background-image: url({{config('app.upload_url')}}/{{$image->filename}})"></div>
</li>