*/
public function getAvatar($size = 50)
{
- $default = baseUrl('/user_avatar.png');
+ $default = url('/user_avatar.png');
$imageId = $this->image_id;
if ($imageId === 0 || $imageId === '0' || $imageId === null) {
return $default;
}
try {
- $avatar = $this->avatar ? baseUrl($this->avatar->getThumb($size, $size, false)) : $default;
+ $avatar = $this->avatar ? url($this->avatar->getThumb($size, $size, false)) : $default;
} catch (\Exception $err) {
$avatar = $default;
}
*/
public function getEditUrl()
{
- return baseUrl('/settings/users/' . $this->id);
+ return url('/settings/users/' . $this->id);
}
/**
*/
public function getProfileUrl()
{
- return baseUrl('/user/' . $this->id);
+ return url('/user/' . $this->id);
}
/**
// and used by BookStack in URL generation.
'url' => env('APP_URL', '') === 'http://bookstack.dev' ? '' : env('APP_URL', ''),
+ // Rewrite URL, Used to rewrite the base of request URLs
+ // for scenarios
+ 'url_base_rewrite' => env('APP_URL_BASE_REWRITE', null),
+
// Application timezone for back-end date functions.
'timezone' => env('APP_TIMEZONE', 'UTC'),
public function getUrl($path = false)
{
if ($path !== false) {
- return baseUrl('/books/' . urlencode($this->slug) . '/' . trim($path, '/'));
+ return url('/books/' . urlencode($this->slug) . '/' . trim($path, '/'));
}
- return baseUrl('/books/' . urlencode($this->slug));
+ return url('/books/' . urlencode($this->slug));
}
/**
}
try {
- $cover = $this->cover ? baseUrl($this->cover->getThumb($width, $height, false)) : $default;
+ $cover = $this->cover ? url($this->cover->getThumb($width, $height, false)) : $default;
} catch (\Exception $err) {
$cover = $default;
}
public function getUrl($path = false)
{
if ($path !== false) {
- return baseUrl('/shelves/' . urlencode($this->slug) . '/' . trim($path, '/'));
+ return url('/shelves/' . urlencode($this->slug) . '/' . trim($path, '/'));
}
- return baseUrl('/shelves/' . urlencode($this->slug));
+ return url('/shelves/' . urlencode($this->slug));
}
/**
}
try {
- $cover = $this->cover ? baseUrl($this->cover->getThumb($width, $height, false)) : $default;
+ $cover = $this->cover ? url($this->cover->getThumb($width, $height, false)) : $default;
} catch (\Exception $err) {
$cover = $default;
}
public function getUrl($path = false)
{
$bookSlug = $this->getAttribute('bookSlug') ? $this->getAttribute('bookSlug') : $this->book->slug;
+ $fullPath = '/books/' . urlencode($bookSlug) . '/chapter/' . urlencode($this->slug);
+
if ($path !== false) {
- return baseUrl('/books/' . urlencode($bookSlug) . '/chapter/' . urlencode($this->slug) . '/' . trim($path, '/'));
+ $fullPath .= '/' . trim($path, '/');
}
- return baseUrl('/books/' . urlencode($bookSlug) . '/chapter/' . urlencode($this->slug));
+
+ return url($fullPath);
}
/**
$idComponent = $this->draft ? $this->id : urlencode($this->slug);
if ($path !== false) {
- return baseUrl('/books/' . urlencode($bookSlug) . $midText . $idComponent . '/' . trim($path, '/'));
+ return url('/books/' . urlencode($bookSlug) . $midText . $idComponent . '/' . trim($path, '/'));
}
- return baseUrl('/books/' . urlencode($bookSlug) . $midText . $idComponent);
+ return url('/books/' . urlencode($bookSlug) . $midText . $idComponent);
}
/**
$this->socialAuthService = $socialAuthService;
$this->ldapService = $ldapService;
$this->userRepo = $userRepo;
- $this->redirectPath = baseUrl('/');
- $this->redirectAfterLogout = baseUrl('/login');
+ $this->redirectPath = url('/');
+ $this->redirectAfterLogout = url('/login');
parent::__construct();
}
namespace BookStack\Http\Controllers\Auth;
+use BookStack\Auth\Access\EmailConfirmationService;
+use BookStack\Auth\Access\SocialAuthService;
use BookStack\Auth\SocialAccount;
use BookStack\Auth\User;
use BookStack\Auth\UserRepo;
+use BookStack\Exceptions\SocialDriverNotConfigured;
use BookStack\Exceptions\SocialSignInAccountNotUsed;
use BookStack\Exceptions\SocialSignInException;
use BookStack\Exceptions\UserRegistrationException;
use BookStack\Http\Controllers\Controller;
use Exception;
use Illuminate\Foundation\Auth\RegistersUsers;
+use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
+use Illuminate\Routing\Redirector;
+use Illuminate\View\View;
use Laravel\Socialite\Contracts\User as SocialUser;
use Validator;
/**
* Create a new controller instance.
*
- * @param \BookStack\Auth\Access\SocialAuthService $socialAuthService
+ * @param SocialAuthService $socialAuthService
* @param \BookStack\Auth\EmailConfirmationService $emailConfirmationService
- * @param \BookStack\Auth\UserRepo $userRepo
+ * @param UserRepo $userRepo
*/
- public function __construct(\BookStack\Auth\Access\SocialAuthService $socialAuthService, \BookStack\Auth\Access\EmailConfirmationService $emailConfirmationService, UserRepo $userRepo)
+ public function __construct(SocialAuthService $socialAuthService, EmailConfirmationService $emailConfirmationService, UserRepo $userRepo)
{
$this->middleware('guest')->only(['getRegister', 'postRegister', 'socialRegister']);
$this->socialAuthService = $socialAuthService;
$this->emailConfirmationService = $emailConfirmationService;
$this->userRepo = $userRepo;
- $this->redirectTo = baseUrl('/');
- $this->redirectPath = baseUrl('/');
+ $this->redirectTo = url('/');
+ $this->redirectPath = url('/');
parent::__construct();
}
/**
* Handle a registration request for the application.
- * @param Request|\Illuminate\Http\Request $request
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+ * @param Request|Request $request
+ * @return RedirectResponse|Redirector
* @throws UserRegistrationException
*/
public function postRegister(Request $request)
/**
* Create a new user instance after a valid registration.
* @param array $data
- * @return \BookStack\Auth\User
+ * @return User
*/
protected function create(array $data)
{
* @param array $userData
* @param bool|false|SocialAccount $socialAccount
* @param bool $emailVerified
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+ * @return RedirectResponse|Redirector
* @throws UserRegistrationException
*/
protected function registerUser(array $userData, $socialAccount = false, $emailVerified = false)
/**
* Confirms an email via a token and logs the user into the system.
* @param $token
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+ * @return RedirectResponse|Redirector
* @throws UserRegistrationException
*/
public function confirmEmail($token)
/**
* Shows a notice that a user's email address has not been confirmed,
* Also has the option to re-send the confirmation email.
- * @return \Illuminate\View\View
+ * @return View
*/
public function showAwaitingConfirmation()
{
/**
* Resend the confirmation email
* @param Request $request
- * @return \Illuminate\View\View
+ * @return View
*/
public function resendConfirmation(Request $request)
{
* @param $socialDriver
* @return mixed
* @throws UserRegistrationException
- * @throws \BookStack\Exceptions\SocialDriverNotConfigured
+ * @throws SocialDriverNotConfigured
*/
public function socialRegister($socialDriver)
{
* The callback for social login services.
* @param $socialDriver
* @param Request $request
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+ * @return RedirectResponse|Redirector
* @throws SocialSignInException
* @throws UserRegistrationException
- * @throws \BookStack\Exceptions\SocialDriverNotConfigured
+ * @throws SocialDriverNotConfigured
*/
public function socialCallback($socialDriver, Request $request)
{
/**
* Detach a social account from a user.
* @param $socialDriver
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+ * @return RedirectResponse|Redirector
*/
public function detachSocialAccount($socialDriver)
{
* Register a new user after a registration callback.
* @param string $socialDriver
* @param SocialUser $socialUser
- * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
+ * @return RedirectResponse|Redirector
* @throws UserRegistrationException
*/
protected function socialRegisterCallback(string $socialDriver, SocialUser $socialUser)
public function showRecentlyUpdated()
{
// TODO - Still exist?
- $pages = $this->pageRepo->getRecentlyUpdatedPaginated('page', 20)->setPath(baseUrl('/pages/recently-updated'));
+ $pages = $this->pageRepo->getRecentlyUpdatedPaginated('page', 20)->setPath(url('/pages/recently-updated'));
return view('pages.detailed-listing', [
'title' => trans('entities.recently_updated_pages'),
'pages' => $pages
$this->setPageTitle(trans('entities.search_for_term', ['term' => $searchTerm]));
$page = intval($request->get('page', '0')) ?: 1;
- $nextPageLink = baseUrl('/search?term=' . urlencode($searchTerm) . '&page=' . ($page+1));
+ $nextPageLink = url('/search?term=' . urlencode($searchTerm) . '&page=' . ($page+1));
$results = $this->searchService->searchEntities($searchTerm, 'all', $page, 20);
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
- return redirect()->guest(baseUrl('/login'));
+ return redirect()->guest(url('/login'));
}
}
--- /dev/null
+<?php namespace BookStack\Http;
+
+use Illuminate\Http\Request as LaravelRequest;
+
+class Request extends LaravelRequest
+{
+
+ /**
+ * Override the default request methods to get the scheme and host
+ * to set the custom APP_URL, if set.
+ * @return \Illuminate\Config\Repository|mixed|string
+ */
+ public function getSchemeAndHttpHost()
+ {
+ $base = config('app.url', null);
+
+ if ($base) {
+ $base = trim($base, '/');
+ } else {
+ $base = $this->getScheme().'://'.$this->getHttpHost();
+ }
+
+ return $base;
+ }
+
+}
\ No newline at end of file
->subject(trans('auth.email_confirm_subject', $appName))
->greeting(trans('auth.email_confirm_greeting', $appName))
->line(trans('auth.email_confirm_text'))
- ->action(trans('auth.email_confirm_action'), baseUrl('/register/confirm/' . $this->token));
+ ->action(trans('auth.email_confirm_action'), url('/register/confirm/' . $this->token));
}
}
return $this->newMailMessage()
->subject(trans('auth.email_reset_subject', ['appName' => setting('app-name')]))
->line(trans('auth.email_reset_text'))
- ->action(trans('auth.reset_password'), baseUrl('password/reset/' . $this->token))
+ ->action(trans('auth.reset_password'), url('password/reset/' . $this->token))
->line(trans('auth.email_reset_not_requested'));
}
}
use BookStack\Entities\Page;
use BookStack\Settings\Setting;
use BookStack\Settings\SettingService;
-use BookStack\UrlGenerator;
use Illuminate\Database\Eloquent\Relations\Relation;
use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider;
use Schema;
+use URL;
use Validator;
class AppServiceProvider extends ServiceProvider
*/
public function boot()
{
+ // Set root URL
+ URL::forceRootUrl(config('app.url'));
+
// Custom validation methods
Validator::extend('image_extension', function ($attribute, $value, $parameters, $validator) {
$validImageExtensions = ['png', 'jpg', 'jpeg', 'bmp', 'gif', 'tiff', 'webp'];
$this->app->singleton(SettingService::class, function ($app) {
return new SettingService($app->make(Setting::class), $app->make('Illuminate\Contracts\Cache\Repository'));
});
-
- $this->app->bind(
- \Illuminate\Contracts\Routing\UrlGenerator::class,
- UrlGenerator::class
- );
}
}
});
Paginator::currentPathResolver(function () {
- return baseUrl($this->app['request']->path());
+ return url($this->app['request']->path());
});
Paginator::currentPageResolver(function ($pageName = 'page') {
if ($this->external && strpos($this->path, 'http') !== 0) {
return $this->path;
}
- return baseUrl('/attachments/' . $this->id);
+ return url('/attachments/' . $this->id);
}
}
$isLocal = strpos(trim($uri), 'http') !== 0;
// Attempt to find local files even if url not absolute
- $base = baseUrl('/');
+ $base = url('/');
if (!$isLocal && strpos($uri, $base) === 0) {
$isLocal = true;
$uri = str_replace($base, '', $uri);
$this->storageUrl = $storageUrl;
}
- $basePath = ($this->storageUrl == false) ? baseUrl('/') : $this->storageUrl;
+ $basePath = ($this->storageUrl == false) ? url('/') : $this->storageUrl;
return rtrim($basePath, '/') . $filePath;
}
}
+++ /dev/null
-<?php
-
-namespace BookStack;
-
-class UrlGenerator extends \Illuminate\Routing\UrlGenerator
-{
-
- /**
- * Generate an absolute URL to the given path.
- *
- * @param string $path
- * @param mixed $extra
- * @param bool|null $secure
- * @return string
- */
- public function to($path, $extra = [], $secure = null)
- {
- $tail = implode('/', array_map(
- 'rawurlencode', (array) $this->formatParameters($extra))
- );
-
- $defaultRoot = $this->formatRoot($this->formatScheme($secure));
-
- list($path, $query) = $this->extractQueryString($path);
-
- return $this->formatWithBase(
- $defaultRoot, trim($path.'/'.$tail, '/')
- ).$query;
- }
-
- /**
- * Format the given URL segments into a single URL.
- *
- * @param string $defaultRoot
- * @param string $path
- * @return string
- */
- public function formatWithBase($defaultRoot, $path)
- {
- $isFullPath = strpos($path, 'http') === 0;
- $setBasePath = trim(config('app.url'), '/');
-
- if ($isFullPath) {
- return $path;
- }
-
- if (! empty($setBasePath)) {
- $defaultRoot = $setBasePath;
- }
-
- // TODO - Add mechanism to set path correctly for intended() and back() redirects
- // TODO - Update tests to align with new system
- // TODO - Clean up helpers and refactor their usage.
-
- return trim($defaultRoot. '/' .$path, '/');
- }
-
-}
\ No newline at end of file
<?php
use BookStack\Auth\Permissions\PermissionService;
-use BookStack\Entities\Entity;
+use BookStack\Auth\User;
use BookStack\Ownable;
+use BookStack\Settings\SettingService;
/**
* Get the path to a versioned file.
* @return string
* @throws Exception
*/
-function versioned_asset($file = '')
+function versioned_asset($file = '') : string
{
static $version = null;
}
$path = $file . '?version=' . urlencode($version) . $additional;
- return baseUrl($path);
+ return url($path);
}
/**
* Helper method to get the current User.
* Defaults to public 'Guest' user if not logged in.
- * @return \BookStack\Auth\User
+ * @return User
*/
-function user()
+function user() : User
{
- return auth()->user() ?: \BookStack\Auth\User::getDefault();
+ return auth()->user() ?: User::getDefault();
}
/**
* that particular item.
* @param string $permission
* @param Ownable $ownable
- * @return mixed
+ * @return bool
*/
-function userCan(string $permission, Ownable $ownable = null)
+function userCan(string $permission, Ownable $ownable = null) : bool
{
if ($ownable === null) {
return user() && user()->can($permission);
* @param string|null $entityClass
* @return bool
*/
-function userCanOnAny(string $permission, string $entityClass = null)
+function userCanOnAny(string $permission, string $entityClass = null) : bool
{
$permissionService = app(PermissionService::class);
return $permissionService->checkUserHasPermissionOnAnything($permission, $entityClass);
* Helper to access system settings.
* @param $key
* @param bool $default
- * @return bool|string|\BookStack\Settings\SettingService
+ * @return bool|string|SettingService
*/
function setting($key = null, $default = false)
{
- $settingService = resolve(\BookStack\Settings\SettingService::class);
+ $settingService = resolve(SettingService::class);
if (is_null($key)) {
return $settingService;
}
return $settingService->get($key, $default);
}
-/**
- * Helper to create url's relative to the applications root path.
- * @param string $path
- * @param bool $forceAppDomain
- * @return string
- */
-function baseUrl($path, $forceAppDomain = false)
-{
- return url($path);
- $isFullUrl = strpos($path, 'http') === 0;
- if ($isFullUrl && !$forceAppDomain) {
- return $path;
- }
-
- $path = trim($path, '/');
- $base = rtrim(config('app.url'), '/');
-
- // Remove non-specified domain if forced and we have a domain
- if ($isFullUrl && $forceAppDomain) {
- if (!empty($base) && strpos($path, $base) === 0) {
- $path = mb_substr($path, mb_strlen($base));
- } else {
- $explodedPath = explode('/', $path);
- $path = implode('/', array_splice($explodedPath, 3));
- }
- }
-
- // Return normal url path if not specified in config
- if (config('app.url') === '') {
- return url($path);
- }
-
- return $base . '/' . ltrim($path, '/');
-}
-
-/**
- * Get an instance of the redirector.
- * Overrides the default laravel redirect helper.
- * Ensures it redirects even when the app is in a subdirectory.
- *
- * @param string|null $to
- * @param int $status
- * @param array $headers
- * @param bool $secure
- * @return \Illuminate\Routing\Redirector|\Illuminate\Http\RedirectResponse
- */
-function redirect($to = null, $status = 302, $headers = [], $secure = null)
-{
- if (is_null($to)) {
- return app('redirect');
- }
-
- $to = baseUrl($to);
-
- return app('redirect')->to($to, $status, $headers, $secure);
-}
-
/**
* Get a path to a theme resource.
* @param string $path
- * @return string|boolean
+ * @return string
*/
-function theme_path($path = '')
+function theme_path($path = '') : string
{
$theme = config('view.theme');
if (!$theme) {
- return false;
+ return '';
}
return base_path('themes/' . $theme .($path ? DIRECTORY_SEPARATOR.$path : $path));
return $path;
}
- return baseUrl($path . '?' . implode('&', $queryStringSections));
+ return url($path . '?' . implode('&', $queryStringSections));
}
*/
$app = require_once __DIR__.'/../bootstrap/app.php';
+$app->alias('request', \BookStack\Http\Request::class);
/*
|--------------------------------------------------------------------------
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
$response = $kernel->handle(
- $request = Illuminate\Http\Request::capture()
+ $request = \BookStack\Http\Request::capture()
);
$response->send();
<label for="password">{{ trans('auth.password') }}</label>
@include('form.password', ['name' => 'password', 'tabindex' => 1])
<span class="block small mt-s">
- <a href="{{ baseUrl('/password/email') }}">{{ trans('auth.forgot_password') }}</a>
+ <a href="{{ url('/password/email') }}">{{ trans('auth.forgot_password') }}</a>
</span>
</div>
<div class="card content-wrap auto-height">
<h1 class="list-heading">{{ title_case(trans('auth.log_in')) }}</h1>
- <form action="{{ baseUrl('/login') }}" method="POST" id="login-form" class="mt-l">
+ <form action="{{ url('/login') }}" method="POST" id="login-form" class="mt-l">
{!! csrf_field() !!}
<div class="stretch-inputs">
<hr class="my-l">
@foreach($socialDrivers as $driver => $name)
<div>
- <a id="social-login-{{$driver}}" class="button outline block svg" href="{{ baseUrl("/login/service/" . $driver) }}">
+ <a id="social-login-{{$driver}}" class="button outline block svg" href="{{ url("/login/service/" . $driver) }}">
@icon('auth/' . $driver)
{{ trans('auth.log_in_with', ['socialDriver' => $name]) }}
</a>
@if(setting('registration-enabled', false))
<div class="text-center pb-s">
<hr class="my-l">
- <a href="{{ baseUrl('/register') }}">{{ trans('auth.dont_have_account') }}</a>
+ <a href="{{ url('/register') }}">{{ trans('auth.dont_have_account') }}</a>
</div>
@endif
</div>
<p class="text-muted small">{{ trans('auth.reset_password_send_instructions') }}</p>
- <form action="{{ baseUrl("/password/email") }}" method="POST" class="stretch-inputs">
+ <form action="{{ url("/password/email") }}" method="POST" class="stretch-inputs">
{!! csrf_field() !!}
<div class="form-group">
<div class="card content-wrap auto-height">
<h1 class="list-heading">{{ trans('auth.reset_password') }}</h1>
- <form action="{{ baseUrl("/password/reset") }}" method="POST" class="stretch-inputs">
+ <form action="{{ url("/password/reset") }}" method="POST" class="stretch-inputs">
{!! csrf_field() !!}
<input type="hidden" name="token" value="{{ $token }}">
<div class="card content-wrap auto-height">
<h1 class="list-heading">{{ title_case(trans('auth.sign_up')) }}</h1>
- <form action="{{ baseUrl("/register") }}" method="POST" class="mt-l stretch-inputs">
+ <form action="{{ url("/register") }}" method="POST" class="mt-l stretch-inputs">
{!! csrf_field() !!}
<div class="form-group">
<div class="grid half collapse-xs gap-xl v-center mt-m">
<div class="text-small">
- <a href="{{ baseUrl('/login') }}">{{ trans('auth.already_have_account') }}</a>
+ <a href="{{ url('/login') }}">{{ trans('auth.already_have_account') }}</a>
</div>
<div class="from-group text-right">
<button class="button primary">{{ trans('auth.create_account') }}</button>
<hr class="my-l">
@foreach($socialDrivers as $driver => $name)
<div>
- <a id="social-register-{{$driver}}" class="button block outline svg" href="{{ baseUrl("/register/service/" . $driver) }}">
+ <a id="social-register-{{$driver}}" class="button block outline svg" href="{{ url("/register/service/" . $driver) }}">
@icon('auth/' . $driver)
{{ trans('auth.sign_up_with', ['socialDriver' => $name]) }}
</a>
{{ trans('auth.email_not_confirmed_resend') }}
</p>
- <form action="{{ baseUrl("/register/confirm/resend") }}" method="POST" class="stretch-inputs">
+ <form action="{{ url("/register/confirm/resend") }}" method="POST" class="stretch-inputs">
{!! csrf_field() !!}
<div class="form-group">
<label for="email">{{ trans('auth.email') }}</label>
<!-- Meta -->
<meta name="viewport" content="width=device-width">
<meta name="token" content="{{ csrf_token() }}">
- <meta name="base-url" content="{{ baseUrl('/') }}">
+ <meta name="base-url" content="{{ url('/') }}">
<meta charset="utf-8">
<!-- Styles and Fonts -->
<div class="content-wrap card">
<h1 class="list-heading">{{ trans('entities.books_create') }}</h1>
- <form action="{{ isset($bookshelf) ? $bookshelf->getUrl('/create-book') : baseUrl('/books') }}" method="POST" enctype="multipart/form-data">
+ <form action="{{ isset($bookshelf) ? $bookshelf->getUrl('/create-book') : url('/books') }}" method="POST" enctype="multipart/form-data">
@include('books.form')
</form>
</div>
<p class="small">{{ trans('common.cover_image_description') }}</p>
@include('components.image-picker', [
- 'defaultImage' => baseUrl('/book_default_cover.png'),
- 'currentImage' => (isset($model) && $model->cover) ? $model->getBookCover() : baseUrl('/book_default_cover.png') ,
+ 'defaultImage' => url('/book_default_cover.png'),
+ 'currentImage' => (isset($model) && $model->cover) ? $model->getBookCover() : url('/book_default_cover.png') ,
'name' => 'image',
'imageClass' => 'cover'
])
</div>
<div class="form-group text-right">
- <a href="{{ isset($book) ? $book->getUrl() : baseUrl('/books') }}" class="button outline">{{ trans('common.cancel') }}</a>
+ <a href="{{ isset($book) ? $book->getUrl() : url('/books') }}" class="button outline">{{ trans('common.cancel') }}</a>
<button type="submit" class="button primary">{{ trans('entities.books_save') }}</button>
</div>
\ No newline at end of file
<h5>{{ trans('common.actions') }}</h5>
<div class="icon-list text-primary">
@if($currentUser->can('book-create-all'))
- <a href="{{ baseUrl("/create-book") }}" class="icon-list-item">
+ <a href="{{ url("/create-book") }}" class="icon-list-item">
<span>@icon('add')</span>
<span>{{ trans('entities.books_create') }}</span>
</a>
@else
<p class="text-muted">{{ trans('entities.books_empty') }}</p>
@if(userCan('books-create-all'))
- <a href="{{ baseUrl("/create-book") }}" class="text-pos">@icon('edit'){{ trans('entities.create_now') }}</a>
+ <a href="{{ url("/create-book") }}" class="text-pos">@icon('edit'){{ trans('entities.create_now') }}</a>
@endif
@endif
</div>
\ No newline at end of file
<div class="grid mx-l">
<div>
- <a href="{{ baseUrl('/') }}" class="logo">
+ <a href="{{ url('/') }}" class="logo">
@if(setting('app-logo', '') !== 'none')
- <img class="logo-image" src="{{ setting('app-logo', '') === '' ? baseUrl('/logo.png') : baseUrl(setting('app-logo', '')) }}" alt="Logo">
+ <img class="logo-image" src="{{ setting('app-logo', '') === '' ? url('/logo.png') : url(setting('app-logo', '')) }}" alt="Logo">
@endif
@if (setting('app-name-header'))
<span class="logo-text">{{ setting('app-name') }}</span>
<div class="header-search hide-under-l">
@if (hasAppAccess())
- <form action="{{ baseUrl('/search') }}" method="GET" class="search-box">
+ <form action="{{ url('/search') }}" method="GET" class="search-box">
<button id="header-search-box-button" type="submit">@icon('search') </button>
<input id="header-search-box-input" type="text" name="term" tabindex="2" placeholder="{{ trans('common.search') }}" value="{{ isset($searchTerm) ? $searchTerm : '' }}">
</form>
<div class="header-links">
<div class="links text-center">
@if (hasAppAccess())
- <a class="hide-over-l" href="{{ baseUrl('/search') }}">@icon('search'){{ trans('common.search') }}</a>
+ <a class="hide-over-l" href="{{ url('/search') }}">@icon('search'){{ trans('common.search') }}</a>
@if(userCanOnAny('view', \BookStack\Entities\Bookshelf::class) || userCan('bookshelf-view-all') || userCan('bookshelf-view-own'))
- <a href="{{ baseUrl('/shelves') }}">@icon('bookshelf'){{ trans('entities.shelves') }}</a>
+ <a href="{{ url('/shelves') }}">@icon('bookshelf'){{ trans('entities.shelves') }}</a>
@endif
- <a href="{{ baseUrl('/books') }}">@icon('books'){{ trans('entities.books') }}</a>
+ <a href="{{ url('/books') }}">@icon('books'){{ trans('entities.books') }}</a>
@if(signedInUser() && userCan('settings-manage'))
- <a href="{{ baseUrl('/settings') }}">@icon('settings'){{ trans('settings.settings') }}</a>
+ <a href="{{ url('/settings') }}">@icon('settings'){{ trans('settings.settings') }}</a>
@endif
@if(signedInUser() && userCan('users-manage') && !userCan('settings-manage'))
- <a href="{{ baseUrl('/settings/users') }}">@icon('users'){{ trans('settings.users') }}</a>
+ <a href="{{ url('/settings/users') }}">@icon('users'){{ trans('settings.users') }}</a>
@endif
@endif
@if(!signedInUser())
@if(setting('registration-enabled', false))
- <a href="{{ baseUrl('/register') }}">@icon('new-user') {{ trans('auth.sign_up') }}</a>
+ <a href="{{ url('/register') }}">@icon('new-user') {{ trans('auth.sign_up') }}</a>
@endif
- <a href="{{ baseUrl('/login') }}">@icon('login') {{ trans('auth.log_in') }}</a>
+ <a href="{{ url('/login') }}">@icon('login') {{ trans('auth.log_in') }}</a>
@endif
</div>
@if(signedInUser())
</span>
<ul class="dropdown-menu">
<li>
- <a href="{{ baseUrl("/user/{$currentUser->id}") }}">@icon('user'){{ trans('common.view_profile') }}</a>
+ <a href="{{ url("/user/{$currentUser->id}") }}">@icon('user'){{ trans('common.view_profile') }}</a>
</li>
<li>
- <a href="{{ baseUrl("/settings/users/{$currentUser->id}") }}">@icon('edit'){{ trans('common.edit_profile') }}</a>
+ <a href="{{ url("/settings/users/{$currentUser->id}") }}">@icon('edit'){{ trans('common.edit_profile') }}</a>
</li>
<li>
- <a href="{{ baseUrl('/logout') }}">@icon('logout'){{ trans('auth.logout') }}</a>
+ <a href="{{ url('/logout') }}">@icon('logout'){{ trans('auth.logout') }}</a>
</li>
</ul>
</div>
</div>
<div class="mb-xl">
- <h5><a class="no-color" href="{{ baseUrl("/pages/recently-updated") }}">{{ trans('entities.recently_updated_pages') }}</a></h5>
+ <h5><a class="no-color" href="{{ url("/pages/recently-updated") }}">{{ trans('entities.recently_updated_pages') }}</a></h5>
<div id="recently-updated-pages">
@include('partials.entity-list', [
'entities' => $recentlyUpdatedPages,
<div>
<div id="recent-pages" class="card mb-xl">
- <h3 class="card-title"><a class="no-color" href="{{ baseUrl("/pages/recently-updated") }}">{{ trans('entities.recently_updated_pages') }}</a></h3>
+ <h3 class="card-title"><a class="no-color" href="{{ url("/pages/recently-updated") }}">{{ trans('entities.recently_updated_pages') }}</a></h3>
<div id="recently-updated-pages" class="px-m">
@include('partials.entity-list', [
'entities' => $recentlyUpdatedPages,
--}}
<?php $isOpen = setting()->getForCurrentUser('section_expansion#'. $key); ?>
<a expand-toggle="{{ $target }}"
- expand-toggle-update-endpoint="{{ baseUrl('/settings/users/'. $currentUser->id .'/update-expansion-preference/' . $key) }}"
+ expand-toggle-update-endpoint="{{ url('/settings/users/'. $currentUser->id .'/update-expansion-preference/' . $key) }}"
expand-toggle-is-open="{{ $isOpen ? 'yes' : 'no' }}"
class="text-muted icon-list-item text-primary">
<span>@icon('expand-text')</span>
<div page-picker>
<div class="input-base">
<span @if($value) style="display: none" @endif page-picker-default class="text-muted italic">{{ $placeholder }}</span>
- <a @if(!$value) style="display: none" @endif href="{{ baseUrl('/link/' . $value) }}" target="_blank" class="text-page" page-picker-display>#{{$value}}, {{$value ? \BookStack\Entities\Page::find($value)->name : '' }}</a>
+ <a @if(!$value) style="display: none" @endif href="{{ url('/link/' . $value) }}" target="_blank" class="text-page" page-picker-display>#{{$value}}, {{$value ? \BookStack\Entities\Page::find($value)->name : '' }}</a>
</div>
<br>
<input type="hidden" value="{{$value}}" name="{{$name}}" id="{{$name}}">
@foreach($entity->tags as $tag)
<div class="tag-item primary-background-light">
- <div class="tag-name"><a href="{{ baseUrl('/search?term=%5B' . urlencode($tag->name) .'%5D') }}">@icon('tag'){{ $tag->name }}</a></div>
- @if($tag->value) <div class="tag-value"><a href="{{ baseUrl('/search?term=%5B' . urlencode($tag->name) .'%3D' . urlencode($tag->value) . '%5D') }}">{{$tag->value}}</a></div> @endif
+ <div class="tag-name"><a href="{{ url('/search?term=%5B' . urlencode($tag->name) .'%5D') }}">@icon('tag'){{ $tag->name }}</a></div>
+ @if($tag->value) <div class="tag-value"><a href="{{ url('/search?term=%5B' . urlencode($tag->name) .'%3D' . urlencode($tag->value) . '%5D') }}">{{$tag->value}}</a></div> @endif
</div>
@endforeach
\ No newline at end of file
<div v-for="(tag, i) in tags" :key="tag.key" class="card drag-card">
<div class="handle" >@icon('grip')</div>
<div>
- <autosuggest url="{{ baseUrl('/ajax/tags/suggest/names') }}" type="name" class="outline" :name="getTagFieldName(i, 'name')"
+ <autosuggest url="{{ url('/ajax/tags/suggest/names') }}" type="name" class="outline" :name="getTagFieldName(i, 'name')"
v-model="tag.name" @input="tagChange(tag)" @blur="tagBlur(tag)" placeholder="{{ trans('entities.tag') }}"/>
</div>
<div>
- <autosuggest url="{{ baseUrl('/ajax/tags/suggest/values') }}" type="value" class="outline" :name="getTagFieldName(i, 'value')"
+ <autosuggest url="{{ url('/ajax/tags/suggest/values') }}" type="value" class="outline" :name="getTagFieldName(i, 'value')"
v-model="tag.value" @change="tagChange(tag)" @blur="tagBlur(tag)" placeholder="{{ trans('entities.tag_value') }}"/>
</div>
<div v-show="tags.length !== 1" class="text-center drag-card-action text-neg" @click="removeTag(tag)">@icon('close')</div>
<h5>{{ trans('errors.sorry_page_not_found') }}</h5>
</div>
<div class="text-right">
- <a href="{{ baseUrl('/') }}" class="button outline">{{ trans('errors.return_home') }}</a>
+ <a href="{{ url('/') }}" class="button outline">{{ trans('errors.return_home') }}</a>
</div>
</div>
<h3 class="text-muted">{{ trans('errors.error_occurred') }}</h3>
<div class="body">
<h5>{{ $message ?? 'An unknown error occurred' }}</h5>
- <p><a href="{{ baseUrl('/') }}" class="button outline">{{ trans('errors.return_home') }}</a></p>
+ <p><a href="{{ url('/') }}" class="button outline">{{ trans('errors.return_home') }}</a></p>
</div>
</div>
</div>
@extends('base')
@section('head')
- <script src="{{ baseUrl('/libs/tinymce/tinymce.min.js?ver=4.9.4') }}"></script>
+ <script src="{{ url('/libs/tinymce/tinymce.min.js?ver=4.9.4') }}"></script>
@stop
@section('body-class', 'flexbox')
{{-- Show top level books item --}}
@if (count($crumbs) > 0 && array_first($crumbs) instanceof \BookStack\Entities\Book)
- <a href="{{ baseUrl('/books') }}" class="text-book icon-list-item outline-hover">
+ <a href="{{ url('/books') }}" class="text-book icon-list-item outline-hover">
<span>@icon('books')</span>
<span>{{ trans('entities.books') }}</span>
</a>
{{-- Show top level shelves item --}}
@if (count($crumbs) > 0 && array_first($crumbs) instanceof \BookStack\Entities\Bookshelf)
- <a href="{{ baseUrl('/shelves') }}" class="text-bookshelf icon-list-item outline-hover">
+ <a href="{{ url('/shelves') }}" class="text-bookshelf icon-list-item outline-hover">
<span>@icon('bookshelf')</span>
<span>{{ trans('entities.shelves') }}</span>
</a>
@endif
@if (is_string($crumb))
- <a href="{{ baseUrl($key) }}">
+ <a href="{{ url($key) }}">
{{ $crumb }}
</a>
@elseif (is_array($crumb))
- <a href="{{ baseUrl($key) }}" class="icon-list-item outline-hover">
+ <a href="{{ url($key) }}" class="icon-list-item outline-hover">
<span>@icon($crumb['icon'])</span>
<span>{{ $crumb['text'] }}</span>
</a>
?>
<div class="list-sort-container" list-sort-control>
<div class="list-sort-label">{{ trans('common.sort') }}</div>
- <form action="{{ baseUrl("/settings/users/{$currentUser->id}/change-sort/{$type}") }}" method="post">
+ <form action="{{ url("/settings/users/{$currentUser->id}/change-sort/{$type}") }}" method="post">
{!! csrf_field() !!}
{!! method_field('PATCH') !!}
<div>
- <form action="{{ baseUrl("/settings/users/{$currentUser->id}/switch-${type}-view") }}" method="POST" class="inline">
+ <form action="{{ url("/settings/users/{$currentUser->id}/switch-${type}-view") }}" method="POST" class="inline">
{!! csrf_field() !!}
{!! method_field('PATCH') !!}
<input type="hidden" value="{{ $view === 'list'? 'grid' : 'list' }}" name="view_type">
<div>
<div v-pre class="card content-wrap">
<h1 class="list-heading">{{ trans('entities.search_results') }}</h1>
- <form action="{{ baseUrl('/search') }}" method="GET" class="search-box flexible hide-over-l">
+ <form action="{{ url('/search') }}" method="GET" class="search-box flexible hide-over-l">
<input value="{{$searchTerm}}" type="text" name="term" placeholder="{{ trans('common.search') }}">
<button type="submit">@icon('search')</button>
<button v-if="searching" v-cloak class="search-box-cancel text-neg" v-on:click="clearSearch" type="button">@icon('close')</button>
<div class="card content-wrap auto-height">
<h2 class="list-heading">{{ trans('settings.app_features_security') }}</h2>
- <form action="{{ baseUrl("/settings") }}" method="POST">
+ <form action="{{ url("/settings") }}" method="POST">
{!! csrf_field() !!}
<div class="setting-list">
<p class="small">{!! trans('settings.app_public_access_desc') !!}</p>
@if(userCan('users-manage'))
<p class="small mb-none">
- <a href="{{ baseUrl($guestUser->getEditUrl()) }}">{!! trans('settings.app_public_access_desc_guest') !!}</a>
+ <a href="{{ url($guestUser->getEditUrl()) }}">{!! trans('settings.app_public_access_desc_guest') !!}</a>
</p>
@endif
</div>
<div class="card content-wrap auto-height">
<h2 class="list-heading">{{ trans('settings.app_customization') }}</h2>
- <form action="{{ baseUrl("/settings") }}" method="POST" enctype="multipart/form-data">
+ <form action="{{ url("/settings") }}" method="POST" enctype="multipart/form-data">
{!! csrf_field() !!}
<div class="setting-list">
@include('components.image-picker', [
'removeName' => 'setting-app-logo',
'removeValue' => 'none',
- 'defaultImage' => baseUrl('/logo.png'),
+ 'defaultImage' => url('/logo.png'),
'currentImage' => setting('app-logo'),
'name' => 'app_logo',
'imageClass' => 'logo-image',
<div class="card content-wrap auto-height">
<h2 class="list-heading">{{ trans('settings.reg_settings') }}</h2>
- <form action="{{ baseUrl("/settings") }}" method="POST">
+ <form action="{{ url("/settings") }}" method="POST">
{!! csrf_field() !!}
<div class="setting-list">
<p class="small text-muted">{{ trans('settings.maint_image_cleanup_desc') }}</p>
</div>
<div>
- <form method="POST" action="{{ baseUrl('/settings/maintenance/cleanup-images') }}">
+ <form method="POST" action="{{ url('/settings/maintenance/cleanup-images') }}">
{!! csrf_field() !!}
<input type="hidden" name="_method" value="DELETE">
<div>
<div class="active-link-list">
@if($currentUser->can('settings-manage'))
- <a href="{{ baseUrl('/settings') }}" @if($selected == 'settings') class="active" @endif>@icon('settings'){{ trans('settings.settings') }}</a>
- <a href="{{ baseUrl('/settings/maintenance') }}" @if($selected == 'maintenance') class="active" @endif>@icon('spanner'){{ trans('settings.maint') }}</a>
+ <a href="{{ url('/settings') }}" @if($selected == 'settings') class="active" @endif>@icon('settings'){{ trans('settings.settings') }}</a>
+ <a href="{{ url('/settings/maintenance') }}" @if($selected == 'maintenance') class="active" @endif>@icon('spanner'){{ trans('settings.maint') }}</a>
@endif
@if($currentUser->can('users-manage'))
- <a href="{{ baseUrl('/settings/users') }}" @if($selected == 'users') class="active" @endif>@icon('users'){{ trans('settings.users') }}</a>
+ <a href="{{ url('/settings/users') }}" @if($selected == 'users') class="active" @endif>@icon('users'){{ trans('settings.users') }}</a>
@endif
@if($currentUser->can('user-roles-manage'))
- <a href="{{ baseUrl('/settings/roles') }}" @if($selected == 'roles') class="active" @endif>@icon('lock-open'){{ trans('settings.roles') }}</a>
+ <a href="{{ url('/settings/roles') }}" @if($selected == 'roles') class="active" @endif>@icon('lock-open'){{ trans('settings.roles') }}</a>
@endif
</div>
\ No newline at end of file
@include('settings.navbar', ['selected' => 'roles'])
</div>
- <form action="{{ baseUrl("/settings/roles/new") }}" method="POST">
+ <form action="{{ url("/settings/roles/new") }}" method="POST">
@include('settings.roles.form', ['title' => trans('settings.role_create')])
</form>
</div>
<p>{{ trans('settings.role_delete_confirm', ['roleName' => $role->display_name]) }}</p>
- <form action="{{ baseUrl("/settings/roles/delete/{$role->id}") }}" method="POST">
+ <form action="{{ url("/settings/roles/delete/{$role->id}") }}" method="POST">
{!! csrf_field() !!}
<input type="hidden" name="_method" value="DELETE">
</div>
<div>
<div class="form-group text-right">
- <a href="{{ baseUrl("/settings/roles/{$role->id}") }}" class="button outline">{{ trans('common.cancel') }}</a>
+ <a href="{{ url("/settings/roles/{$role->id}") }}" class="button outline">{{ trans('common.cancel') }}</a>
<button type="submit" class="button primary">{{ trans('common.confirm') }}</button>
</div>
</div>
@include('settings.navbar', ['selected' => 'roles'])
</div>
- <form action="{{ baseUrl("/settings/roles/{$role->id}") }}" method="POST">
+ <form action="{{ url("/settings/roles/{$role->id}") }}" method="POST">
<input type="hidden" name="_method" value="PUT">
@include('settings.roles.form', ['model' => $role, 'title' => trans('settings.role_edit'), 'icon' => 'edit'])
</form>
</div>
<div class="form-group text-right">
- <a href="{{ baseUrl("/settings/roles") }}" class="button outline">{{ trans('common.cancel') }}</a>
+ <a href="{{ url("/settings/roles") }}" class="button outline">{{ trans('common.cancel') }}</a>
@if (isset($role) && $role->id)
- <a href="{{ baseUrl("/settings/roles/delete/{$role->id}") }}" class="button outline">{{ trans('settings.role_delete') }}</a>
+ <a href="{{ url("/settings/roles/delete/{$role->id}") }}" class="button outline">{{ trans('settings.role_delete') }}</a>
@endif
<button type="submit" class="button primary">{{ trans('settings.role_save') }}</button>
</div>
</div>
<div>
@if(userCan('users-manage') || $currentUser->id == $user->id)
- <a href="{{ baseUrl("/settings/users/{$user->id}") }}">
+ <a href="{{ url("/settings/users/{$user->id}") }}">
@endif
{{ $user->name }}
@if(userCan('users-manage') || $currentUser->id == $user->id)
<h1 class="list-heading">{{ trans('settings.role_user_roles') }}</h1>
<div class="text-right">
- <a href="{{ baseUrl("/settings/roles/new") }}" class="button outline">{{ trans('settings.role_create') }}</a>
+ <a href="{{ url("/settings/roles/new") }}" class="button outline">{{ trans('settings.role_create') }}</a>
</div>
</div>
</tr>
@foreach($roles as $role)
<tr>
- <td><a href="{{ baseUrl("/settings/roles/{$role->id}") }}">{{ $role->display_name }}</a></td>
+ <td><a href="{{ url("/settings/roles/{$role->id}") }}">{{ $role->display_name }}</a></td>
<td>{{ $role->description }}</td>
<td class="text-center">{{ $role->users->count() }}</td>
</tr>
<div class="card content-wrap">
<h1 class="list-heading">{{ trans('entities.shelves_create') }}</h1>
- <form action="{{ baseUrl("/shelves") }}" method="POST" enctype="multipart/form-data">
+ <form action="{{ url("/shelves") }}" method="POST" enctype="multipart/form-data">
@include('shelves.form', ['shelf' => null, 'books' => $books])
</form>
</div>
<p class="small">{{ trans('common.cover_image_description') }}</p>
@include('components.image-picker', [
- 'defaultImage' => baseUrl('/book_default_cover.png'),
- 'currentImage' => (isset($shelf) && $shelf->cover) ? $shelf->getBookCover() : baseUrl('/book_default_cover.png') ,
+ 'defaultImage' => url('/book_default_cover.png'),
+ 'currentImage' => (isset($shelf) && $shelf->cover) ? $shelf->getBookCover() : url('/book_default_cover.png') ,
'name' => 'image',
'imageClass' => 'cover'
])
</div>
<div class="form-group text-right">
- <a href="{{ isset($shelf) ? $shelf->getUrl() : baseUrl('/shelves') }}" class="button outline">{{ trans('common.cancel') }}</a>
+ <a href="{{ isset($shelf) ? $shelf->getUrl() : url('/shelves') }}" class="button outline">{{ trans('common.cancel') }}</a>
<button type="submit" class="button primary">{{ trans('entities.shelves_save') }}</button>
</div>
\ No newline at end of file
<h5>{{ trans('common.actions') }}</h5>
<div class="icon-list text-primary">
@if($currentUser->can('bookshelf-create-all'))
- <a href="{{ baseUrl("/create-shelf") }}" class="icon-list-item">
+ <a href="{{ url("/create-shelf") }}" class="icon-list-item">
<span>@icon('add')</span>
<span>{{ trans('entities.shelves_new_action') }}</span>
</a>
@else
<p class="text-muted">{{ trans('entities.shelves_empty') }}</p>
@if(userCan('bookshelf-create-all'))
- <a href="{{ baseUrl("/create-shelf") }}" class="button outline">@icon('edit'){{ trans('entities.create_now') }}</a>
+ <a href="{{ url("/create-shelf") }}" class="button outline">@icon('edit'){{ trans('entities.create_now') }}</a>
@endif
@endif
<div class="card content-wrap">
<h1 class="list-heading">{{ trans('settings.users_add_new') }}</h1>
- <form action="{{ baseUrl("/settings/users/create") }}" method="post">
+ <form action="{{ url("/settings/users/create") }}" method="post">
{!! csrf_field() !!}
<div class="setting-list">
</div>
<div class="form-group text-right">
- <a href="{{ baseUrl($currentUser->can('users-manage') ? "/settings/users" : "/") }}" class="button outline">{{ trans('common.cancel') }}</a>
+ <a href="{{ url($currentUser->can('users-manage') ? "/settings/users" : "/") }}" class="button outline">{{ trans('common.cancel') }}</a>
<button class="button primary" type="submit">{{ trans('common.save') }}</button>
</div>
<div class="grid half">
<p class="text-neg"><strong>{{ trans('settings.users_delete_confirm') }}</strong></p>
<div>
- <form action="{{ baseUrl("/settings/users/{$user->id}") }}" method="POST" class="text-right">
+ <form action="{{ url("/settings/users/{$user->id}") }}" method="POST" class="text-right">
{!! csrf_field() !!}
<input type="hidden" name="_method" value="DELETE">
- <a href="{{ baseUrl("/settings/users/{$user->id}") }}" class="button outline">{{ trans('common.cancel') }}</a>
+ <a href="{{ url("/settings/users/{$user->id}") }}" class="button outline">{{ trans('common.cancel') }}</a>
<button type="submit" class="button primary">{{ trans('common.confirm') }}</button>
</form>
</div>
<div class="card content-wrap">
<h1 class="list-heading">{{ $user->id === $currentUser->id ? trans('settings.users_edit_profile') : trans('settings.users_edit') }}</h1>
- <form action="{{ baseUrl("/settings/users/{$user->id}") }}" method="post" enctype="multipart/form-data">
+ <form action="{{ url("/settings/users/{$user->id}") }}" method="post" enctype="multipart/form-data">
{!! csrf_field() !!}
<input type="hidden" name="_method" value="PUT">
'resizeHeight' => '512',
'resizeWidth' => '512',
'showRemove' => false,
- 'defaultImage' => baseUrl('/user_avatar.png'),
+ 'defaultImage' => url('/user_avatar.png'),
'currentImage' => $user->getAvatar(80),
'currentId' => $user->image_id,
'name' => 'profile_image',
</div>
<div class="text-right">
- <a href="{{ baseUrl($currentUser->can('users-manage') ? "/settings/users" : "/") }}" class="button outline">{{ trans('common.cancel') }}</a>
+ <a href="{{ url($currentUser->can('users-manage') ? "/settings/users" : "/") }}" class="button outline">{{ trans('common.cancel') }}</a>
@if($authMethod !== 'system')
- <a href="{{ baseUrl("/settings/users/{$user->id}/delete") }}" class="button outline">{{ trans('settings.users_delete') }}</a>
+ <a href="{{ url("/settings/users/{$user->id}/delete") }}" class="button outline">{{ trans('settings.users_delete') }}</a>
@endif
<button class="button primary" type="submit">{{ trans('common.save') }}</button>
</div>
<div>@icon('auth/'. $driver, ['style' => 'width: 56px;height: 56px;'])</div>
<div>
@if($user->hasSocialAccount($driver))
- <a href="{{ baseUrl("/login/service/{$driver}/detach") }}" class="button small outline">{{ trans('settings.users_social_disconnect') }}</a>
+ <a href="{{ url("/login/service/{$driver}/detach") }}" class="button small outline">{{ trans('settings.users_social_disconnect') }}</a>
@else
- <a href="{{ baseUrl("/login/service/{$driver}") }}" class="button small outline">{{ trans('settings.users_social_connect') }}</a>
+ <a href="{{ url("/login/service/{$driver}") }}" class="button small outline">{{ trans('settings.users_social_connect') }}</a>
@endif
</div>
</div>
<div class="text-right">
<div class="block inline mr-s">
- <form method="get" action="{{ baseUrl("/settings/users") }}">
+ <form method="get" action="{{ url("/settings/users") }}">
@foreach(collect($listDetails)->except('search') as $name => $val)
<input type="hidden" name="{{ $name }}" value="{{ $val }}">
@endforeach
</form>
</div>
@if(userCan('users-manage'))
- <a href="{{ baseUrl("/settings/users/create") }}" style="margin-top: 0;" class="outline button">{{ trans('settings.users_add_new') }}</a>
+ <a href="{{ url("/settings/users/create") }}" style="margin-top: 0;" class="outline button">{{ trans('settings.users_add_new') }}</a>
@endif
</div>
</div>
<td class="text-center" style="line-height: 0;"><img class="avatar med" src="{{ $user->getAvatar(40)}}" alt="{{ $user->name }}"></td>
<td>
@if(userCan('users-manage') || $currentUser->id == $user->id)
- <a href="{{ baseUrl("/settings/users/{$user->id}") }}">
+ <a href="{{ url("/settings/users/{$user->id}") }}">
@endif
{{ $user->name }} <br> <span class="text-muted">{{ $user->email }}</span>
@if(userCan('users-manage') || $currentUser->id == $user->id)
</td>
<td>
@foreach($user->roles as $index => $role)
- <small><a href="{{ baseUrl("/settings/roles/{$role->id}") }}">{{$role->display_name}}</a>@if($index !== count($user->roles) -1),@endif</small>
+ <small><a href="{{ url("/settings/roles/{$role->id}") }}">{{$role->display_name}}</a>@if($index !== count($user->roles) -1),@endif</small>
@endforeach
</td>
</tr>
<h2 id="recent-pages" class="list-heading">
{{ trans('entities.recently_created_pages') }}
@if (count($recentlyCreated['pages']) > 0)
- <a href="{{ baseUrl('/search?term=' . urlencode('{created_by:'.$user->id.'} {type:page}') ) }}" class="text-small ml-s">{{ trans('common.view_all') }}</a>
+ <a href="{{ url('/search?term=' . urlencode('{created_by:'.$user->id.'} {type:page}') ) }}" class="text-small ml-s">{{ trans('common.view_all') }}</a>
@endif
</h2>
@if (count($recentlyCreated['pages']) > 0)
<h2 id="recent-chapters" class="list-heading">
{{ trans('entities.recently_created_chapters') }}
@if (count($recentlyCreated['chapters']) > 0)
- <a href="{{ baseUrl('/search?term=' . urlencode('{created_by:'.$user->id.'} {type:chapter}') ) }}" class="text-small ml-s">{{ trans('common.view_all') }}</a>
+ <a href="{{ url('/search?term=' . urlencode('{created_by:'.$user->id.'} {type:chapter}') ) }}" class="text-small ml-s">{{ trans('common.view_all') }}</a>
@endif
</h2>
@if (count($recentlyCreated['chapters']) > 0)
<h2 id="recent-books" class="list-heading">
{{ trans('entities.recently_created_books') }}
@if (count($recentlyCreated['books']) > 0)
- <a href="{{ baseUrl('/search?term=' . urlencode('{created_by:'.$user->id.'} {type:book}') ) }}" class="text-small ml-s">{{ trans('common.view_all') }}</a>
+ <a href="{{ url('/search?term=' . urlencode('{created_by:'.$user->id.'} {type:book}') ) }}" class="text-small ml-s">{{ trans('common.view_all') }}</a>
@endif
</h2>
@if (count($recentlyCreated['books']) > 0)
<h2 id="recent-shelves" class="list-heading">
{{ trans('entities.recently_created_shelves') }}
@if (count($recentlyCreated['shelves']) > 0)
- <a href="{{ baseUrl('/search?term=' . urlencode('{created_by:'.$user->id.'} {type:bookshelf}') ) }}" class="text-small ml-s">{{ trans('common.view_all') }}</a>
+ <a href="{{ url('/search?term=' . urlencode('{created_by:'.$user->id.'} {type:bookshelf}') ) }}" class="text-small ml-s">{{ trans('common.view_all') }}</a>
@endif
</h2>
@if (count($recentlyCreated['shelves']) > 0)
<!-- Logo -->
<tr>
<td style="{{ $style['email-masthead'] }}">
- <a style="{{ $fontFamily }} {{ $style['email-masthead_name'] }}" href="{{ baseUrl('/') }}" target="_blank">
+ <a style="{{ $fontFamily }} {{ $style['email-masthead_name'] }}" href="{{ url('/') }}" target="_blank">
{{ setting('app-name') }}
</a>
</td>
<td style="{{ $fontFamily }} {{ $style['email-footer_cell'] }}">
<p style="{{ $style['paragraph-sub'] }}">
© {{ date('Y') }}
- <a style="{{ $style['anchor'] }}" href="{{ baseUrl('/') }}" target="_blank">{{ setting('app-name') }}</a>.
+ <a style="{{ $style['anchor'] }}" href="{{ url('/') }}" target="_blank">{{ setting('app-name') }}</a>.
{{ trans('common.email_rights') }}
</p>
</td>
$page = Page::query()->first();
$this->visit($page->getUrl())
- ->seePageUrlIs(baseUrl('/login'));
+ ->seePageUrlIs(url('/login'));
->seePageUrlIs($page->getUrl());
}
+++ /dev/null
-<?php namespace Tests;
-
-class HelpersTest extends TestCase
-{
-
- public function test_base_url_takes_config_into_account()
- {
- config()->set('app.url', 'http://example.com/bookstack');
- $result = baseUrl('/');
- $this->assertEquals('http://example.com/bookstack/', $result);
- }
-
- public function test_base_url_takes_extra_path_into_account_on_forced_domain()
- {
- config()->set('app.url', 'http://example.com/bookstack');
- $result = baseUrl('http://example.com/bookstack/', true);
- $this->assertEquals('http://example.com/bookstack/', $result);
- }
-
- public function test_base_url_force_domain_works_as_expected_with_full_url_given()
- {
- config()->set('app.url', 'http://example.com');
- $result = baseUrl('http://examps.com/books/test/page/cat', true);
- $this->assertEquals('http://example.com/books/test/page/cat', $result);
- }
-
- public function test_base_url_force_domain_works_when_app_domain_is_same_as_given_url()
- {
- config()->set('app.url', 'http://example.com');
- $result = baseUrl('http://example.com/books/test/page/cat', true);
- $this->assertEquals('http://example.com/books/test/page/cat', $result);
- }
-}
\ No newline at end of file
--- /dev/null
+<?php namespace Tests;
+
+class UrlTest extends TestCase
+{
+
+ public function test_request_url_takes_custom_url_into_account()
+ {
+ config()->set('app.url', 'http://example.com/bookstack');
+ $this->get('/');
+ $this->assertEquals('http://example.com/bookstack', request()->getUri());
+
+ config()->set('app.url', 'http://example.com/docs/content');
+ $this->get('/');
+ $this->assertEquals('http://example.com/docs/content', request()->getUri());
+ }
+
+ public function test_url_helper_takes_custom_url_into_account()
+ {
+ putenv('APP_URL=http://example.com/bookstack');
+ $this->refreshApplication();
+ $this->assertEquals('http://example.com/bookstack/books', url('/books'));
+ putenv('APP_URL=');
+ }
+
+}
\ No newline at end of file