Moved from Tailwind to Boostrap
This commit is contained in:
@@ -1,47 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Controllers\Auth;
|
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use App\Http\Requests\Auth\LoginRequest;
|
|
||||||
use Illuminate\Http\RedirectResponse;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\Support\Facades\Auth;
|
|
||||||
use Illuminate\View\View;
|
|
||||||
|
|
||||||
class AuthenticatedSessionController extends Controller
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Display the login view.
|
|
||||||
*/
|
|
||||||
public function create(): View
|
|
||||||
{
|
|
||||||
return view('auth.login');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle an incoming authentication request.
|
|
||||||
*/
|
|
||||||
public function store(LoginRequest $request): RedirectResponse
|
|
||||||
{
|
|
||||||
$request->authenticate();
|
|
||||||
|
|
||||||
$request->session()->regenerate();
|
|
||||||
|
|
||||||
return redirect()->intended(route('dashboard', absolute: false));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroy an authenticated session.
|
|
||||||
*/
|
|
||||||
public function destroy(Request $request): RedirectResponse
|
|
||||||
{
|
|
||||||
Auth::guard('web')->logout();
|
|
||||||
|
|
||||||
$request->session()->invalidate();
|
|
||||||
|
|
||||||
$request->session()->regenerateToken();
|
|
||||||
|
|
||||||
return redirect('/');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Controllers\Auth;
|
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use Illuminate\Http\RedirectResponse;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\Support\Facades\Auth;
|
|
||||||
use Illuminate\Validation\ValidationException;
|
|
||||||
use Illuminate\View\View;
|
|
||||||
|
|
||||||
class ConfirmablePasswordController extends Controller
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Show the confirm password view.
|
|
||||||
*/
|
|
||||||
public function show(): View
|
|
||||||
{
|
|
||||||
return view('auth.confirm-password');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Confirm the user's password.
|
|
||||||
*/
|
|
||||||
public function store(Request $request): RedirectResponse
|
|
||||||
{
|
|
||||||
if (! Auth::guard('web')->validate([
|
|
||||||
'email' => $request->user()->email,
|
|
||||||
'password' => $request->password,
|
|
||||||
])) {
|
|
||||||
throw ValidationException::withMessages([
|
|
||||||
'password' => __('auth.password'),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$request->session()->put('auth.password_confirmed_at', time());
|
|
||||||
|
|
||||||
return redirect()->intended(route('dashboard', absolute: false));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Controllers\Auth;
|
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use Illuminate\Http\RedirectResponse;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
|
|
||||||
class EmailVerificationNotificationController extends Controller
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Send a new email verification notification.
|
|
||||||
*/
|
|
||||||
public function store(Request $request): RedirectResponse
|
|
||||||
{
|
|
||||||
if ($request->user()->hasVerifiedEmail()) {
|
|
||||||
return redirect()->intended(route('dashboard', absolute: false));
|
|
||||||
}
|
|
||||||
|
|
||||||
$request->user()->sendEmailVerificationNotification();
|
|
||||||
|
|
||||||
return back()->with('status', 'verification-link-sent');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Controllers\Auth;
|
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use Illuminate\Http\RedirectResponse;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\View\View;
|
|
||||||
|
|
||||||
class EmailVerificationPromptController extends Controller
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Display the email verification prompt.
|
|
||||||
*/
|
|
||||||
public function __invoke(Request $request): RedirectResponse|View
|
|
||||||
{
|
|
||||||
return $request->user()->hasVerifiedEmail()
|
|
||||||
? redirect()->intended(route('dashboard', absolute: false))
|
|
||||||
: view('auth.verify-email');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Controllers\Auth;
|
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use App\Models\User;
|
|
||||||
use Illuminate\Auth\Events\PasswordReset;
|
|
||||||
use Illuminate\Http\RedirectResponse;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\Support\Facades\Hash;
|
|
||||||
use Illuminate\Support\Facades\Password;
|
|
||||||
use Illuminate\Support\Str;
|
|
||||||
use Illuminate\Validation\Rules;
|
|
||||||
use Illuminate\Validation\ValidationException;
|
|
||||||
use Illuminate\View\View;
|
|
||||||
|
|
||||||
class NewPasswordController extends Controller
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Display the password reset view.
|
|
||||||
*/
|
|
||||||
public function create(Request $request): View
|
|
||||||
{
|
|
||||||
return view('auth.reset-password', ['request' => $request]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle an incoming new password request.
|
|
||||||
*
|
|
||||||
* @throws ValidationException
|
|
||||||
*/
|
|
||||||
public function store(Request $request): RedirectResponse
|
|
||||||
{
|
|
||||||
$request->validate([
|
|
||||||
'token' => ['required'],
|
|
||||||
'email' => ['required', 'email'],
|
|
||||||
'password' => ['required', 'confirmed', Rules\Password::defaults()],
|
|
||||||
]);
|
|
||||||
|
|
||||||
// Here we will attempt to reset the user's password. If it is successful we
|
|
||||||
// will update the password on an actual user model and persist it to the
|
|
||||||
// database. Otherwise we will parse the error and return the response.
|
|
||||||
$status = Password::reset(
|
|
||||||
$request->only('email', 'password', 'password_confirmation', 'token'),
|
|
||||||
function (User $user) use ($request) {
|
|
||||||
$user->forceFill([
|
|
||||||
'password' => Hash::make($request->password),
|
|
||||||
'remember_token' => Str::random(60),
|
|
||||||
])->save();
|
|
||||||
|
|
||||||
event(new PasswordReset($user));
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// If the password was successfully reset, we will redirect the user back to
|
|
||||||
// the application's home authenticated view. If there is an error we can
|
|
||||||
// redirect them back to where they came from with their error message.
|
|
||||||
return $status == Password::PASSWORD_RESET
|
|
||||||
? redirect()->route('login')->with('status', __($status))
|
|
||||||
: back()->withInput($request->only('email'))
|
|
||||||
->withErrors(['email' => __($status)]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Controllers\Auth;
|
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use Illuminate\Http\RedirectResponse;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\Support\Facades\Hash;
|
|
||||||
use Illuminate\Validation\Rules\Password;
|
|
||||||
|
|
||||||
class PasswordController extends Controller
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Update the user's password.
|
|
||||||
*/
|
|
||||||
public function update(Request $request): RedirectResponse
|
|
||||||
{
|
|
||||||
$validated = $request->validateWithBag('updatePassword', [
|
|
||||||
'current_password' => ['required', 'current_password'],
|
|
||||||
'password' => ['required', Password::defaults(), 'confirmed'],
|
|
||||||
]);
|
|
||||||
|
|
||||||
$request->user()->update([
|
|
||||||
'password' => Hash::make($validated['password']),
|
|
||||||
]);
|
|
||||||
|
|
||||||
return back()->with('status', 'password-updated');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Controllers\Auth;
|
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use Illuminate\Http\RedirectResponse;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\Support\Facades\Password;
|
|
||||||
use Illuminate\Validation\ValidationException;
|
|
||||||
use Illuminate\View\View;
|
|
||||||
|
|
||||||
class PasswordResetLinkController extends Controller
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Display the password reset link request view.
|
|
||||||
*/
|
|
||||||
public function create(): View
|
|
||||||
{
|
|
||||||
return view('auth.forgot-password');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle an incoming password reset link request.
|
|
||||||
*
|
|
||||||
* @throws ValidationException
|
|
||||||
*/
|
|
||||||
public function store(Request $request): RedirectResponse
|
|
||||||
{
|
|
||||||
$request->validate([
|
|
||||||
'email' => ['required', 'email'],
|
|
||||||
]);
|
|
||||||
|
|
||||||
// We will send the password reset link to this user. Once we have attempted
|
|
||||||
// to send the link, we will examine the response then see the message we
|
|
||||||
// need to show to the user. Finally, we'll send out a proper response.
|
|
||||||
$status = Password::sendResetLink(
|
|
||||||
$request->only('email')
|
|
||||||
);
|
|
||||||
|
|
||||||
return $status == Password::RESET_LINK_SENT
|
|
||||||
? back()->with('status', __($status))
|
|
||||||
: back()->withInput($request->only('email'))
|
|
||||||
->withErrors(['email' => __($status)]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Controllers\Auth;
|
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use App\Models\User;
|
|
||||||
use Illuminate\Auth\Events\Registered;
|
|
||||||
use Illuminate\Http\RedirectResponse;
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\Support\Facades\Auth;
|
|
||||||
use Illuminate\Support\Facades\Hash;
|
|
||||||
use Illuminate\Validation\Rules;
|
|
||||||
use Illuminate\Validation\ValidationException;
|
|
||||||
use Illuminate\View\View;
|
|
||||||
|
|
||||||
class RegisteredUserController extends Controller
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Display the registration view.
|
|
||||||
*/
|
|
||||||
public function create(): View
|
|
||||||
{
|
|
||||||
return view('auth.register');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle an incoming registration request.
|
|
||||||
*
|
|
||||||
* @throws ValidationException
|
|
||||||
*/
|
|
||||||
public function store(Request $request): RedirectResponse
|
|
||||||
{
|
|
||||||
$request->validate([
|
|
||||||
'name' => ['required', 'string', 'max:255'],
|
|
||||||
'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class],
|
|
||||||
'password' => ['required', 'confirmed', Rules\Password::defaults()],
|
|
||||||
]);
|
|
||||||
|
|
||||||
$user = User::create([
|
|
||||||
'name' => $request->name,
|
|
||||||
'email' => $request->email,
|
|
||||||
'password' => Hash::make($request->password),
|
|
||||||
]);
|
|
||||||
|
|
||||||
event(new Registered($user));
|
|
||||||
|
|
||||||
Auth::login($user);
|
|
||||||
|
|
||||||
return redirect(route('dashboard', absolute: false));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Controllers\Auth;
|
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
|
||||||
use Illuminate\Auth\Events\Verified;
|
|
||||||
use Illuminate\Foundation\Auth\EmailVerificationRequest;
|
|
||||||
use Illuminate\Http\RedirectResponse;
|
|
||||||
|
|
||||||
class VerifyEmailController extends Controller
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Mark the authenticated user's email address as verified.
|
|
||||||
*/
|
|
||||||
public function __invoke(EmailVerificationRequest $request): RedirectResponse
|
|
||||||
{
|
|
||||||
if ($request->user()->hasVerifiedEmail()) {
|
|
||||||
return redirect()->intended(route('dashboard', absolute: false).'?verified=1');
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($request->user()->markEmailAsVerified()) {
|
|
||||||
event(new Verified($request->user()));
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->intended(route('dashboard', absolute: false).'?verified=1');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,10 +2,16 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers;
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
abstract class Controller
|
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||||
|
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||||
|
use Illuminate\Routing\Controller as BaseController;
|
||||||
|
|
||||||
|
class Controller extends BaseController
|
||||||
{
|
{
|
||||||
|
use AuthorizesRequests, ValidatesRequests;
|
||||||
|
|
||||||
protected array $css = [
|
protected array $css = [
|
||||||
"bootstrap.min.css",
|
"bootstrap_old.min.css",
|
||||||
"bootstrap-theme.min.css",
|
"bootstrap-theme.min.css",
|
||||||
"common.css",
|
"common.css",
|
||||||
"main.css"
|
"main.css"
|
||||||
@@ -14,7 +20,7 @@ abstract class Controller
|
|||||||
protected array $js = [
|
protected array $js = [
|
||||||
"functions.js",
|
"functions.js",
|
||||||
"jquery-1.11.3.min.js",
|
"jquery-1.11.3.min.js",
|
||||||
"bootstrap.min.js"
|
"bootstrap_old.min.js"
|
||||||
];
|
];
|
||||||
|
|
||||||
protected function addJsFile(string $js): void
|
protected function addJsFile(string $js): void
|
||||||
|
|||||||
@@ -16,13 +16,38 @@ class PlacesController extends Controller
|
|||||||
return view('places.index', compact('places'));
|
return view('places.index', compact('places'));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function store(Request $request): Redirector|RedirectResponse {
|
public function create()
|
||||||
|
{
|
||||||
|
return view('places.create');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function store(Request $request): Redirector|RedirectResponse
|
||||||
|
{
|
||||||
|
// Очистка телефона (только цифры)
|
||||||
|
if ($request->has('phone')) {
|
||||||
|
$cleanPhone = preg_replace('/\D/', '', $request->phone);
|
||||||
|
$request->merge(['phone' => $cleanPhone]);
|
||||||
|
}
|
||||||
|
|
||||||
$data = $request->validate([
|
$data = $request->validate([
|
||||||
'name' => 'required|string|max:255',
|
'name' => 'required|string|max:255',
|
||||||
'lat' => 'required|numeric',
|
'phone' => 'nullable|digits:11',
|
||||||
'lng' => 'required|numeric',
|
'address' => 'required|string|max:255',
|
||||||
|
'url' => 'required|string|max:255',
|
||||||
|
'gps' => [
|
||||||
|
'nullable',
|
||||||
|
'regex:/^[-+]?([1-8]?\d(\.\d+)?|90(\.0+)?),\s*[-+]?(180(\.0+)?|((1[0-7]\d)|([1-9]?\d))(\.\d+)?)$/'
|
||||||
|
],
|
||||||
|
'description' => 'nullable',
|
||||||
|
],[
|
||||||
|
'phone.digits' => 'Номер телефона должен содержать 11 цифр.',
|
||||||
|
'gps.regex' => "Неверный формат GPS координат"
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
if ($request->has('gps')) {
|
||||||
|
$data['gps'] = $this->convertGPS($request->gps);
|
||||||
|
}
|
||||||
|
|
||||||
Place::create($data);
|
Place::create($data);
|
||||||
|
|
||||||
return redirect()
|
return redirect()
|
||||||
@@ -30,6 +55,11 @@ class PlacesController extends Controller
|
|||||||
->with('status', 'Локация создана!');
|
->with('status', 'Локация создана!');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function convertGPS(string $gps): string
|
||||||
|
{
|
||||||
|
return str_replace([',',' '], ['|',''], $gps);
|
||||||
|
}
|
||||||
|
|
||||||
public function edit(Place $place): VIEW
|
public function edit(Place $place): VIEW
|
||||||
{
|
{
|
||||||
return view('places.edit', compact('place'));
|
return view('places.edit', compact('place'));
|
||||||
@@ -48,8 +78,11 @@ class PlacesController extends Controller
|
|||||||
->with('status', 'Обновлено!');
|
->with('status', 'Обновлено!');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function destroy(Place $place): Redirector|RedirectResponse {
|
public function delete(int $id): Redirector|RedirectResponse
|
||||||
|
{
|
||||||
|
$place = Place::findOrFail($id);
|
||||||
$place->delete();
|
$place->delete();
|
||||||
|
|
||||||
return redirect()
|
return redirect()
|
||||||
->route('places.index')
|
->route('places.index')
|
||||||
->with('status', 'Удалено!');
|
->with('status', 'Удалено!');
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers;
|
||||||
|
|
||||||
|
class StartController extends Controller
|
||||||
|
{
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
return $this->render('start');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,86 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Requests\Auth;
|
|
||||||
|
|
||||||
use Illuminate\Auth\Events\Lockout;
|
|
||||||
use Illuminate\Contracts\Validation\ValidationRule;
|
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
|
||||||
use Illuminate\Support\Facades\Auth;
|
|
||||||
use Illuminate\Support\Facades\RateLimiter;
|
|
||||||
use Illuminate\Support\Str;
|
|
||||||
use Illuminate\Validation\ValidationException;
|
|
||||||
|
|
||||||
class LoginRequest extends FormRequest
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Determine if the user is authorized to make this request.
|
|
||||||
*/
|
|
||||||
public function authorize(): bool
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the validation rules that apply to the request.
|
|
||||||
*
|
|
||||||
* @return array<string, ValidationRule|array<mixed>|string>
|
|
||||||
*/
|
|
||||||
public function rules(): array
|
|
||||||
{
|
|
||||||
return [
|
|
||||||
'email' => ['required', 'string', 'email'],
|
|
||||||
'password' => ['required', 'string'],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Attempt to authenticate the request's credentials.
|
|
||||||
*
|
|
||||||
* @throws ValidationException
|
|
||||||
*/
|
|
||||||
public function authenticate(): void
|
|
||||||
{
|
|
||||||
$this->ensureIsNotRateLimited();
|
|
||||||
|
|
||||||
if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
|
|
||||||
RateLimiter::hit($this->throttleKey());
|
|
||||||
|
|
||||||
throw ValidationException::withMessages([
|
|
||||||
'email' => trans('auth.failed'),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
RateLimiter::clear($this->throttleKey());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ensure the login request is not rate limited.
|
|
||||||
*
|
|
||||||
* @throws ValidationException
|
|
||||||
*/
|
|
||||||
public function ensureIsNotRateLimited(): void
|
|
||||||
{
|
|
||||||
if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
event(new Lockout($this));
|
|
||||||
|
|
||||||
$seconds = RateLimiter::availableIn($this->throttleKey());
|
|
||||||
|
|
||||||
throw ValidationException::withMessages([
|
|
||||||
'email' => trans('auth.throttle', [
|
|
||||||
'seconds' => $seconds,
|
|
||||||
'minutes' => ceil($seconds / 60),
|
|
||||||
]),
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the rate limiting throttle key for the request.
|
|
||||||
*/
|
|
||||||
public function throttleKey(): string
|
|
||||||
{
|
|
||||||
return Str::transliterate(Str::lower($this->string('email')).'|'.$this->ip());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -15,4 +15,8 @@ class Place extends Model
|
|||||||
|
|
||||||
protected $primaryKey = 'id';
|
protected $primaryKey = 'id';
|
||||||
protected $table = 'places';
|
protected $table = 'places';
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'name','gps', 'phone', 'description', 'url', 'address'
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
namespace App\Providers;
|
namespace App\Providers;
|
||||||
|
|
||||||
use Illuminate\Pagination\Paginator;
|
|
||||||
use Illuminate\Support\ServiceProvider;
|
use Illuminate\Support\ServiceProvider;
|
||||||
|
use Illuminate\Pagination\Paginator;
|
||||||
|
|
||||||
class AppServiceProvider extends ServiceProvider
|
class AppServiceProvider extends ServiceProvider
|
||||||
{
|
{
|
||||||
@@ -20,6 +20,6 @@ class AppServiceProvider extends ServiceProvider
|
|||||||
*/
|
*/
|
||||||
public function boot(): void
|
public function boot(): void
|
||||||
{
|
{
|
||||||
Paginator::useTailwind();
|
Paginator::useBootstrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -11,11 +11,11 @@
|
|||||||
"require": {
|
"require": {
|
||||||
"php": "^8.2",
|
"php": "^8.2",
|
||||||
"laravel/framework": "^12.0",
|
"laravel/framework": "^12.0",
|
||||||
"laravel/tinker": "^2.10.1"
|
"laravel/tinker": "^2.10.1",
|
||||||
|
"laravel/ui": "^4.6"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"fakerphp/faker": "^1.23",
|
"fakerphp/faker": "^1.23",
|
||||||
"laravel/breeze": "^2.4",
|
|
||||||
"laravel/pail": "^1.2.2",
|
"laravel/pail": "^1.2.2",
|
||||||
"laravel/pint": "^1.24",
|
"laravel/pint": "^1.24",
|
||||||
"laravel/sail": "^1.41",
|
"laravel/sail": "^1.41",
|
||||||
|
|||||||
Generated
-3302
File diff suppressed because it is too large
Load Diff
+11
-13
@@ -1,21 +1,19 @@
|
|||||||
{
|
{
|
||||||
"$schema": "https://www.schemastore.org/package.json",
|
|
||||||
"private": true,
|
"private": true,
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "vite build",
|
"dev": "vite",
|
||||||
"dev": "vite"
|
"build": "vite build"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@tailwindcss/forms": "^0.5.2",
|
"@popperjs/core": "^2.11.8",
|
||||||
"@tailwindcss/vite": "^4.0.0",
|
"axios": "^1.1.0",
|
||||||
"alpinejs": "^3.4.2",
|
"bootstrap": "^5.3.8",
|
||||||
"autoprefixer": "^10.4.2",
|
"laravel-vite-plugin": "^1.3.0",
|
||||||
"axios": "^1.11.0",
|
"sass": "^1.99.0",
|
||||||
"concurrently": "^9.0.1",
|
"vite": "^5.4.21"
|
||||||
"laravel-vite-plugin": "^2.0.0",
|
},
|
||||||
"postcss": "^8.4.31",
|
"dependencies": {
|
||||||
"tailwindcss": "^3.1.0",
|
"sass-loader": "^16.0.8"
|
||||||
"vite": "^7.0.7"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +0,0 @@
|
|||||||
export default {
|
|
||||||
plugins: {
|
|
||||||
tailwindcss: {},
|
|
||||||
autoprefixer: {},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"resources/css/app.css": {
|
|
||||||
"file": "assets/app-BURll_0Q.css",
|
|
||||||
"src": "resources/css/app.css",
|
|
||||||
"isEntry": true,
|
|
||||||
"name": "app",
|
|
||||||
"names": [
|
|
||||||
"app.css"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"resources/js/app.js": {
|
|
||||||
"file": "assets/app-BjMeHjpC.js",
|
|
||||||
"name": "app",
|
|
||||||
"src": "resources/js/app.js",
|
|
||||||
"isEntry": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+6
-14
File diff suppressed because one or more lines are too long
Vendored
-12
File diff suppressed because one or more lines are too long
@@ -1,3 +1,3 @@
|
|||||||
@tailwind base;
|
//@tailwind base;
|
||||||
@tailwind components;
|
//@tailwind components;
|
||||||
@tailwind utilities;
|
//@tailwind utilities;
|
||||||
|
|||||||
+5
-3
@@ -1,7 +1,9 @@
|
|||||||
import './bootstrap';
|
import './bootstrap';
|
||||||
|
|
||||||
import Alpine from 'alpinejs';
|
import 'bootstrap'; // Это сам JS Bootstrap (для выпадающих списков и т.д
|
||||||
|
|
||||||
window.Alpine = Alpine;
|
//import Alpine from 'alpinejs';
|
||||||
|
|
||||||
Alpine.start();
|
// window.Alpine = Alpine;
|
||||||
|
//
|
||||||
|
// Alpine.start();
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
<x-guest-layout>
|
|
||||||
<div class="mb-4 text-sm text-gray-600">
|
|
||||||
{{ __('This is a secure area of the application. Please confirm your password before continuing.') }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<form method="POST" action="{{ route('password.confirm') }}">
|
|
||||||
@csrf
|
|
||||||
|
|
||||||
<!-- Password -->
|
|
||||||
<div>
|
|
||||||
<x-input-label for="password" :value="__('Password')" />
|
|
||||||
|
|
||||||
<x-text-input id="password" class="block mt-1 w-full"
|
|
||||||
type="password"
|
|
||||||
name="password"
|
|
||||||
required autocomplete="current-password" />
|
|
||||||
|
|
||||||
<x-input-error :messages="$errors->get('password')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex justify-end mt-4">
|
|
||||||
<x-primary-button>
|
|
||||||
{{ __('Confirm') }}
|
|
||||||
</x-primary-button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</x-guest-layout>
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
<x-guest-layout>
|
|
||||||
<div class="mb-4 text-sm text-gray-600">
|
|
||||||
{{ __('Forgot your password? No problem. Just let us know your email address and we will email you a password reset link that will allow you to choose a new one.') }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Session Status -->
|
|
||||||
<x-auth-session-status class="mb-4" :status="session('status')" />
|
|
||||||
|
|
||||||
<form method="POST" action="{{ route('password.email') }}">
|
|
||||||
@csrf
|
|
||||||
|
|
||||||
<!-- Email Address -->
|
|
||||||
<div>
|
|
||||||
<x-input-label for="email" :value="__('Email')" />
|
|
||||||
<x-text-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autofocus />
|
|
||||||
<x-input-error :messages="$errors->get('email')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex items-center justify-end mt-4">
|
|
||||||
<x-primary-button>
|
|
||||||
{{ __('Email Password Reset Link') }}
|
|
||||||
</x-primary-button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</x-guest-layout>
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
<x-guest-layout>
|
|
||||||
<!-- Session Status -->
|
|
||||||
<x-auth-session-status class="mb-4" :status="session('status')" />
|
|
||||||
|
|
||||||
<form method="POST" action="{{ route('login') }}">
|
|
||||||
@csrf
|
|
||||||
|
|
||||||
<!-- Email Address -->
|
|
||||||
<div>
|
|
||||||
<x-input-label for="email" :value="__('Email')" />
|
|
||||||
<x-text-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autofocus autocomplete="username" />
|
|
||||||
<x-input-error :messages="$errors->get('email')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Password -->
|
|
||||||
<div class="mt-4">
|
|
||||||
<x-input-label for="password" :value="__('Password')" />
|
|
||||||
|
|
||||||
<x-text-input id="password" class="block mt-1 w-full"
|
|
||||||
type="password"
|
|
||||||
name="password"
|
|
||||||
required autocomplete="current-password" />
|
|
||||||
|
|
||||||
<x-input-error :messages="$errors->get('password')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Remember Me -->
|
|
||||||
<div class="block mt-4">
|
|
||||||
<label for="remember_me" class="inline-flex items-center">
|
|
||||||
<input id="remember_me" type="checkbox" class="rounded border-gray-300 text-indigo-600 shadow-sm focus:ring-indigo-500" name="remember">
|
|
||||||
<span class="ms-2 text-sm text-gray-600">{{ __('Remember me') }}</span>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex items-center justify-end mt-4">
|
|
||||||
@if (Route::has('password.request'))
|
|
||||||
<a class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" href="{{ route('password.request') }}">
|
|
||||||
{{ __('Forgot your password?') }}
|
|
||||||
</a>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
<x-primary-button class="ms-3">
|
|
||||||
{{ __('Log in') }}
|
|
||||||
</x-primary-button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</x-guest-layout>
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
<x-guest-layout>
|
|
||||||
<form method="POST" action="{{ route('register') }}">
|
|
||||||
@csrf
|
|
||||||
|
|
||||||
<!-- Name -->
|
|
||||||
<div>
|
|
||||||
<x-input-label for="name" :value="__('Name')" />
|
|
||||||
<x-text-input id="name" class="block mt-1 w-full" type="text" name="name" :value="old('name')" required autofocus autocomplete="name" />
|
|
||||||
<x-input-error :messages="$errors->get('name')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Email Address -->
|
|
||||||
<div class="mt-4">
|
|
||||||
<x-input-label for="email" :value="__('Email')" />
|
|
||||||
<x-text-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email')" required autocomplete="username" />
|
|
||||||
<x-input-error :messages="$errors->get('email')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Password -->
|
|
||||||
<div class="mt-4">
|
|
||||||
<x-input-label for="password" :value="__('Password')" />
|
|
||||||
|
|
||||||
<x-text-input id="password" class="block mt-1 w-full"
|
|
||||||
type="password"
|
|
||||||
name="password"
|
|
||||||
required autocomplete="new-password" />
|
|
||||||
|
|
||||||
<x-input-error :messages="$errors->get('password')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Confirm Password -->
|
|
||||||
<div class="mt-4">
|
|
||||||
<x-input-label for="password_confirmation" :value="__('Confirm Password')" />
|
|
||||||
|
|
||||||
<x-text-input id="password_confirmation" class="block mt-1 w-full"
|
|
||||||
type="password"
|
|
||||||
name="password_confirmation" required autocomplete="new-password" />
|
|
||||||
|
|
||||||
<x-input-error :messages="$errors->get('password_confirmation')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex items-center justify-end mt-4">
|
|
||||||
<a class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500" href="{{ route('login') }}">
|
|
||||||
{{ __('Already registered?') }}
|
|
||||||
</a>
|
|
||||||
|
|
||||||
<x-primary-button class="ms-4">
|
|
||||||
{{ __('Register') }}
|
|
||||||
</x-primary-button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</x-guest-layout>
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
<x-guest-layout>
|
|
||||||
<form method="POST" action="{{ route('password.store') }}">
|
|
||||||
@csrf
|
|
||||||
|
|
||||||
<!-- Password Reset Token -->
|
|
||||||
<input type="hidden" name="token" value="{{ $request->route('token') }}">
|
|
||||||
|
|
||||||
<!-- Email Address -->
|
|
||||||
<div>
|
|
||||||
<x-input-label for="email" :value="__('Email')" />
|
|
||||||
<x-text-input id="email" class="block mt-1 w-full" type="email" name="email" :value="old('email', $request->email)" required autofocus autocomplete="username" />
|
|
||||||
<x-input-error :messages="$errors->get('email')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Password -->
|
|
||||||
<div class="mt-4">
|
|
||||||
<x-input-label for="password" :value="__('Password')" />
|
|
||||||
<x-text-input id="password" class="block mt-1 w-full" type="password" name="password" required autocomplete="new-password" />
|
|
||||||
<x-input-error :messages="$errors->get('password')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Confirm Password -->
|
|
||||||
<div class="mt-4">
|
|
||||||
<x-input-label for="password_confirmation" :value="__('Confirm Password')" />
|
|
||||||
|
|
||||||
<x-text-input id="password_confirmation" class="block mt-1 w-full"
|
|
||||||
type="password"
|
|
||||||
name="password_confirmation" required autocomplete="new-password" />
|
|
||||||
|
|
||||||
<x-input-error :messages="$errors->get('password_confirmation')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex items-center justify-end mt-4">
|
|
||||||
<x-primary-button>
|
|
||||||
{{ __('Reset Password') }}
|
|
||||||
</x-primary-button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</x-guest-layout>
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
<x-guest-layout>
|
|
||||||
<div class="mb-4 text-sm text-gray-600">
|
|
||||||
{{ __('Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn\'t receive the email, we will gladly send you another.') }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
@if (session('status') == 'verification-link-sent')
|
|
||||||
<div class="mb-4 font-medium text-sm text-green-600">
|
|
||||||
{{ __('A new verification link has been sent to the email address you provided during registration.') }}
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
<div class="mt-4 flex items-center justify-between">
|
|
||||||
<form method="POST" action="{{ route('verification.send') }}">
|
|
||||||
@csrf
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<x-primary-button>
|
|
||||||
{{ __('Resend Verification Email') }}
|
|
||||||
</x-primary-button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<form method="POST" action="{{ route('logout') }}">
|
|
||||||
@csrf
|
|
||||||
|
|
||||||
<button type="submit" class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
|
|
||||||
{{ __('Log Out') }}
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</x-guest-layout>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<svg viewBox="0 0 316 316" xmlns="http://www.w3.org/2000/svg" {{ $attributes }}>
|
|
||||||
<path d="M305.8 81.125C305.77 80.995 305.69 80.885 305.65 80.755C305.56 80.525 305.49 80.285 305.37 80.075C305.29 79.935 305.17 79.815 305.07 79.685C304.94 79.515 304.83 79.325 304.68 79.175C304.55 79.045 304.39 78.955 304.25 78.845C304.09 78.715 303.95 78.575 303.77 78.475L251.32 48.275C249.97 47.495 248.31 47.495 246.96 48.275L194.51 78.475C194.33 78.575 194.19 78.725 194.03 78.845C193.89 78.955 193.73 79.045 193.6 79.175C193.45 79.325 193.34 79.515 193.21 79.685C193.11 79.815 192.99 79.935 192.91 80.075C192.79 80.285 192.71 80.525 192.63 80.755C192.58 80.875 192.51 80.995 192.48 81.125C192.38 81.495 192.33 81.875 192.33 82.265V139.625L148.62 164.795V52.575C148.62 52.185 148.57 51.805 148.47 51.435C148.44 51.305 148.36 51.195 148.32 51.065C148.23 50.835 148.16 50.595 148.04 50.385C147.96 50.245 147.84 50.125 147.74 49.995C147.61 49.825 147.5 49.635 147.35 49.485C147.22 49.355 147.06 49.265 146.92 49.155C146.76 49.025 146.62 48.885 146.44 48.785L93.99 18.585C92.64 17.805 90.98 17.805 89.63 18.585L37.18 48.785C37 48.885 36.86 49.035 36.7 49.155C36.56 49.265 36.4 49.355 36.27 49.485C36.12 49.635 36.01 49.825 35.88 49.995C35.78 50.125 35.66 50.245 35.58 50.385C35.46 50.595 35.38 50.835 35.3 51.065C35.25 51.185 35.18 51.305 35.15 51.435C35.05 51.805 35 52.185 35 52.575V232.235C35 233.795 35.84 235.245 37.19 236.025L142.1 296.425C142.33 296.555 142.58 296.635 142.82 296.725C142.93 296.765 143.04 296.835 143.16 296.865C143.53 296.965 143.9 297.015 144.28 297.015C144.66 297.015 145.03 296.965 145.4 296.865C145.5 296.835 145.59 296.775 145.69 296.745C145.95 296.655 146.21 296.565 146.45 296.435L251.36 236.035C252.72 235.255 253.55 233.815 253.55 232.245V174.885L303.81 145.945C305.17 145.165 306 143.725 306 142.155V82.265C305.95 81.875 305.89 81.495 305.8 81.125ZM144.2 227.205L100.57 202.515L146.39 176.135L196.66 147.195L240.33 172.335L208.29 190.625L144.2 227.205ZM244.75 114.995V164.795L226.39 154.225L201.03 139.625V89.825L219.39 100.395L244.75 114.995ZM249.12 57.105L292.81 82.265L249.12 107.425L205.43 82.265L249.12 57.105ZM114.49 184.425L96.13 194.995V85.305L121.49 70.705L139.85 60.135V169.815L114.49 184.425ZM91.76 27.425L135.45 52.585L91.76 77.745L48.07 52.585L91.76 27.425ZM43.67 60.135L62.03 70.705L87.39 85.305V202.545V202.555V202.565C87.39 202.735 87.44 202.895 87.46 203.055C87.49 203.265 87.49 203.485 87.55 203.695V203.705C87.6 203.875 87.69 204.035 87.76 204.195C87.84 204.375 87.89 204.575 87.99 204.745C87.99 204.745 87.99 204.755 88 204.755C88.09 204.905 88.22 205.035 88.33 205.175C88.45 205.335 88.55 205.495 88.69 205.635L88.7 205.645C88.82 205.765 88.98 205.855 89.12 205.965C89.28 206.085 89.42 206.225 89.59 206.325C89.6 206.325 89.6 206.325 89.61 206.335C89.62 206.335 89.62 206.345 89.63 206.345L139.87 234.775V285.065L43.67 229.705V60.135ZM244.75 229.705L148.58 285.075V234.775L219.8 194.115L244.75 179.875V229.705ZM297.2 139.625L253.49 164.795V114.995L278.85 100.395L297.21 89.825V139.625H297.2Z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 3.0 KiB |
@@ -1,7 +0,0 @@
|
|||||||
@props(['status'])
|
|
||||||
|
|
||||||
@if ($status)
|
|
||||||
<div {{ $attributes->merge(['class' => 'font-medium text-sm text-green-600']) }}>
|
|
||||||
{{ $status }}
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<button {{ $attributes->merge(['type' => 'submit', 'class' => 'inline-flex items-center px-4 py-2 bg-red-600 border border-transparent rounded-md font-semibold text-xs text-white uppercase tracking-widest hover:bg-red-500 active:bg-red-700 focus:outline-none focus:ring-2 focus:ring-red-500 focus:ring-offset-2 transition ease-in-out duration-150']) }}>
|
|
||||||
{{ $slot }}
|
|
||||||
</button>
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
<a {{ $attributes->merge(['class' => 'block w-full px-4 py-2 text-start text-sm leading-5 text-gray-700 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 transition duration-150 ease-in-out']) }}>{{ $slot }}</a>
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
@props(['align' => 'right', 'width' => '48', 'contentClasses' => 'py-1 bg-white'])
|
|
||||||
|
|
||||||
@php
|
|
||||||
$alignmentClasses = match ($align) {
|
|
||||||
'left' => 'ltr:origin-top-left rtl:origin-top-right start-0',
|
|
||||||
'top' => 'origin-top',
|
|
||||||
default => 'ltr:origin-top-right rtl:origin-top-left end-0',
|
|
||||||
};
|
|
||||||
|
|
||||||
$width = match ($width) {
|
|
||||||
'48' => 'w-48',
|
|
||||||
default => $width,
|
|
||||||
};
|
|
||||||
@endphp
|
|
||||||
|
|
||||||
<div class="relative" x-data="{ open: false }" @click.outside="open = false" @close.stop="open = false">
|
|
||||||
<div @click="open = ! open">
|
|
||||||
{{ $trigger }}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div x-show="open"
|
|
||||||
x-transition:enter="transition ease-out duration-200"
|
|
||||||
x-transition:enter-start="opacity-0 scale-95"
|
|
||||||
x-transition:enter-end="opacity-100 scale-100"
|
|
||||||
x-transition:leave="transition ease-in duration-75"
|
|
||||||
x-transition:leave-start="opacity-100 scale-100"
|
|
||||||
x-transition:leave-end="opacity-0 scale-95"
|
|
||||||
class="absolute z-50 mt-2 {{ $width }} rounded-md shadow-lg {{ $alignmentClasses }}"
|
|
||||||
style="display: none;"
|
|
||||||
@click="open = false">
|
|
||||||
<div class="rounded-md ring-1 ring-black ring-opacity-5 {{ $contentClasses }}">
|
|
||||||
{{ $content }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
@props(['messages'])
|
|
||||||
|
|
||||||
@if ($messages)
|
|
||||||
<ul {{ $attributes->merge(['class' => 'text-sm text-red-600 space-y-1']) }}>
|
|
||||||
@foreach ((array) $messages as $message)
|
|
||||||
<li>{{ $message }}</li>
|
|
||||||
@endforeach
|
|
||||||
</ul>
|
|
||||||
@endif
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
@props(['value'])
|
|
||||||
|
|
||||||
<label {{ $attributes->merge(['class' => 'block font-medium text-sm text-gray-700']) }}>
|
|
||||||
{{ $value ?? $slot }}
|
|
||||||
</label>
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
@props([
|
|
||||||
'name',
|
|
||||||
'show' => false,
|
|
||||||
'maxWidth' => '2xl'
|
|
||||||
])
|
|
||||||
|
|
||||||
@php
|
|
||||||
$maxWidth = [
|
|
||||||
'sm' => 'sm:max-w-sm',
|
|
||||||
'md' => 'sm:max-w-md',
|
|
||||||
'lg' => 'sm:max-w-lg',
|
|
||||||
'xl' => 'sm:max-w-xl',
|
|
||||||
'2xl' => 'sm:max-w-2xl',
|
|
||||||
][$maxWidth];
|
|
||||||
@endphp
|
|
||||||
|
|
||||||
<div
|
|
||||||
x-data="{
|
|
||||||
show: @js($show),
|
|
||||||
focusables() {
|
|
||||||
// All focusable element types...
|
|
||||||
let selector = 'a, button, input:not([type=\'hidden\']), textarea, select, details, [tabindex]:not([tabindex=\'-1\'])'
|
|
||||||
return [...$el.querySelectorAll(selector)]
|
|
||||||
// All non-disabled elements...
|
|
||||||
.filter(el => ! el.hasAttribute('disabled'))
|
|
||||||
},
|
|
||||||
firstFocusable() { return this.focusables()[0] },
|
|
||||||
lastFocusable() { return this.focusables().slice(-1)[0] },
|
|
||||||
nextFocusable() { return this.focusables()[this.nextFocusableIndex()] || this.firstFocusable() },
|
|
||||||
prevFocusable() { return this.focusables()[this.prevFocusableIndex()] || this.lastFocusable() },
|
|
||||||
nextFocusableIndex() { return (this.focusables().indexOf(document.activeElement) + 1) % (this.focusables().length + 1) },
|
|
||||||
prevFocusableIndex() { return Math.max(0, this.focusables().indexOf(document.activeElement)) -1 },
|
|
||||||
}"
|
|
||||||
x-init="$watch('show', value => {
|
|
||||||
if (value) {
|
|
||||||
document.body.classList.add('overflow-y-hidden');
|
|
||||||
{{ $attributes->has('focusable') ? 'setTimeout(() => firstFocusable().focus(), 100)' : '' }}
|
|
||||||
} else {
|
|
||||||
document.body.classList.remove('overflow-y-hidden');
|
|
||||||
}
|
|
||||||
})"
|
|
||||||
x-on:open-modal.window="$event.detail == '{{ $name }}' ? show = true : null"
|
|
||||||
x-on:close-modal.window="$event.detail == '{{ $name }}' ? show = false : null"
|
|
||||||
x-on:close.stop="show = false"
|
|
||||||
x-on:keydown.escape.window="show = false"
|
|
||||||
x-on:keydown.tab.prevent="$event.shiftKey || nextFocusable().focus()"
|
|
||||||
x-on:keydown.shift.tab.prevent="prevFocusable().focus()"
|
|
||||||
x-show="show"
|
|
||||||
class="fixed inset-0 overflow-y-auto px-4 py-6 sm:px-0 z-50"
|
|
||||||
style="display: {{ $show ? 'block' : 'none' }};"
|
|
||||||
>
|
|
||||||
<div
|
|
||||||
x-show="show"
|
|
||||||
class="fixed inset-0 transform transition-all"
|
|
||||||
x-on:click="show = false"
|
|
||||||
x-transition:enter="ease-out duration-300"
|
|
||||||
x-transition:enter-start="opacity-0"
|
|
||||||
x-transition:enter-end="opacity-100"
|
|
||||||
x-transition:leave="ease-in duration-200"
|
|
||||||
x-transition:leave-start="opacity-100"
|
|
||||||
x-transition:leave-end="opacity-0"
|
|
||||||
>
|
|
||||||
<div class="absolute inset-0 bg-gray-500 opacity-75"></div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div
|
|
||||||
x-show="show"
|
|
||||||
class="mb-6 bg-white rounded-lg overflow-hidden shadow-xl transform transition-all sm:w-full {{ $maxWidth }} sm:mx-auto"
|
|
||||||
x-transition:enter="ease-out duration-300"
|
|
||||||
x-transition:enter-start="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
|
|
||||||
x-transition:enter-end="opacity-100 translate-y-0 sm:scale-100"
|
|
||||||
x-transition:leave="ease-in duration-200"
|
|
||||||
x-transition:leave-start="opacity-100 translate-y-0 sm:scale-100"
|
|
||||||
x-transition:leave-end="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
|
|
||||||
>
|
|
||||||
{{ $slot }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
@props(['active'])
|
|
||||||
|
|
||||||
@php
|
|
||||||
$classes = ($active ?? false)
|
|
||||||
? 'inline-flex items-center px-1 pt-1 border-b-2 border-indigo-400 text-sm font-medium leading-5 text-gray-900 focus:outline-none focus:border-indigo-700 transition duration-150 ease-in-out'
|
|
||||||
: 'inline-flex items-center px-1 pt-1 border-b-2 border-transparent text-sm font-medium leading-5 text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-300 transition duration-150 ease-in-out';
|
|
||||||
@endphp
|
|
||||||
|
|
||||||
<a {{ $attributes->merge(['class' => $classes]) }}>
|
|
||||||
{{ $slot }}
|
|
||||||
</a>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<button {{ $attributes->merge(['type' => 'submit', 'class' => 'inline-flex items-center px-4 py-2 bg-gray-800 border border-transparent rounded-md font-semibold text-xs text-white uppercase tracking-widest hover:bg-gray-700 focus:bg-gray-700 active:bg-gray-900 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 transition ease-in-out duration-150']) }}>
|
|
||||||
{{ $slot }}
|
|
||||||
</button>
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
@props(['active'])
|
|
||||||
|
|
||||||
@php
|
|
||||||
$classes = ($active ?? false)
|
|
||||||
? 'block w-full ps-3 pe-4 py-2 border-l-4 border-indigo-400 text-start text-base font-medium text-indigo-700 bg-indigo-50 focus:outline-none focus:text-indigo-800 focus:bg-indigo-100 focus:border-indigo-700 transition duration-150 ease-in-out'
|
|
||||||
: 'block w-full ps-3 pe-4 py-2 border-l-4 border-transparent text-start text-base font-medium text-gray-600 hover:text-gray-800 hover:bg-gray-50 hover:border-gray-300 focus:outline-none focus:text-gray-800 focus:bg-gray-50 focus:border-gray-300 transition duration-150 ease-in-out';
|
|
||||||
@endphp
|
|
||||||
|
|
||||||
<a {{ $attributes->merge(['class' => $classes]) }}>
|
|
||||||
{{ $slot }}
|
|
||||||
</a>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
<button {{ $attributes->merge(['type' => 'button', 'class' => 'inline-flex items-center px-4 py-2 bg-white border border-gray-300 rounded-md font-semibold text-xs text-gray-700 uppercase tracking-widest shadow-sm hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 disabled:opacity-25 transition ease-in-out duration-150']) }}>
|
|
||||||
{{ $slot }}
|
|
||||||
</button>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
@props(['disabled' => false])
|
|
||||||
|
|
||||||
<input @disabled($disabled) {{ $attributes->merge(['class' => 'border-gray-300 focus:border-indigo-500 focus:ring-indigo-500 rounded-md shadow-sm']) }}>
|
|
||||||
@@ -1,46 +1,29 @@
|
|||||||
@extends('main')
|
@extends('layouts.app')
|
||||||
@section('title', 'Главная')
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row justify-content-center">
|
||||||
<div class="col-md-12">
|
<div class="col-md-8">
|
||||||
<div id="myCarousel" class="carousel slide" data-ride="carousel">
|
<div class="card">
|
||||||
<ol class="carousel-indicators">
|
<div class="card-header">{{ __('Dashboard') }}</div>
|
||||||
<li data-target="#myCarousel" data-slide-to="0" class=""></li>
|
|
||||||
<li data-target="#myCarousel" data-slide-to="1" class="active"></li>
|
|
||||||
</ol>
|
|
||||||
<div class="carousel-inner" role="listbox">
|
|
||||||
<div class="item">
|
|
||||||
<img width="1024" src="/img/promo/01.jpg">
|
|
||||||
</div>
|
|
||||||
<div class="carousel-caption">
|
|
||||||
<h4>Вас приветствует группа LEDSTAR!</h4>
|
|
||||||
<p>Ваш проводник в мире рок-музыки!</p>
|
|
||||||
</div>
|
|
||||||
<div class="item active">
|
|
||||||
<img width="1024" src="/img/promo/02.jpg">
|
|
||||||
</div>
|
|
||||||
<div class="carousel-caption">
|
|
||||||
<h4>Вас приветствует группа LEDSTAR!</h4>
|
|
||||||
<p>Ваш проводник в мире рок-музыки!</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
|
|
||||||
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
|
|
||||||
<span class="sr-only">Previous</span>
|
|
||||||
</a>
|
|
||||||
<a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
|
|
||||||
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
|
|
||||||
<span class="sr-only">Next</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endsection
|
|
||||||
|
|
||||||
@section('breadcrump')
|
<div class="card-body">
|
||||||
<ol class="breadcrumb bread">
|
@if (session('status'))
|
||||||
<li><a href="/main" class="breadcrumb-item">Главная</a></li>
|
<div class="alert alert-success" role="alert">
|
||||||
</ol>
|
{{ session('status') }}
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
{{ __('You are logged in!') }}
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p class="mt-3">
|
||||||
|
Добро пожаловать, <strong>{{ Auth::user()->name }}</strong>!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|||||||
@@ -1,37 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
|
||||||
|
|
||||||
<title>{{ config('app.name', 'Laravel') }}</title>
|
|
||||||
|
|
||||||
<!-- Fonts -->
|
|
||||||
<link rel="preconnect" href="https://fonts.bunny.net">
|
|
||||||
<link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" />
|
|
||||||
|
|
||||||
<!-- Scripts -->
|
|
||||||
@vite(['resources/css/app.css', 'resources/js/app.js'])
|
|
||||||
</head>
|
|
||||||
<body class="font-sans antialiased">
|
|
||||||
<div class="min-h-screen bg-gray-100">
|
|
||||||
@include('layouts.navigation')
|
|
||||||
|
|
||||||
<!-- Page Heading -->
|
|
||||||
@isset($header)
|
|
||||||
<header class="bg-white shadow">
|
|
||||||
<div class="max-w-7xl mx-auto py-6 px-4 sm:px-6 lg:px-8">
|
|
||||||
{{ $header }}
|
|
||||||
</div>
|
|
||||||
</header>
|
|
||||||
@endisset
|
|
||||||
|
|
||||||
<!-- Page Content -->
|
|
||||||
<main>
|
|
||||||
{{ $slot }}
|
|
||||||
</main>
|
|
||||||
</div>
|
|
||||||
@stack('scripts')
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html lang="{{ str_replace('_', '-', app()->getLocale()) }}">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<meta name="csrf-token" content="{{ csrf_token() }}">
|
|
||||||
|
|
||||||
<title>{{ config('app.name', 'Laravel') }}</title>
|
|
||||||
|
|
||||||
<!-- Fonts -->
|
|
||||||
<link rel="preconnect" href="https://fonts.bunny.net">
|
|
||||||
<link href="https://fonts.bunny.net/css?family=figtree:400,500,600&display=swap" rel="stylesheet" />
|
|
||||||
|
|
||||||
<!-- Scripts -->
|
|
||||||
@vite(['resources/css/app.css', 'resources/js/app.js'])
|
|
||||||
</head>
|
|
||||||
<body class="font-sans text-gray-900 antialiased">
|
|
||||||
<div class="min-h-screen flex flex-col sm:justify-center items-center pt-6 sm:pt-0 bg-gray-100">
|
|
||||||
<div>
|
|
||||||
<a href="/">
|
|
||||||
<x-application-logo class="w-20 h-20 fill-current text-gray-500" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="w-full sm:max-w-md mt-6 px-6 py-4 bg-white shadow-md overflow-hidden sm:rounded-lg">
|
|
||||||
{{ $slot }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,105 +0,0 @@
|
|||||||
<nav x-data="{ open: false }" class="bg-white border-b border-gray-100">
|
|
||||||
<!-- Primary Navigation Menu -->
|
|
||||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
|
||||||
<div class="flex justify-between h-16">
|
|
||||||
<div class="flex">
|
|
||||||
<!-- Logo -->
|
|
||||||
<div class="shrink-0 flex items-center">
|
|
||||||
<a href="{{ route('dashboard') }}">
|
|
||||||
<x-application-logo class="block h-9 w-auto fill-current text-gray-800" />
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Navigation Links -->
|
|
||||||
<div class="hidden space-x-8 sm:-my-px sm:ms-10 sm:flex">
|
|
||||||
<x-nav-link :href="route('dashboard')" :active="request()->routeIs('dashboard')">
|
|
||||||
{{ __('Главная') }}
|
|
||||||
</x-nav-link>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Ваш новый пункт -->
|
|
||||||
<x-nav-link :href="route('places.index')" :active="request()->routeIs('places.*')">
|
|
||||||
{{ __('Локации') }}
|
|
||||||
</x-nav-link>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Settings Dropdown -->
|
|
||||||
<div class="hidden sm:flex sm:items-center sm:ms-6">
|
|
||||||
<x-dropdown align="right" width="48">
|
|
||||||
<x-slot name="trigger">
|
|
||||||
<button class="inline-flex items-center px-3 py-2 border border-transparent text-sm leading-4 font-medium rounded-md text-gray-500 bg-white hover:text-gray-700 focus:outline-none transition ease-in-out duration-150">
|
|
||||||
<div>{{ Auth::user()->name }}</div>
|
|
||||||
|
|
||||||
<div class="ms-1">
|
|
||||||
<svg class="fill-current h-4 w-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20">
|
|
||||||
<path fill-rule="evenodd" d="M5.293 7.293a1 1 0 011.414 0L10 10.586l3.293-3.293a1 1 0 111.414 1.414l-4 4a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414z" clip-rule="evenodd" />
|
|
||||||
</svg>
|
|
||||||
</div>
|
|
||||||
</button>
|
|
||||||
</x-slot>
|
|
||||||
|
|
||||||
<x-slot name="content">
|
|
||||||
<x-dropdown-link :href="route('profile.edit')">
|
|
||||||
{{ __('Profile') }}
|
|
||||||
</x-dropdown-link>
|
|
||||||
|
|
||||||
<!-- Authentication -->
|
|
||||||
<form method="POST" action="{{ route('logout') }}">
|
|
||||||
@csrf
|
|
||||||
|
|
||||||
<x-dropdown-link :href="route('logout')"
|
|
||||||
onclick="event.preventDefault();
|
|
||||||
this.closest('form').submit();">
|
|
||||||
{{ __('Log Out') }}
|
|
||||||
</x-dropdown-link>
|
|
||||||
</form>
|
|
||||||
</x-slot>
|
|
||||||
</x-dropdown>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Hamburger -->
|
|
||||||
<div class="-me-2 flex items-center sm:hidden">
|
|
||||||
<button @click="open = ! open" class="inline-flex items-center justify-center p-2 rounded-md text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:bg-gray-100 focus:text-gray-500 transition duration-150 ease-in-out">
|
|
||||||
<svg class="h-6 w-6" stroke="currentColor" fill="none" viewBox="0 0 24 24">
|
|
||||||
<path :class="{'hidden': open, 'inline-flex': ! open }" class="inline-flex" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
|
|
||||||
<path :class="{'hidden': ! open, 'inline-flex': open }" class="hidden" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
|
||||||
</svg>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Responsive Navigation Menu -->
|
|
||||||
<div :class="{'block': open, 'hidden': ! open}" class="hidden sm:hidden">
|
|
||||||
<div class="pt-2 pb-3 space-y-1">
|
|
||||||
<x-responsive-nav-link :href="route('dashboard')" :active="request()->routeIs('dashboard')">
|
|
||||||
{{ __('Dashboard') }}
|
|
||||||
</x-responsive-nav-link>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Responsive Settings Options -->
|
|
||||||
<div class="pt-4 pb-1 border-t border-gray-200">
|
|
||||||
<div class="px-4">
|
|
||||||
<div class="font-medium text-base text-gray-800">{{ Auth::user()->name }}</div>
|
|
||||||
<div class="font-medium text-sm text-gray-500">{{ Auth::user()->email }}</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mt-3 space-y-1">
|
|
||||||
<x-responsive-nav-link :href="route('profile.edit')">
|
|
||||||
{{ __('Profile') }}
|
|
||||||
</x-responsive-nav-link>
|
|
||||||
|
|
||||||
<!-- Authentication -->
|
|
||||||
<form method="POST" action="{{ route('logout') }}">
|
|
||||||
@csrf
|
|
||||||
|
|
||||||
<x-responsive-nav-link :href="route('logout')"
|
|
||||||
onclick="event.preventDefault();
|
|
||||||
this.closest('form').submit();">
|
|
||||||
{{ __('Log Out') }}
|
|
||||||
</x-responsive-nav-link>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</nav>
|
|
||||||
@@ -0,0 +1,163 @@
|
|||||||
|
@extends('layouts.app')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
<div class="container">
|
||||||
|
<div class="row justify-content-center">
|
||||||
|
<div class="col-md-8">
|
||||||
|
<!-- Кнопка назад -->
|
||||||
|
<div class="mb-3">
|
||||||
|
<a href="{{ route('places.index') }}" class="text-decoration-none text-dark fw-bold">
|
||||||
|
← Назад к списку
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card shadow-none">
|
||||||
|
<div class="card-header fw-bold">
|
||||||
|
Добавить новую локацию
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body p-4">
|
||||||
|
<form method="POST" action="{{ route('places.store') }}">
|
||||||
|
@csrf
|
||||||
|
|
||||||
|
<!-- Название -->
|
||||||
|
<div class="mb-4">
|
||||||
|
<label for="name" class="form-label fw-bold">Название места</label>
|
||||||
|
<input type="text" name="name" id="name"
|
||||||
|
class="form-control @error('name') is-invalid @enderror"
|
||||||
|
value="{{ old('name') }}" required placeholder="Например: Главный офис">
|
||||||
|
@error('name')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Адрес -->
|
||||||
|
<div class="mb-4">
|
||||||
|
<label for="address" class="form-label fw-bold">Полный адрес</label>
|
||||||
|
<input type="text" name="address" id="address"
|
||||||
|
class="form-control @error('address') is-invalid @enderror"
|
||||||
|
value="{{ old('address') }}" placeholder="Улица, дом, город">
|
||||||
|
@error('address')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
<label for="phone" class="form-label fw-bold">Телефон</label>
|
||||||
|
<input type="text" name="phone" id="phone"
|
||||||
|
class="form-control @error('phone') is-invalid @enderror"
|
||||||
|
value="{{ old('phone') }}" placeholder="Телефон">
|
||||||
|
@error('phone')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="mb-4">
|
||||||
|
<label for="url" class="form-label fw-bold">URL</label>
|
||||||
|
<input type="text" name="url" id="url"
|
||||||
|
class="form-control @error('url') is-invalid @enderror"
|
||||||
|
value="{{ old('url') }}" placeholder="Адрес сайта">
|
||||||
|
@error('url')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- GPS Координаты -->
|
||||||
|
<div class="col-md-6 mb-4">
|
||||||
|
<label for="coordinates" class="form-label fw-bold">GPS Координаты</label>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-text">
|
||||||
|
<svg xmlns="http://w3.org" width="16" height="16" fill="currentColor" class="bi bi-pin-map" viewBox="0 0 16 16">
|
||||||
|
<path fill-rule="evenodd" d="M3.1 11.2a.5.5 0 0 1 .4-.2H6a.5.5 0 0 1 0 1H3.75L1.5 15h13l-2.25-3H10a.5.5 0 0 1 0-1h2.5a.5.5 0 0 1 .4.2l3 4a.5.5 0 0 1-.4.8H.5a.5.5 0 0 1-.4-.8z"/>
|
||||||
|
<path fill-rule="evenodd" d="M8 1a3 3 0 1 0 0 6 3 3 0 0 0 0-6M4 4a4 4 0 1 1 4.5 3.969V13.5a.5.5 0 0 1-1 0V7.97A4 4 0 0 1 4 4"/>
|
||||||
|
</svg>
|
||||||
|
</span>
|
||||||
|
<input type="text" name="gps" id="gps"
|
||||||
|
class="form-control @error('gps') is-invalid @enderror"
|
||||||
|
value="{{ old('gps') }}" placeholder="55.7558, 37.6173">
|
||||||
|
</div>
|
||||||
|
@error('gps')
|
||||||
|
<div class="invalid-feedback">{{ $message }}</div>
|
||||||
|
@enderror
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Описание (необязательно) -->
|
||||||
|
<div class="mb-4">
|
||||||
|
<label for="description" class="form-label fw-bold">Описание</label>
|
||||||
|
<textarea name="description" id="description" rows="3"
|
||||||
|
class="form-control @error('description') is-invalid @enderror"
|
||||||
|
placeholder="Дополнительная информация">{{ old('description') }}</textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if ($errors->any())
|
||||||
|
<div class="alert alert-danger border-2 shadow-none mb-4">
|
||||||
|
<div class="fw-bold mb-2">При заполнении формы возникли ошибки:</div>
|
||||||
|
<ul class="mb-0">
|
||||||
|
@foreach ($errors->all() as $error)
|
||||||
|
<li>{{ $error }}</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<div class="d-grid">
|
||||||
|
<button type="submit" class="btn btn-secondary">
|
||||||
|
Сохранить локацию
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@push('scripts')
|
||||||
|
<script>
|
||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
const phoneInput = document.getElementById('phone');
|
||||||
|
|
||||||
|
phoneInput.addEventListener('input', function (e) {
|
||||||
|
let input = e.target.value.replace(/\D/g, ''); // Удаляем всё, кроме цифр
|
||||||
|
|
||||||
|
// Если первая цифра 8 или 7, убираем её для единообразия
|
||||||
|
if (input.startsWith('7') || input.startsWith('8')) {
|
||||||
|
input = input.substring(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
let result = '+7';
|
||||||
|
|
||||||
|
if (input.length > 0) {
|
||||||
|
result += ' (' + input.substring(0, 3);
|
||||||
|
}
|
||||||
|
if (input.length >= 4) {
|
||||||
|
result += ') ' + input.substring(3, 6);
|
||||||
|
}
|
||||||
|
if (input.length >= 7) {
|
||||||
|
result += '-' + input.substring(6, 8);
|
||||||
|
}
|
||||||
|
if (input.length >= 9) {
|
||||||
|
result += '-' + input.substring(8, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
e.target.value = result;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Блокируем удаление префикса +7
|
||||||
|
phoneInput.addEventListener('keydown', function(e) {
|
||||||
|
if (e.target.selectionStart < 3 && (e.key === 'Backspace' || e.key === 'Delete')) {
|
||||||
|
e.preventDefault();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const coordsInput = document.getElementById('gps');
|
||||||
|
coordsInput.addEventListener('input', function(e) {
|
||||||
|
// Разрешаем только цифры, точку, запятую, минус и пробел
|
||||||
|
e.target.value = e.target.value.replace(/[^0-9.,\- ]/g, '');
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
@extends('layouts.app')
|
||||||
@push('scripts')
|
@push('scripts')
|
||||||
<script>
|
<script>
|
||||||
/**
|
/**
|
||||||
@@ -12,70 +13,78 @@
|
|||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
@endpush
|
@endpush
|
||||||
<x-app-layout>
|
|
||||||
<x-slot name="header">
|
|
||||||
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
|
|
||||||
{{ __('Концертные площадки') }}
|
|
||||||
</h2>
|
|
||||||
</x-slot>
|
|
||||||
|
|
||||||
<div class="py-12">
|
@section('content')
|
||||||
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
|
<div class="container">
|
||||||
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
|
<div class="d-flex justify-content-between align-items-center mb-4">
|
||||||
<div class="p-6 text-gray-900">
|
<h2>Список локаций</h2>
|
||||||
<!-- Сюда вставляйте вашу таблицу или данные -->
|
<a href="{{ route('places.create') }}" class="btn btn-primary">Добавить место</a>
|
||||||
<div class="p-6 text-gray-900">
|
</div>
|
||||||
<table class="min-w-full border">
|
@if(session('success'))
|
||||||
<thead>
|
<div class="alert alert-success border-2 fw-bold mb-4" style="border-color: #0f5132 !important;">
|
||||||
<tr class="bg-gray-100">
|
{{ session('success') }}
|
||||||
<th class="border p-2">ID</th>
|
</div>
|
||||||
<th class="border p-2">Название</th>
|
@endif
|
||||||
<th class="border p-2">Адрес</th>
|
<div class="table-responsive">
|
||||||
<th class="border p-2 w-48">Телефон</th>
|
@if(session('success'))
|
||||||
<th class="border p-2 ">Карта</th>
|
<div class="alert alert-success border-2 fw-bold mb-4" style="border-color: #0f5132 !important;">
|
||||||
|
{{ session('success') }}
|
||||||
|
</div>
|
||||||
|
@endif
|
||||||
|
<table class="table table-hover mb-0">
|
||||||
|
<thead class="table-light">
|
||||||
|
<tr>
|
||||||
|
<th>ID</th>
|
||||||
|
<th>Название</th>
|
||||||
|
<th>Адрес</th>
|
||||||
|
<th>Телефон</th>
|
||||||
|
<th>Карта</th>
|
||||||
|
<th>Действия</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
@foreach($places as $place)
|
@forelse($places as $place)
|
||||||
<tr>
|
<tr class="align-middle">
|
||||||
<td class="border p-2">{{ $place->id }}</td>
|
<td>{{ $place->id }}</td>
|
||||||
<td class="border p-2">
|
<td><a class="text-indigo-600 hover:text-indigo-900 transition-colors"
|
||||||
<a class="text-indigo-600 hover:text-indigo-900 transition-colors"
|
href="{{ $place->url }}">{{ $place->name }}</a></td>
|
||||||
href="{{ $place->url }}">{{ $place->name }}</a>
|
<td>{{ $place->address ?? '—' }}</td>
|
||||||
</td>
|
<td>{{ $place->phone }}</td>
|
||||||
<td class="border p-2">{{ $place->address }}</td>
|
<td class="text-center">
|
||||||
<td class="border p-2">{{ $place->phone }}</td>
|
|
||||||
<td class="p-2 border text-center w-12">
|
|
||||||
<a href="#" title="Показать на карте"
|
<a href="#" title="Показать на карте"
|
||||||
class="text-gray-500 hover:text-blue-600 transition-colors flex items-center justify-center"
|
class="text-gray-500 hover:text-blue-600 transition-colors flex items-center justify-center"
|
||||||
onclick="openMap('map', {{ $place->id }}); return false;">
|
onclick="openMap('map', {{ $place->id }}); return false;">
|
||||||
<svg class="size-6 w-5 h-5 text-blue-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
<svg xmlns="http://w3.org" width="24" height="24" fill="currentColor" class="bi bi-geo-alt-fill me-2" viewBox="0 0 16 16">
|
||||||
<path stroke-linecap="round" stroke-linejoin="round" d="M9 6.75V15m6-6v8.25m.503 3.498 4.875-2.437c.381-.19.622-.58.622-1.006V4.82c0-.836-.88-1.38-1.628-1.006l-3.869 1.934c-.317.159-.69.159-1.006 0L9.503 3.252a1.125 1.125 0 0 0-1.006 0L3.622 5.689C3.24 5.88 3 6.27 3 6.695V19.18c0 .836.88 1.38 1.628 1.006l3.869-1.934c.317-.159.69-.159 1.006 0l4.994 2.497c.317.158.69.158 1.006 0Z" />
|
<path d="M8 16s6-5.686 6-10A6 6 0 0 0 2 6c0 4.314 6 10 6 10m0-7a3 3 0 1 1 0-6 3 3 0 0 1 0 6"/>
|
||||||
</svg>
|
</svg>
|
||||||
</a>
|
</a>
|
||||||
</td>
|
</td>
|
||||||
|
<td>
|
||||||
|
<div class="d-flex justify-left gap-2">
|
||||||
|
<a href="#" class="btn btn-outline-secondary">Редактировать</a>
|
||||||
|
<form action="{{ route('places.delete', $place->id) }}" method="POST" class="d-inline" onsubmit="return confirm('Удалить эту локацию?')">
|
||||||
|
@csrf
|
||||||
|
@method('DELETE')
|
||||||
|
<button type="submit" class="btn btn-outline-danger">Удалить</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@endforeach
|
@empty
|
||||||
|
<tr>
|
||||||
|
<td colspan="5" class="text-center py-4 text-muted">
|
||||||
|
Локаций пока нет.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforelse
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="mt-4 flex justify-start pagination-wrapper">
|
|
||||||
|
<div class="d-flex justify-left mt-4">
|
||||||
{{ $places->links() }}
|
{{ $places->links() }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</x-app-layout>
|
|
||||||
|
|
||||||
<style>
|
</div>
|
||||||
/* Прямая правка стилей без компиляции Tailwind */
|
@endsection
|
||||||
nav[role="navigation"] div,
|
|
||||||
nav[role="navigation"] a,
|
|
||||||
nav[role="navigation"] span {
|
|
||||||
background-color: white !important;
|
|
||||||
color: #374151 !important; /* Серый текст */
|
|
||||||
border-color: #e5e7eb !important; /* Светлая рамка */
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|||||||
@@ -0,0 +1,81 @@
|
|||||||
|
@push('scripts')
|
||||||
|
<script>
|
||||||
|
/**
|
||||||
|
* Открывает всплывающее окно для локации
|
||||||
|
*/
|
||||||
|
const openMap = (name, id, width = 640, height = 480) => {
|
||||||
|
const url = `/${name}/index/id/${id}`;
|
||||||
|
const windowName = `${name}_window_${id}`;
|
||||||
|
const features = `width=${width},height=${height},scrollbars=yes,resizable=yes`;
|
||||||
|
|
||||||
|
window.open(url, windowName, features);
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
@endpush
|
||||||
|
<x-app-layout>
|
||||||
|
<x-slot name="header">
|
||||||
|
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
|
||||||
|
{{ __('Концертные площадки') }}
|
||||||
|
</h2>
|
||||||
|
</x-slot>
|
||||||
|
|
||||||
|
<div class="py-12">
|
||||||
|
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
|
||||||
|
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
|
||||||
|
<div class="p-6 text-gray-900">
|
||||||
|
<!-- Сюда вставляйте вашу таблицу или данные -->
|
||||||
|
<div class="p-6 text-gray-900">
|
||||||
|
<table class="min-w-full border">
|
||||||
|
<thead>
|
||||||
|
<tr class="bg-gray-100">
|
||||||
|
<th class="border p-2">ID</th>
|
||||||
|
<th class="border p-2">Название</th>
|
||||||
|
<th class="border p-2">Адрес</th>
|
||||||
|
<th class="border p-2 w-48">Телефон</th>
|
||||||
|
<th class="border p-2 ">Карта</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($places as $place)
|
||||||
|
<tr>
|
||||||
|
<td class="border p-2">{{ $place->id }}</td>
|
||||||
|
<td class="border p-2">
|
||||||
|
<a class="text-indigo-600 hover:text-indigo-900 transition-colors"
|
||||||
|
href="{{ $place->url }}">{{ $place->name }}</a>
|
||||||
|
</td>
|
||||||
|
<td class="border p-2">{{ $place->address }}</td>
|
||||||
|
<td class="border p-2">{{ $place->phone }}</td>
|
||||||
|
<td class="p-2 border text-center w-12">
|
||||||
|
<a href="#" title="Показать на карте"
|
||||||
|
class="text-gray-500 hover:text-blue-600 transition-colors flex items-center justify-center"
|
||||||
|
onclick="openMap('map', {{ $place->id }}); return false;">
|
||||||
|
<svg class="size-6 w-5 h-5 text-blue-500" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
||||||
|
<path stroke-linecap="round" stroke-linejoin="round" d="M9 6.75V15m6-6v8.25m.503 3.498 4.875-2.437c.381-.19.622-.58.622-1.006V4.82c0-.836-.88-1.38-1.628-1.006l-3.869 1.934c-.317.159-.69.159-1.006 0L9.503 3.252a1.125 1.125 0 0 0-1.006 0L3.622 5.689C3.24 5.88 3 6.27 3 6.695V19.18c0 .836.88 1.38 1.628 1.006l3.869-1.934c.317-.159.69-.159 1.006 0l4.994 2.497c.317.158.69.158 1.006 0Z" />
|
||||||
|
</svg>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div class="mt-4 flex justify-start pagination-wrapper">
|
||||||
|
{{ $places->links() }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</x-app-layout>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
/* Прямая правка стилей без компиляции Tailwind */
|
||||||
|
nav[role="navigation"] div,
|
||||||
|
nav[role="navigation"] a,
|
||||||
|
nav[role="navigation"] span {
|
||||||
|
background-color: white !important;
|
||||||
|
color: #374151 !important; /* Серый текст */
|
||||||
|
border-color: #e5e7eb !important; /* Светлая рамка */
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
<x-app-layout>
|
|
||||||
<x-slot name="header">
|
|
||||||
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
|
|
||||||
{{ __('Profile') }}
|
|
||||||
</h2>
|
|
||||||
</x-slot>
|
|
||||||
|
|
||||||
<div class="py-12">
|
|
||||||
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8 space-y-6">
|
|
||||||
<div class="p-4 sm:p-8 bg-white shadow sm:rounded-lg">
|
|
||||||
<div class="max-w-xl">
|
|
||||||
@include('profile.partials.update-profile-information-form')
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="p-4 sm:p-8 bg-white shadow sm:rounded-lg">
|
|
||||||
<div class="max-w-xl">
|
|
||||||
@include('profile.partials.update-password-form')
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="p-4 sm:p-8 bg-white shadow sm:rounded-lg">
|
|
||||||
<div class="max-w-xl">
|
|
||||||
@include('profile.partials.delete-user-form')
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</x-app-layout>
|
|
||||||
@@ -1,55 +0,0 @@
|
|||||||
<section class="space-y-6">
|
|
||||||
<header>
|
|
||||||
<h2 class="text-lg font-medium text-gray-900">
|
|
||||||
{{ __('Delete Account') }}
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
<p class="mt-1 text-sm text-gray-600">
|
|
||||||
{{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.') }}
|
|
||||||
</p>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<x-danger-button
|
|
||||||
x-data=""
|
|
||||||
x-on:click.prevent="$dispatch('open-modal', 'confirm-user-deletion')"
|
|
||||||
>{{ __('Delete Account') }}</x-danger-button>
|
|
||||||
|
|
||||||
<x-modal name="confirm-user-deletion" :show="$errors->userDeletion->isNotEmpty()" focusable>
|
|
||||||
<form method="post" action="{{ route('profile.destroy') }}" class="p-6">
|
|
||||||
@csrf
|
|
||||||
@method('delete')
|
|
||||||
|
|
||||||
<h2 class="text-lg font-medium text-gray-900">
|
|
||||||
{{ __('Are you sure you want to delete your account?') }}
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
<p class="mt-1 text-sm text-gray-600">
|
|
||||||
{{ __('Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.') }}
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<div class="mt-6">
|
|
||||||
<x-input-label for="password" value="{{ __('Password') }}" class="sr-only" />
|
|
||||||
|
|
||||||
<x-text-input
|
|
||||||
id="password"
|
|
||||||
name="password"
|
|
||||||
type="password"
|
|
||||||
class="mt-1 block w-3/4"
|
|
||||||
placeholder="{{ __('Password') }}"
|
|
||||||
/>
|
|
||||||
|
|
||||||
<x-input-error :messages="$errors->userDeletion->get('password')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mt-6 flex justify-end">
|
|
||||||
<x-secondary-button x-on:click="$dispatch('close')">
|
|
||||||
{{ __('Cancel') }}
|
|
||||||
</x-secondary-button>
|
|
||||||
|
|
||||||
<x-danger-button class="ms-3">
|
|
||||||
{{ __('Delete Account') }}
|
|
||||||
</x-danger-button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</x-modal>
|
|
||||||
</section>
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
<section>
|
|
||||||
<header>
|
|
||||||
<h2 class="text-lg font-medium text-gray-900">
|
|
||||||
{{ __('Update Password') }}
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
<p class="mt-1 text-sm text-gray-600">
|
|
||||||
{{ __('Ensure your account is using a long, random password to stay secure.') }}
|
|
||||||
</p>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<form method="post" action="{{ route('password.update') }}" class="mt-6 space-y-6">
|
|
||||||
@csrf
|
|
||||||
@method('put')
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<x-input-label for="update_password_current_password" :value="__('Current Password')" />
|
|
||||||
<x-text-input id="update_password_current_password" name="current_password" type="password" class="mt-1 block w-full" autocomplete="current-password" />
|
|
||||||
<x-input-error :messages="$errors->updatePassword->get('current_password')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<x-input-label for="update_password_password" :value="__('New Password')" />
|
|
||||||
<x-text-input id="update_password_password" name="password" type="password" class="mt-1 block w-full" autocomplete="new-password" />
|
|
||||||
<x-input-error :messages="$errors->updatePassword->get('password')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<x-input-label for="update_password_password_confirmation" :value="__('Confirm Password')" />
|
|
||||||
<x-text-input id="update_password_password_confirmation" name="password_confirmation" type="password" class="mt-1 block w-full" autocomplete="new-password" />
|
|
||||||
<x-input-error :messages="$errors->updatePassword->get('password_confirmation')" class="mt-2" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex items-center gap-4">
|
|
||||||
<x-primary-button>{{ __('Save') }}</x-primary-button>
|
|
||||||
|
|
||||||
@if (session('status') === 'password-updated')
|
|
||||||
<p
|
|
||||||
x-data="{ show: true }"
|
|
||||||
x-show="show"
|
|
||||||
x-transition
|
|
||||||
x-init="setTimeout(() => show = false, 2000)"
|
|
||||||
class="text-sm text-gray-600"
|
|
||||||
>{{ __('Saved.') }}</p>
|
|
||||||
@endif
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</section>
|
|
||||||
@@ -1,64 +0,0 @@
|
|||||||
<section>
|
|
||||||
<header>
|
|
||||||
<h2 class="text-lg font-medium text-gray-900">
|
|
||||||
{{ __('Profile Information') }}
|
|
||||||
</h2>
|
|
||||||
|
|
||||||
<p class="mt-1 text-sm text-gray-600">
|
|
||||||
{{ __("Update your account's profile information and email address.") }}
|
|
||||||
</p>
|
|
||||||
</header>
|
|
||||||
|
|
||||||
<form id="send-verification" method="post" action="{{ route('verification.send') }}">
|
|
||||||
@csrf
|
|
||||||
</form>
|
|
||||||
|
|
||||||
<form method="post" action="{{ route('profile.update') }}" class="mt-6 space-y-6">
|
|
||||||
@csrf
|
|
||||||
@method('patch')
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<x-input-label for="name" :value="__('Name')" />
|
|
||||||
<x-text-input id="name" name="name" type="text" class="mt-1 block w-full" :value="old('name', $user->name)" required autofocus autocomplete="name" />
|
|
||||||
<x-input-error class="mt-2" :messages="$errors->get('name')" />
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div>
|
|
||||||
<x-input-label for="email" :value="__('Email')" />
|
|
||||||
<x-text-input id="email" name="email" type="email" class="mt-1 block w-full" :value="old('email', $user->email)" required autocomplete="username" />
|
|
||||||
<x-input-error class="mt-2" :messages="$errors->get('email')" />
|
|
||||||
|
|
||||||
@if ($user instanceof \Illuminate\Contracts\Auth\MustVerifyEmail && ! $user->hasVerifiedEmail())
|
|
||||||
<div>
|
|
||||||
<p class="text-sm mt-2 text-gray-800">
|
|
||||||
{{ __('Your email address is unverified.') }}
|
|
||||||
|
|
||||||
<button form="send-verification" class="underline text-sm text-gray-600 hover:text-gray-900 rounded-md focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500">
|
|
||||||
{{ __('Click here to re-send the verification email.') }}
|
|
||||||
</button>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
@if (session('status') === 'verification-link-sent')
|
|
||||||
<p class="mt-2 font-medium text-sm text-green-600">
|
|
||||||
{{ __('A new verification link has been sent to your email address.') }}
|
|
||||||
</p>
|
|
||||||
@endif
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="flex items-center gap-4">
|
|
||||||
<x-primary-button>{{ __('Save') }}</x-primary-button>
|
|
||||||
|
|
||||||
@if (session('status') === 'profile-updated')
|
|
||||||
<p
|
|
||||||
x-data="{ show: true }"
|
|
||||||
x-show="show"
|
|
||||||
x-transition
|
|
||||||
x-init="setTimeout(() => show = false, 2000)"
|
|
||||||
class="text-sm text-gray-600"
|
|
||||||
>{{ __('Saved.') }}</p>
|
|
||||||
@endif
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</section>
|
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
@extends('main')
|
||||||
|
@section('title', 'Главная')
|
||||||
|
@section('content')
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div id="myCarousel" class="carousel slide" data-ride="carousel">
|
||||||
|
<ol class="carousel-indicators">
|
||||||
|
<li data-target="#myCarousel" data-slide-to="0" class=""></li>
|
||||||
|
<li data-target="#myCarousel" data-slide-to="1" class="active"></li>
|
||||||
|
</ol>
|
||||||
|
<div class="carousel-inner" role="listbox">
|
||||||
|
<div class="item">
|
||||||
|
<img width="1024" src="/img/promo/01.jpg">
|
||||||
|
</div>
|
||||||
|
<div class="carousel-caption">
|
||||||
|
<h4>Вас приветствует группа LEDSTAR!</h4>
|
||||||
|
<p>Ваш проводник в мире рок-музыки!</p>
|
||||||
|
</div>
|
||||||
|
<div class="item active">
|
||||||
|
<img width="1024" src="/img/promo/02.jpg">
|
||||||
|
</div>
|
||||||
|
<div class="carousel-caption">
|
||||||
|
<h4>Вас приветствует группа LEDSTAR!</h4>
|
||||||
|
<p>Ваш проводник в мире рок-музыки!</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
|
||||||
|
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
|
||||||
|
<span class="sr-only">Previous</span>
|
||||||
|
</a>
|
||||||
|
<a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
|
||||||
|
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
|
||||||
|
<span class="sr-only">Next</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('breadcrump')
|
||||||
|
<ol class="breadcrumb bread">
|
||||||
|
<li><a href="/main" class="breadcrumb-item">Главная</a></li>
|
||||||
|
</ol>
|
||||||
|
@endsection
|
||||||
+17
-21
@@ -1,8 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
use App\Http\Controllers\ProfileController;
|
use Illuminate\Support\Facades\Auth;
|
||||||
use Illuminate\Support\Facades\Route;
|
use Illuminate\Support\Facades\Route;
|
||||||
use App\Http\Controllers\MainController;
|
use App\Http\Controllers\StartController;
|
||||||
use App\Http\Controllers\RiderController;
|
use App\Http\Controllers\RiderController;
|
||||||
use App\Http\Controllers\PlaylistController;
|
use App\Http\Controllers\PlaylistController;
|
||||||
use App\Http\Controllers\BandController;
|
use App\Http\Controllers\BandController;
|
||||||
@@ -12,29 +12,24 @@ use App\Http\Controllers\ContactsController;
|
|||||||
use App\Http\Controllers\MapController;
|
use App\Http\Controllers\MapController;
|
||||||
use App\Http\Controllers\PlacesController;
|
use App\Http\Controllers\PlacesController;
|
||||||
|
|
||||||
Route::get('/welcome', function () {
|
Route::middleware('auth')
|
||||||
return view('welcome');
|
->group(function () {
|
||||||
});
|
Route::get('/places', [PlacesController::class, 'index'])->name('places.index');
|
||||||
|
Route::patch('/places/{id}', [PlacesController::class, 'update'])->name('places.update');
|
||||||
Route::get('/dashboard', function () {
|
Route::get('/places/create', [PlacesController::class, 'create'])->name('places.create');
|
||||||
return view('dashboard');
|
Route::post('/places/store', [PlacesController::class, 'store'])->name('places.store');
|
||||||
})->middleware(['auth', 'verified'])->name('dashboard');
|
Route::delete('/places/{id}', [PlacesController::class, 'delete'])->name('places.delete');
|
||||||
|
|
||||||
Route::middleware('auth')->group(function () {
|
|
||||||
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
|
|
||||||
Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
|
|
||||||
Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Route::middleware('auth')
|
Route::middleware('auth')
|
||||||
->group(function () {
|
->group(function () {
|
||||||
Route::get('/places', [PlacesController::class, 'index'])->name('places.index');
|
Route::get('/events', [PlacesController::class, 'index'])->name('events.index');
|
||||||
Route::patch('/places', [PlacesController::class, 'update'])->name('places.update');
|
Route::patch('/events/{id}', [PlacesController::class, 'update'])->name('events.update');
|
||||||
Route::post('/places', [PlacesController::class, 'create'])->name('places.create');
|
Route::post('/events', [PlacesController::class, 'create'])->name('events.create');
|
||||||
Route::delete('/places', [PlacesController::class, 'delete'])->name('places.delete');
|
Route::delete('/events/{id}', [PlacesController::class, 'delete'])->name('events.delete');
|
||||||
});
|
});
|
||||||
|
|
||||||
Route::get('/', [MainController::class, 'index']);
|
Route::get('/', [StartController::class, 'index']);
|
||||||
Route::get('/rider', [RiderController::class, 'index']);
|
Route::get('/rider', [RiderController::class, 'index']);
|
||||||
Route::get('/playlist', [PlaylistController::class, 'index']);
|
Route::get('/playlist', [PlaylistController::class, 'index']);
|
||||||
Route::get('/band', [BandController::class, 'index']);
|
Route::get('/band', [BandController::class, 'index']);
|
||||||
@@ -46,4 +41,5 @@ Route::get('/contacts', [ContactsController::class, 'index']);
|
|||||||
Route::get('/map/index/id/{id}', [ MapController::class, 'index' ]);
|
Route::get('/map/index/id/{id}', [ MapController::class, 'index' ]);
|
||||||
Route::get('/api/getplace/id/{id}', [ MapController::class, 'getPlace' ]);
|
Route::get('/api/getplace/id/{id}', [ MapController::class, 'getPlace' ]);
|
||||||
|
|
||||||
require __DIR__.'/auth.php';
|
Auth::routes();
|
||||||
|
Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
|
||||||
|
|||||||
@@ -1,21 +0,0 @@
|
|||||||
import defaultTheme from 'tailwindcss/defaultTheme';
|
|
||||||
import forms from '@tailwindcss/forms';
|
|
||||||
|
|
||||||
/** @type {import('tailwindcss').Config} */
|
|
||||||
export default {
|
|
||||||
content: [
|
|
||||||
'./vendor/laravel/framework/src/Illuminate/Pagination/resources/views/*.blade.php',
|
|
||||||
'./storage/framework/views/*.php',
|
|
||||||
'./resources/views/**/*.blade.php',
|
|
||||||
],
|
|
||||||
|
|
||||||
theme: {
|
|
||||||
extend: {
|
|
||||||
fontFamily: {
|
|
||||||
sans: ['Figtree', ...defaultTheme.fontFamily.sans],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
plugins: [forms],
|
|
||||||
};
|
|
||||||
Reference in New Issue
Block a user