12 Commits

Author SHA1 Message Date
cf3b4ea476 Merge pull request 'style: enhance authentication forms with improved layout and design' (#3) from feat/auth-forms into master
All checks were successful
Deploy Production (crewsportswear.com) / deploy (push) Successful in 2m10s
Reviewed-on: #3
2026-04-17 06:19:50 +00:00
Frank John Begornia
04675dfd37 style: enhance authentication forms with improved layout and design 2026-04-17 14:18:31 +08:00
Frank John Begornia
a29bca1931 fix: update storage paths for team store logo and banner uploads to use 'uploads/images' directory
All checks were successful
Deploy Production (crewsportswear.com) / deploy (push) Successful in 2m4s
2026-04-17 13:39:15 +08:00
Frank John Begornia
bc5da01735 fix: update storage paths for store logo and banner uploads to include 'upload/images'
All checks were successful
Deploy Production (crewsportswear.com) / deploy (push) Successful in 2m4s
2026-04-17 13:33:31 +08:00
Frank John Begornia
914e276026 fix: migrate store logo/banner uploads from sftp to minio
All checks were successful
Deploy Production (crewsportswear.com) / deploy (push) Successful in 2m6s
2026-04-17 13:24:40 +08:00
Frank John Begornia
2e44012b8c fix: pin psr/http-message ^1.0 and guzzlehttp/psr7 ^1.4 to fix PsrStream __toString incompatibility
All checks were successful
Deploy Production (crewsportswear.com) / deploy (push) Successful in 2m18s
2026-04-17 13:13:42 +08:00
Frank John Begornia
0fe2e2bae6 fix: register minio custom driver using flysystem-aws-s3-v3 (Laravel 5.0 hardcodes v2)
All checks were successful
Deploy Production (crewsportswear.com) / deploy (push) Successful in 2m5s
2026-04-17 13:03:37 +08:00
Frank John Begornia
c6518e81c9 feat: update Dockerfile and AppServiceProvider for PHP 7.2 compatibility and improved error handling
All checks were successful
Deploy Production (crewsportswear.com) / deploy (push) Successful in 7m7s
2026-04-17 12:52:38 +08:00
Frank John Begornia
289e11f3c5 feat: add MinIO S3 storage configuration to docker-compose for improved file management
All checks were successful
Deploy Production (crewsportswear.com) / deploy (push) Successful in 2m31s
2026-04-16 23:55:22 +08:00
8eef632ebb Merge pull request 'feat/hifive-filters' (#2) from feat/hifive-filters into master
All checks were successful
Deploy Production (crewsportswear.com) / deploy (push) Successful in 2m33s
Reviewed-on: #2
2026-04-16 15:41:40 +00:00
ef88a6b69b Merge pull request 'Refactor image upload handling in UserController to use MinIO for improved storage management' (#1) from fix/upload-image into master
Some checks failed
Deploy Production (crewsportswear.com) / deploy (push) Has been cancelled
Reviewed-on: #1
2026-04-16 15:40:59 +00:00
Frank John Begornia
a410208c62 Refactor image upload handling in UserController to use MinIO for improved storage management 2026-04-16 23:40:09 +08:00
11 changed files with 1378 additions and 292 deletions

View File

@@ -1,10 +1,10 @@
# Use PHP 7.0 with Apache (has native mcrypt support for Laravel 5.0)
FROM php:7.0-apache
# Use PHP 7.2 with Apache (mcrypt available via PECL, compatible with Laravel 5.0)
FROM php:7.2-apache
# Update to use archived Debian repositories
# Redirect to archived Debian Buster repositories (EOL)
RUN sed -i 's|deb.debian.org|archive.debian.org|g' /etc/apt/sources.list \
&& sed -i 's|security.debian.org|archive.debian.org|g' /etc/apt/sources.list \
&& sed -i '/stretch-updates/d' /etc/apt/sources.list
&& sed -i '/buster-updates/d' /etc/apt/sources.list
# Install system dependencies
RUN apt-get update && apt-get install -y --allow-unauthenticated \
@@ -18,17 +18,24 @@ RUN apt-get update && apt-get install -y --allow-unauthenticated \
libfreetype6-dev \
libjpeg62-turbo-dev \
openssh-client \
libzip-dev \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
# Install PHP extensions (mcrypt is built-in for PHP 7.0)
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath mcrypt tokenizer zip
# Install mcrypt via PECL (removed from core in PHP 7.2)
RUN pecl install mcrypt-1.0.4 && docker-php-ext-enable mcrypt
# Suppress E_DEPRECATED so PECL mcrypt functions don't trigger ErrorException in Laravel 5.0
RUN echo "error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT" > /usr/local/etc/php/conf.d/suppress-deprecated.ini
# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath tokenizer zip
# Enable Apache mod_rewrite
RUN a2enmod rewrite
# Install Composer (version 1.x for better compatibility with Laravel 5.0)
COPY --from=composer:1.10 /usr/bin/composer /usr/bin/composer
# Install Composer 2.2 (LTS version supporting PHP 7.2+)
COPY --from=composer:2.2 /usr/bin/composer /usr/bin/composer
# Set working directory
WORKDIR /var/www/html
@@ -51,8 +58,8 @@ RUN chown -R www-data:www-data /var/www/html \
# Create .env file if it doesn't exist
RUN if [ ! -f .env ]; then cp .env.example .env; fi
# Install PHP dependencies (Laravel 5.0 compatible)
RUN composer install --no-dev --no-interaction --prefer-dist
# Install PHP dependencies (--no-plugins skips kylekatarnls/update-helper which is Composer 1 only)
RUN composer install --no-dev --no-interaction --prefer-dist --no-plugins
# Generate application key
RUN php artisan key:generate || true
@@ -60,11 +67,7 @@ RUN php artisan key:generate || true
# Run Laravel 5.0 optimization
RUN php artisan clear-compiled && php artisan optimize
# Note: yakpro-po obfuscation requires PHP 7.1+, incompatible with PHP 7.0
# For code protection with PHP 7.0, consider:
# 1. ionCube Encoder (commercial, most secure)
# 2. Keeping source code private and using proper access controls
# 3. Using --optimize flag in composer (already done above)
# Note: PHP 7.2 is compatible with Laravel 5.0 and yakpro-po obfuscation
# Configure Apache DocumentRoot to point to Laravel's public directory
ENV APACHE_DOCUMENT_ROOT=/var/www/html/public

View File

@@ -761,10 +761,7 @@ class UserController extends Controller
);
$u = $UserModel->insertNewProductThumbnails($thumbs);
// var_dump($thumbs);
Storage::disk('sftp')->put($thumbnail, fopen($request->file('imgupload')[$i], 'r+')); //live
//Storage::disk('localdir')->put($thumbnail, fopen($request->file('imgupload')[$i], 'r+'));
// var_dump($s);
Storage::disk('minio')->put('images/' . $thumbnail, file_get_contents($request->file('imgupload')[$i]->getRealPath()));
}
$prod_code = array('ProductCode' => $getYear . '-' . str_pad($id, 10, '0', STR_PAD_LEFT));
@@ -808,9 +805,7 @@ class UserController extends Controller
);
$u = $UserModel->insertNewProductThumbnails($thumbs);
Storage::disk('sftp')->put($thumbnail, fopen($request->file('upload_images')[$i], 'r+')); //live
//Storage::disk('localdir')->put($thumbnail, fopen($request->file('upload_images')[$i], 'r+'));
Storage::disk('minio')->put('images/' . $thumbnail, file_get_contents($request->file('upload_images')[$i]->getRealPath()));
}
@@ -826,9 +821,8 @@ class UserController extends Controller
$id = $request->thumb_id;
$UserModel = new UserModel;
$storagePath = Storage::disk('sftp')->getDriver()->getAdapter()->getPathPrefix();
if (file_exists($storagePath . $file)) {
unlink($storagePath . $file);
if (Storage::disk('minio')->exists('images/' . $file)) {
Storage::disk('minio')->delete('images/' . $file);
}
$i = $UserModel->deleteImageThumb('Id', $id);
@@ -973,11 +967,11 @@ class UserController extends Controller
// var_dump($res);
// if($res){
if ($request->file('store_logo') != null) {
Storage::disk('uploads')->put('/teamstore/' . $orig_store_url . '/' . $store_logo_name, fopen($request->file('store_logo'), 'r+'));
Storage::disk('minio')->put('uploads/images/teamstore/' . $orig_store_url . '/' . $store_logo_name, file_get_contents($request->file('store_logo')->getRealPath()));
}
if ($request->file('store_banner') != null) {
Storage::disk('uploads')->put('/teamstore/' . $orig_store_url . '/' . $store_banner_name, fopen($request->file('store_banner'), 'r+'));
Storage::disk('minio')->put('uploads/images/teamstore/' . $orig_store_url . '/' . $store_banner_name, file_get_contents($request->file('store_banner')->getRealPath()));
}
return response()->json(array(

View File

@@ -4,6 +4,8 @@ use Illuminate\Support\ServiceProvider;
use Storage;
use League\Flysystem\Filesystem;
use League\Flysystem\Sftp\SftpAdapter;
use League\Flysystem\AwsS3v3\AwsS3Adapter as AwsS3v3Adapter;
use Aws\S3\S3Client;
class AppServiceProvider extends ServiceProvider {
@@ -27,6 +29,21 @@ class AppServiceProvider extends ServiceProvider {
Storage::extend('sftp', function ($app, $config) {
return new Filesystem(new SftpAdapter($config));
});
Storage::extend('minio', function ($app, $config) {
$client = new S3Client([
'credentials' => [
'key' => $config['key'],
'secret' => $config['secret'],
],
'region' => $config['region'],
'version' => 'latest',
'endpoint' => $config['endpoint'],
'use_path_style_endpoint' => filter_var($config['use_path_style_endpoint'] ?? true, FILTER_VALIDATE_BOOLEAN),
]);
$adapter = new AwsS3v3Adapter($client, $config['bucket']);
return new Filesystem($adapter);
});
}
/**
@@ -40,6 +57,10 @@ class AppServiceProvider extends ServiceProvider {
*/
public function register()
{
// Laravel's HandleExceptions sets error_reporting(-1) which causes PECL mcrypt
// deprecation notices to become ErrorExceptions. Override it here to suppress E_DEPRECATED.
error_reporting(E_ALL & ~E_DEPRECATED & ~E_STRICT);
$this->app->bind(
'Illuminate\Contracts\Auth\Registrar',
'App\Services\Registrar'

View File

@@ -12,7 +12,10 @@
"google/recaptcha": "~1.1",
"spatie/laravel-analytics": "^1.4",
"league/flysystem-sftp": "^1.0",
"aws/aws-sdk-php": "~3.0"
"league/flysystem-aws-s3-v3": "~1.0",
"aws/aws-sdk-php": "~3.0",
"psr/http-message": "^1.0",
"guzzlehttp/psr7": "^1.4"
},
"require-dev": {
"phpunit/phpunit": "~4.0",

647
composer.lock generated
View File

@@ -4,8 +4,153 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "9ad9cbf7c7c319c392284bef379f0004",
"content-hash": "0320d93525d3aeed0db29b492fe6f3cc",
"packages": [
{
"name": "aws/aws-crt-php",
"version": "v1.2.7",
"source": {
"type": "git",
"url": "https://github.com/awslabs/aws-crt-php.git",
"reference": "d71d9906c7bb63a28295447ba12e74723bd3730e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/d71d9906c7bb63a28295447ba12e74723bd3730e",
"reference": "d71d9906c7bb63a28295447ba12e74723bd3730e",
"shasum": ""
},
"require": {
"php": ">=5.5"
},
"require-dev": {
"phpunit/phpunit": "^4.8.35||^5.6.3||^9.5",
"yoast/phpunit-polyfills": "^1.0"
},
"suggest": {
"ext-awscrt": "Make sure you install awscrt native extension to use any of the functionality."
},
"type": "library",
"autoload": {
"classmap": [
"src/"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "AWS SDK Common Runtime Team",
"email": "aws-sdk-common-runtime@amazon.com"
}
],
"description": "AWS Common Runtime for PHP",
"homepage": "https://github.com/awslabs/aws-crt-php",
"keywords": [
"amazon",
"aws",
"crt",
"sdk"
],
"support": {
"issues": "https://github.com/awslabs/aws-crt-php/issues",
"source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.7"
},
"time": "2024-10-18T22:15:13+00:00"
},
{
"name": "aws/aws-sdk-php",
"version": "3.226.0",
"source": {
"type": "git",
"url": "https://github.com/aws/aws-sdk-php.git",
"reference": "d76d4fe0fa603ddc3f5c54d9664438dc1a808859"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/d76d4fe0fa603ddc3f5c54d9664438dc1a808859",
"reference": "d76d4fe0fa603ddc3f5c54d9664438dc1a808859",
"shasum": ""
},
"require": {
"aws/aws-crt-php": "^1.0.2",
"ext-json": "*",
"ext-pcre": "*",
"ext-simplexml": "*",
"guzzlehttp/guzzle": "^5.3.3 || ^6.2.1 || ^7.0",
"guzzlehttp/promises": "^1.4.0",
"guzzlehttp/psr7": "^1.7.0 || ^2.1.1",
"mtdowling/jmespath.php": "^2.6",
"php": ">=5.5"
},
"require-dev": {
"andrewsville/php-token-reflection": "^1.4",
"aws/aws-php-sns-message-validator": "~1.0",
"behat/behat": "~3.0",
"doctrine/cache": "~1.4",
"ext-dom": "*",
"ext-openssl": "*",
"ext-pcntl": "*",
"ext-sockets": "*",
"nette/neon": "^2.3",
"paragonie/random_compat": ">= 2",
"phpunit/phpunit": "^4.8.35 || ^5.6.3",
"psr/cache": "^1.0",
"psr/simple-cache": "^1.0",
"sebastian/comparator": "^1.2.3"
},
"suggest": {
"aws/aws-php-sns-message-validator": "To validate incoming SNS notifications",
"doctrine/cache": "To use the DoctrineCacheAdapter",
"ext-curl": "To send requests using cURL",
"ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages",
"ext-sockets": "To use client-side monitoring"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.0-dev"
}
},
"autoload": {
"files": [
"src/functions.php"
],
"psr-4": {
"Aws\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "Amazon Web Services",
"homepage": "http://aws.amazon.com"
}
],
"description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project",
"homepage": "http://aws.amazon.com/sdkforphp",
"keywords": [
"amazon",
"aws",
"cloud",
"dynamodb",
"ec2",
"glacier",
"s3",
"sdk"
],
"support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.226.0"
},
"time": "2022-06-16T18:14:10+00:00"
},
{
"name": "classpreloader/classpreloader",
"version": "1.4.0",
@@ -365,6 +510,190 @@
],
"time": "2019-10-30T09:32:00+00:00"
},
{
"name": "guzzlehttp/promises",
"version": "1.5.3",
"source": {
"type": "git",
"url": "https://github.com/guzzle/promises.git",
"reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/promises/zipball/67ab6e18aaa14d753cc148911d273f6e6cb6721e",
"reference": "67ab6e18aaa14d753cc148911d273f6e6cb6721e",
"shasum": ""
},
"require": {
"php": ">=5.5"
},
"require-dev": {
"symfony/phpunit-bridge": "^4.4 || ^5.1"
},
"type": "library",
"autoload": {
"files": [
"src/functions_include.php"
],
"psr-4": {
"GuzzleHttp\\Promise\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com",
"homepage": "https://github.com/Nyholm"
},
{
"name": "Tobias Schultze",
"email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion"
}
],
"description": "Guzzle promises library",
"keywords": [
"promise"
],
"support": {
"issues": "https://github.com/guzzle/promises/issues",
"source": "https://github.com/guzzle/promises/tree/1.5.3"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises",
"type": "tidelift"
}
],
"time": "2023-05-21T12:31:43+00:00"
},
{
"name": "guzzlehttp/psr7",
"version": "1.9.1",
"source": {
"type": "git",
"url": "https://github.com/guzzle/psr7.git",
"reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/guzzle/psr7/zipball/e4490cabc77465aaee90b20cfc9a770f8c04be6b",
"reference": "e4490cabc77465aaee90b20cfc9a770f8c04be6b",
"shasum": ""
},
"require": {
"php": ">=5.4.0",
"psr/http-message": "~1.0",
"ralouphie/getallheaders": "^2.0.5 || ^3.0.0"
},
"provide": {
"psr/http-message-implementation": "1.0"
},
"require-dev": {
"ext-zlib": "*",
"phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20 || ^8.5.8 || ^9.3.10"
},
"suggest": {
"laminas/laminas-httphandlerrunner": "Emit PSR-7 responses"
},
"type": "library",
"autoload": {
"files": [
"src/functions_include.php"
],
"psr-4": {
"GuzzleHttp\\Psr7\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
},
{
"name": "George Mponos",
"email": "gmponos@gmail.com",
"homepage": "https://github.com/gmponos"
},
{
"name": "Tobias Nyholm",
"email": "tobias.nyholm@gmail.com",
"homepage": "https://github.com/Nyholm"
},
{
"name": "Márk Sági-Kazár",
"email": "mark.sagikazar@gmail.com",
"homepage": "https://github.com/sagikazarmark"
},
{
"name": "Tobias Schultze",
"email": "webmaster@tubo-world.de",
"homepage": "https://github.com/Tobion"
}
],
"description": "PSR-7 message implementation that also provides common utility methods",
"keywords": [
"http",
"message",
"psr-7",
"request",
"response",
"stream",
"uri",
"url"
],
"support": {
"issues": "https://github.com/guzzle/psr7/issues",
"source": "https://github.com/guzzle/psr7/tree/1.9.1"
},
"funding": [
{
"url": "https://github.com/GrahamCampbell",
"type": "github"
},
{
"url": "https://github.com/Nyholm",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7",
"type": "tidelift"
}
],
"time": "2023-04-17T16:00:37+00:00"
},
{
"name": "guzzlehttp/ringphp",
"version": "1.1.1",
@@ -907,6 +1236,71 @@
],
"time": "2019-10-16T21:01:05+00:00"
},
{
"name": "league/flysystem-aws-s3-v3",
"version": "1.0.30",
"source": {
"type": "git",
"url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git",
"reference": "af286f291ebab6877bac0c359c6c2cb017eb061d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/af286f291ebab6877bac0c359c6c2cb017eb061d",
"reference": "af286f291ebab6877bac0c359c6c2cb017eb061d",
"shasum": ""
},
"require": {
"aws/aws-sdk-php": "^3.20.0",
"league/flysystem": "^1.0.40",
"php": ">=5.5.0"
},
"require-dev": {
"henrikbjorn/phpspec-code-coverage": "~1.0.1",
"phpspec/phpspec": "^2.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0-dev"
}
},
"autoload": {
"psr-4": {
"League\\Flysystem\\AwsS3v3\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Frank de Jonge",
"email": "info@frenky.net"
}
],
"description": "Flysystem adapter for the AWS S3 SDK v3.x",
"support": {
"issues": "https://github.com/thephpleague/flysystem-aws-s3-v3/issues",
"source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/1.0.30"
},
"funding": [
{
"url": "https://offset.earth/frankdejonge",
"type": "custom"
},
{
"url": "https://github.com/frankdejonge",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/league/flysystem",
"type": "tidelift"
}
],
"time": "2022-07-02T13:51:38+00:00"
},
{
"name": "league/flysystem-sftp",
"version": "1.0.22",
@@ -1071,6 +1465,72 @@
],
"time": "2017-01-23T04:29:33+00:00"
},
{
"name": "mtdowling/jmespath.php",
"version": "2.8.0",
"source": {
"type": "git",
"url": "https://github.com/jmespath/jmespath.php.git",
"reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/a2a865e05d5f420b50cc2f85bb78d565db12a6bc",
"reference": "a2a865e05d5f420b50cc2f85bb78d565db12a6bc",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0",
"symfony/polyfill-mbstring": "^1.17"
},
"require-dev": {
"composer/xdebug-handler": "^3.0.3",
"phpunit/phpunit": "^8.5.33"
},
"bin": [
"bin/jp.php"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.8-dev"
}
},
"autoload": {
"files": [
"src/JmesPath.php"
],
"psr-4": {
"JmesPath\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Graham Campbell",
"email": "hello@gjcampbell.co.uk",
"homepage": "https://github.com/GrahamCampbell"
},
{
"name": "Michael Dowling",
"email": "mtdowling@gmail.com",
"homepage": "https://github.com/mtdowling"
}
],
"description": "Declaratively specify how to extract elements from a JSON document",
"keywords": [
"json",
"jsonpath"
],
"support": {
"issues": "https://github.com/jmespath/jmespath.php/issues",
"source": "https://github.com/jmespath/jmespath.php/tree/2.8.0"
},
"time": "2024-09-04T18:46:31+00:00"
},
{
"name": "nesbot/carbon",
"version": "1.39.1",
@@ -1409,6 +1869,59 @@
],
"time": "2019-09-17T03:41:22+00:00"
},
{
"name": "psr/http-message",
"version": "1.1",
"source": {
"type": "git",
"url": "https://github.com/php-fig/http-message.git",
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/http-message/zipball/cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
"reference": "cb6ce4845ce34a8ad9e68117c10ee90a29919eba",
"shasum": ""
},
"require": {
"php": "^7.2 || ^8.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.1.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Http\\Message\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "http://www.php-fig.org/"
}
],
"description": "Common interface for HTTP messages",
"homepage": "https://github.com/php-fig/http-message",
"keywords": [
"http",
"http-message",
"psr",
"psr-7",
"request",
"response"
],
"support": {
"source": "https://github.com/php-fig/http-message/tree/1.1"
},
"time": "2023-04-04T09:50:52+00:00"
},
{
"name": "psr/log",
"version": "1.1.2",
@@ -1527,6 +2040,50 @@
],
"time": "2015-03-26T18:43:54+00:00"
},
{
"name": "ralouphie/getallheaders",
"version": "3.0.3",
"source": {
"type": "git",
"url": "https://github.com/ralouphie/getallheaders.git",
"reference": "120b605dfeb996808c31b6477290a714d356e822"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822",
"reference": "120b605dfeb996808c31b6477290a714d356e822",
"shasum": ""
},
"require": {
"php": ">=5.6"
},
"require-dev": {
"php-coveralls/php-coveralls": "^2.1",
"phpunit/phpunit": "^5 || ^6.5"
},
"type": "library",
"autoload": {
"files": [
"src/getallheaders.php"
]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Ralph Khattar",
"email": "ralph.khattar@gmail.com"
}
],
"description": "A polyfill for getallheaders.",
"support": {
"issues": "https://github.com/ralouphie/getallheaders/issues",
"source": "https://github.com/ralouphie/getallheaders/tree/develop"
},
"time": "2019-03-08T08:55:37+00:00"
},
{
"name": "react/promise",
"version": "v2.7.1",
@@ -2158,6 +2715,91 @@
],
"time": "2019-08-06T08:03:45+00:00"
},
{
"name": "symfony/polyfill-mbstring",
"version": "v1.36.0",
"source": {
"type": "git",
"url": "https://github.com/symfony/polyfill-mbstring.git",
"reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/6a21eb99c6973357967f6ce3708cd55a6bec6315",
"reference": "6a21eb99c6973357967f6ce3708cd55a6bec6315",
"shasum": ""
},
"require": {
"ext-iconv": "*",
"php": ">=7.2"
},
"provide": {
"ext-mbstring": "*"
},
"suggest": {
"ext-mbstring": "For best performance"
},
"type": "library",
"extra": {
"thanks": {
"url": "https://github.com/symfony/polyfill",
"name": "symfony/polyfill"
}
},
"autoload": {
"files": [
"bootstrap.php"
],
"psr-4": {
"Symfony\\Polyfill\\Mbstring\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Nicolas Grekas",
"email": "p@tchwork.com"
},
{
"name": "Symfony Community",
"homepage": "https://symfony.com/contributors"
}
],
"description": "Symfony polyfill for the Mbstring extension",
"homepage": "https://symfony.com",
"keywords": [
"compatibility",
"mbstring",
"polyfill",
"portable",
"shim"
],
"support": {
"source": "https://github.com/symfony/polyfill-mbstring/tree/v1.36.0"
},
"funding": [
{
"url": "https://symfony.com/sponsor",
"type": "custom"
},
{
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2026-04-10T17:25:58+00:00"
},
{
"name": "symfony/polyfill-php56",
"version": "v1.12.0",
@@ -3909,5 +4551,6 @@
"prefer-stable": false,
"prefer-lowest": false,
"platform": [],
"platform-dev": []
"platform-dev": [],
"plugin-api-version": "2.2.0"
}

View File

@@ -88,7 +88,7 @@ return [
],
'minio' => [
'driver' => 's3',
'driver' => 'minio',
'key' => env('MINIO_KEY'),
'secret' => env('MINIO_SECRET'),
'region' => env('MINIO_REGION', 'us-east-1'),

View File

@@ -28,6 +28,14 @@ services:
- ANALYTICS_SITE_ID=${ANALYTICS_SITE_ID}
- ANALYTICS_CLIENT_ID=${ANALYTICS_CLIENT_ID}
- ANALYTICS_SERVICE_EMAIL=${ANALYTICS_SERVICE_EMAIL}
# MinIO S3 Storage
- MINIO_ENDPOINT=${MINIO_ENDPOINT:-http://crew-minio-prod:9000}
- MINIO_KEY=${MINIO_KEY}
- MINIO_SECRET=${MINIO_SECRET}
- MINIO_BUCKET=${MINIO_BUCKET:-crewsportswear}
- MINIO_REGION=${MINIO_REGION:-us-east-1}
- MINIO_USE_PATH_STYLE=${MINIO_USE_PATH_STYLE:-true}
- MINIO_URL=${MINIO_URL:-https://minio.crewsportswear.app}
volumes:
- ./storage:/var/www/html/storage
- ./public/uploads:/var/www/html/public/uploads

View File

@@ -2,58 +2,168 @@
@section('content')
<style>
.error{
color: red;
html,
body {
height: 100%;
background: #ffffff;
margin: 0;
overflow: hidden;
}
.form-wrapper{
margin-top: 20%;
.navbar-custom {
display: block;
margin-bottom: 0;
}
.login-wrapper {
height: calc(100vh - 100px);
height: calc(100dvh - 100px);
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: center;
padding: 16px;
}
.login-card {
width: 100%;
max-width: 380px;
background: #ffffff;
border: 1px solid #eceff3;
border-radius: 12px;
padding: 28px;
}
.login-title {
font-size: 24px;
font-weight: 600;
line-height: 1.2;
margin: 0 0 8px;
color: #111827;
}
.login-subtitle {
font-size: 14px;
margin: 0 0 24px;
color: #6b7280;
}
.login-card .form-group {
margin-bottom: 16px;
}
.login-card label {
display: block;
font-size: 13px;
font-weight: 500;
margin-bottom: 6px;
color: #374151;
}
.login-card .form-control {
height: 42px;
border-radius: 8px;
border: 1px solid #d1d5db;
background: #ffffff;
font-size: 14px;
padding: 0 12px;
box-shadow: none;
transition: border-color 0.2s, box-shadow 0.2s;
}
.login-card .form-control:focus {
border-color: #9ca3af;
box-shadow: 0 0 0 3px rgba(156, 163, 175, 0.2);
outline: none;
}
.login-remember-row {
display: flex;
align-items: center;
justify-content: space-between;
margin: 6px 0 18px;
}
.login-remember-row label {
margin: 0;
font-size: 13px;
font-weight: 400;
color: #4b5563;
}
.login-remember-row a {
font-size: 13px;
color: #4b5563;
text-decoration: none;
}
.login-remember-row a:hover {
color: #111827;
}
.btn-login {
width: 100%;
height: 44px;
border: 0;
border-radius: 8px;
background: #111827;
color: #ffffff;
font-size: 14px;
font-weight: 600;
transition: opacity 0.2s;
}
.btn-login:hover {
opacity: 0.92;
color: #ffffff;
}
.login-footer {
margin-top: 18px;
text-align: center;
font-size: 13px;
color: #6b7280;
}
.login-footer a {
color: #111827;
text-decoration: none;
font-weight: 500;
}
.login-footer a:hover {
text-decoration: underline;
}
#login-response-msg .alert {
border-radius: 8px;
font-size: 13px;
margin-bottom: 14px;
}
</style>
<div class="container">
<div class="col-md-4 col-md-offset-4">
<div class="form-wrapper">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="text-center">S I G N - I N</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-xs-12">
<div id="login-response-msg"></div>
<form role="form" id="frm-login">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="form-group">
<label for="username" class="control-label">Email Address</label>
<input type="email" class="form-control" name="email" value="{{ old('email') }}" title="Please enter your email address" placeholder="example@gmail.com">
<span class="help-block"></span>
</div>
<div class="form-group">
<label for="password" class="control-label">Password</label>
<input type="password" class="form-control" name="password" placeholder="Password" title="Please enter your password">
<span class="help-block"></span>
</div>
<div class="checkbox">
<label>
<input type="checkbox" name="remember"> Remember login
</label>
<p class="help-block">(if this is a private computer)</p>
</div>
<button type="submit" id="btn-login" class="btn btn-success btn-block"><i class="fa fa-sign-in"></i> &nbsp; Sign in</button>
<a href="{{ url('/password/email') }}" class="btn btn-link btn-block">Forgot Your Password?</a>
</form>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<hr />
<p class="text-center">Don't have an account? Register Now!</p>
<a href="{{ url('/auth/register') }}" type="submit" id="btn-login" class="btn btn-primary btn-block">Register</a>
</div>
</div>
</div>
<div class="login-wrapper">
<div class="login-card">
<h1 class="login-title">Sign in</h1>
<p class="login-subtitle">Welcome back. Please enter your details.</p>
<div id="login-response-msg"></div>
<form role="form" id="frm-login">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="form-group">
<label for="email">Email Address</label>
<input type="email" class="form-control" name="email" id="email" value="{{ old('email') }}" placeholder="you@example.com" title="Please enter your email address">
</div>
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" name="password" id="password" placeholder="Enter your password" title="Please enter your password">
</div>
<div class="login-remember-row">
<label><input type="checkbox" name="remember"> Remember me</label>
<a href="{{ url('/password/email') }}">Forgot password?</a>
</div>
<button type="submit" id="btn-login" class="btn-login">Sign in</button>
</form>
<p class="login-footer">Dont have an account? <a href="{{ url('/auth/register') }}">Create one</a></p>
</div>
</div>
@endsection

View File

@@ -2,54 +2,154 @@
@section('content')
<style>
.error{
color: red;
body {
background: #ffffff;
margin: 0;
}
.form-wrapper{
margin-top: 20%;
.navbar-custom {
margin-bottom: 0;
}
.auth-wrapper {
min-height: calc(100vh - 100px);
min-height: calc(100dvh - 100px);
display: flex;
align-items: center;
justify-content: center;
padding: 24px 16px;
box-sizing: border-box;
}
.auth-card {
width: 100%;
max-width: 380px;
background: #ffffff;
border: 1px solid #eceff3;
border-radius: 12px;
padding: 28px;
}
.auth-title {
font-size: 24px;
font-weight: 600;
line-height: 1.2;
margin: 0 0 8px;
color: #111827;
}
.auth-subtitle {
font-size: 14px;
margin: 0 0 20px;
color: #6b7280;
}
.auth-card .form-group {
margin-bottom: 14px;
}
.auth-card label {
display: block;
font-size: 13px;
font-weight: 500;
margin-bottom: 6px;
color: #374151;
}
.auth-card .form-control {
height: 42px;
border-radius: 8px;
border: 1px solid #d1d5db;
background: #ffffff;
font-size: 14px;
padding: 0 12px;
box-shadow: none;
transition: border-color 0.2s, box-shadow 0.2s;
}
.auth-card .form-control:focus {
border-color: #9ca3af;
box-shadow: 0 0 0 3px rgba(156, 163, 175, 0.2);
outline: none;
}
.btn-auth {
width: 100%;
height: 44px;
border: 0;
border-radius: 8px;
background: #111827;
color: #ffffff;
font-size: 14px;
font-weight: 600;
transition: opacity 0.2s;
}
.btn-auth:hover {
opacity: 0.92;
color: #ffffff;
}
.auth-footer {
margin-top: 16px;
text-align: center;
font-size: 13px;
color: #6b7280;
}
.auth-footer a {
color: #111827;
text-decoration: none;
font-weight: 500;
}
.auth-footer a:hover {
text-decoration: underline;
}
.auth-card .alert {
border-radius: 8px;
font-size: 13px;
}
.auth-card .alert ul {
padding-left: 18px;
margin-bottom: 0;
}
</style>
<div class="container">
<div class="col-md-4 col-md-offset-4">
<div class="form-wrapper">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="text-center">R E S E T &nbsp; P A S S W O R D</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-xs-12">
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif
@if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form role="form" method="POST" action="{{ url('/password/email') }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="form-group">
<label for="username" class="control-label">Email Address</label>
<input type="email" class="form-control" name="email" value="{{ old('email') }}" title="Please enter your email address" placeholder="example@gmail.com">
<span class="help-block"></span>
</div>
<button type="submit" class="btn btn-default btn-block">Send Password Reset Link</button>
</form>
<br><br>
</div>
</div>
</div>
<div class="auth-wrapper">
<div class="auth-card">
<h1 class="auth-title">Forgot password</h1>
<p class="auth-subtitle">Enter your email and well send you a reset link.</p>
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
</div>
@endif
@if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form role="form" method="POST" action="{{ url('/password/email') }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="form-group">
<label for="email">Email Address</label>
<input type="email" class="form-control" name="email" id="email" value="{{ old('email') }}" title="Please enter your email address" placeholder="you@example.com">
</div>
<button type="submit" class="btn-auth">Send reset link</button>
</form>
<p class="auth-footer"><a href="{{ url('/auth/login') }}">Back to sign in</a></p>
</div>
</div>
@endsection

View File

@@ -2,136 +2,242 @@
@section('content')
<style>
.error {
color: red;
body {
background: #ffffff;
margin: 0;
}
.navbar-custom {
margin-bottom: 0;
}
.auth-wrapper {
min-height: calc(100vh - 100px);
min-height: calc(100dvh - 100px);
display: flex;
align-items: flex-start;
justify-content: center;
padding: 24px 16px;
box-sizing: border-box;
}
.auth-card {
width: 100%;
max-width: 560px;
background: #ffffff;
border: 1px solid #eceff3;
border-radius: 12px;
padding: 28px;
}
.auth-title {
font-size: 24px;
font-weight: 600;
line-height: 1.2;
margin: 0 0 8px;
color: #111827;
}
.auth-subtitle {
font-size: 14px;
margin: 0 0 20px;
color: #6b7280;
}
.auth-section-title {
font-size: 12px;
font-weight: 600;
color: #6b7280;
text-transform: uppercase;
letter-spacing: 0.5px;
margin: 8px 0 12px;
}
.auth-card .form-group {
margin-bottom: 14px;
}
.auth-card label {
display: block;
font-size: 13px;
font-weight: 500;
margin-bottom: 6px;
color: #374151;
}
.auth-card .form-control {
height: 42px;
border-radius: 8px;
border: 1px solid #d1d5db;
background: #ffffff;
font-size: 14px;
padding: 0 12px;
box-shadow: none;
transition: border-color 0.2s, box-shadow 0.2s;
}
.auth-card .form-control:focus {
border-color: #9ca3af;
box-shadow: 0 0 0 3px rgba(156, 163, 175, 0.2);
outline: none;
}
.auth-card select.form-control {
padding-right: 28px;
}
.g-recaptcha {
width: 100%;
}
.auth-terms {
font-size: 13px;
color: #6b7280;
margin-bottom: 14px;
}
.auth-terms a {
color: #111827;
text-decoration: none;
}
.auth-terms a:hover {
text-decoration: underline;
}
.btn-register-modern {
width: 100%;
height: 44px;
border: 0;
border-radius: 8px;
background: #111827;
color: #ffffff;
font-size: 14px;
font-weight: 600;
transition: opacity 0.2s;
}
.btn-register-modern:hover {
opacity: 0.92;
color: #ffffff;
}
.auth-footer {
margin-top: 16px;
text-align: center;
font-size: 13px;
color: #6b7280;
}
.auth-footer a {
color: #111827;
text-decoration: none;
font-weight: 500;
}
.auth-footer a:hover {
text-decoration: underline;
}
#register-response-msg .alert {
border-radius: 8px;
font-size: 13px;
margin-bottom: 14px;
}
</style>
<div class="container">
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="form-wrapper">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="text-center">R E G I S T E R</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-xs-12">
<div id="register-response-msg"></div>
<form role="form" id="frm-register">
<div class="form-group text-center">
<h5>Personal Information</h5>
</div>
<input type="hidden" name="redirect" value="{{ Request::get('redirectUrl') }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="form-group">
<label class="control-label">First name</label>
<input type="text" class="form-control" name="firstname" placeholder="First name">
</div>
<div class="auth-wrapper">
<div class="auth-card">
<h1 class="auth-title">Create account</h1>
<p class="auth-subtitle">Fill in your details to get started.</p>
<div id="register-response-msg"></div>
<form role="form" id="frm-register">
<div class="auth-section-title">Personal Information</div>
<input type="hidden" name="redirect" value="{{ Request::get('redirectUrl') }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<div class="form-group">
<label class="control-label">Last name</label>
<input type="text" class="form-control" name="lastname" placeholder="Last name">
</div>
<!-- <div class="form-group">
<label class="control-label">Username</label>
<input type="text" class="form-control" name="username" value="{{ old('username') }}" placeholder="Username">
</div> -->
<div class="form-group">
<label class="control-label">Email Address</label>
<input type="email" class="form-control" name="email" value="{{ old('email') }}" placeholder="Email Address">
</div>
<div class="form-group">
<label class="control-label">Phone Number</label>
<input type="text" class="form-control" name="mobilenumber" placeholder="Phone Number">
</div>
<div class="form-group">
<label class="control-label">Password</label>
<input type="password" class="form-control" name="password" id="password" required placeholder="Password">
</div>
<div class="form-group">
<label class="control-label">Confirm Password</label>
<input type="password" class="form-control" name="password_confirmation" placeholder="Confirm Password" data-rule-equalTo="#password" required>
</div>
<div class="form-group text-center">
<h5>Address Information</h5>
</div>
<div class="form-group">
<label class="control-label">Select Country</label>
<select name="countryCode" id="select_country" class="form-control" onchange="selectCountry(this)">
<option value="">Select Country</option>
<option value="US">United States</option>
<option value="CA">Canada</option>
</select>
</div>
<div class="form-group">
<label class="control-label">State / Province</label>
<label></label>
<select class="form-control" name="state" id="lst-states">
<option value="">Select State</option>
</select>
</div>
<div class="form-group">
<label class="control-label">City</label>
<select class="form-control" name="city" id="lst-cities">
<option value="">Select City</option>
</select>
</div>
<div class="form-group">
<label class="control-label">Address 1</label>
<input type="text" class="form-control" name="address" placeholder="Address 1">
</div>
<div class="form-group">
<label class="control-label">Address 2</label>
<input type="text" class="form-control" name="address2" placeholder="Address 2">
</div>
<div class="form-group">
<label class="control-label">Zip Code</label>
<input type="text" class="form-control" name="zipcode" placeholder="Please enter your zip code">
</div>
<div class="form-group">
<div class="g-recaptcha text-center" data-sitekey="{{ env('CAPTCHA_SITE_KEY') }}"></div>
</div>
<div class="form-group">
<p>By clicking Register, you agree to our <a href="#">Terms of Use</a> and that you have read our <a href="#">Privacy Policy</a>.</p>
</div>
<div class="form-group">
<button type="submit" id="btn-register" class="btn btn-primary btn-block">Register</button>
</div>
</form>
</div>
</div>
<div class="row">
<div class="col-xs-12">
<hr />
<p class="text-center">Have already an account?</p>
<a href="{{ url('/auth/login') }}" type="submit" id="btn-login" class="btn btn-success btn-block">Login here</a>
</div>
</div>
</div>
</div>
<div class="form-group">
<label>First name</label>
<input type="text" class="form-control" name="firstname" placeholder="First name">
</div>
</div>
<div class="form-group">
<label>Last name</label>
<input type="text" class="form-control" name="lastname" placeholder="Last name">
</div>
<div class="form-group">
<label>Email Address</label>
<input type="email" class="form-control" name="email" value="{{ old('email') }}" placeholder="you@example.com">
</div>
<div class="form-group">
<label>Phone Number</label>
<input type="text" class="form-control" name="mobilenumber" placeholder="Phone Number">
</div>
<div class="form-group">
<label>Password</label>
<input type="password" class="form-control" name="password" id="password" required placeholder="Password">
</div>
<div class="form-group">
<label>Confirm Password</label>
<input type="password" class="form-control" name="password_confirmation" placeholder="Confirm Password" data-rule-equalTo="#password" required>
</div>
<div class="auth-section-title">Address Information</div>
<div class="form-group">
<label>Select Country</label>
<select name="countryCode" id="select_country" class="form-control" onchange="selectCountry(this)">
<option value="">Select Country</option>
<option value="US">United States</option>
<option value="CA">Canada</option>
</select>
</div>
<div class="form-group">
<label>State / Province</label>
<select class="form-control" name="state" id="lst-states">
<option value="">Select State</option>
</select>
</div>
<div class="form-group">
<label>City</label>
<select class="form-control" name="city" id="lst-cities">
<option value="">Select City</option>
</select>
</div>
<div class="form-group">
<label>Address 1</label>
<input type="text" class="form-control" name="address" placeholder="Address 1">
</div>
<div class="form-group">
<label>Address 2</label>
<input type="text" class="form-control" name="address2" placeholder="Address 2">
</div>
<div class="form-group">
<label>Zip Code</label>
<input type="text" class="form-control" name="zipcode" placeholder="Please enter your zip code">
</div>
<div class="form-group">
<div class="g-recaptcha text-center" data-sitekey="{{ env('CAPTCHA_SITE_KEY') }}"></div>
</div>
<p class="auth-terms">By clicking Register, you agree to our <a href="#">Terms of Use</a> and that you have read our <a href="#">Privacy Policy</a>.</p>
<div class="form-group">
<button type="submit" id="btn-register" class="btn-register-modern">Register</button>
</div>
</form>
<p class="auth-footer">Already have an account? <a href="{{ url('/auth/login') }}">Sign in</a></p>
</div>
</div>
@endsection

View File

@@ -3,60 +3,158 @@
@section('content')
<style>
.error{
color: red;
body {
background: #ffffff;
margin: 0;
}
.form-wrapper{
margin-top: 20%;
.navbar-custom {
margin-bottom: 0;
}
.auth-wrapper {
min-height: calc(100vh - 100px);
min-height: calc(100dvh - 100px);
display: flex;
align-items: center;
justify-content: center;
padding: 24px 16px;
box-sizing: border-box;
}
.auth-card {
width: 100%;
max-width: 380px;
background: #ffffff;
border: 1px solid #eceff3;
border-radius: 12px;
padding: 28px;
}
.auth-title {
font-size: 24px;
font-weight: 600;
line-height: 1.2;
margin: 0 0 8px;
color: #111827;
}
.auth-subtitle {
font-size: 14px;
margin: 0 0 20px;
color: #6b7280;
}
.auth-card .form-group {
margin-bottom: 14px;
}
.auth-card label {
display: block;
font-size: 13px;
font-weight: 500;
margin-bottom: 6px;
color: #374151;
}
.auth-card .form-control {
height: 42px;
border-radius: 8px;
border: 1px solid #d1d5db;
background: #ffffff;
font-size: 14px;
padding: 0 12px;
box-shadow: none;
transition: border-color 0.2s, box-shadow 0.2s;
}
.auth-card .form-control:focus {
border-color: #9ca3af;
box-shadow: 0 0 0 3px rgba(156, 163, 175, 0.2);
outline: none;
}
.btn-auth {
width: 100%;
height: 44px;
border: 0;
border-radius: 8px;
background: #111827;
color: #ffffff;
font-size: 14px;
font-weight: 600;
transition: opacity 0.2s;
}
.btn-auth:hover {
opacity: 0.92;
color: #ffffff;
}
.auth-footer {
margin-top: 16px;
text-align: center;
font-size: 13px;
color: #6b7280;
}
.auth-footer a {
color: #111827;
text-decoration: none;
font-weight: 500;
}
.auth-footer a:hover {
text-decoration: underline;
}
.auth-card .alert {
border-radius: 8px;
font-size: 13px;
}
.auth-card .alert ul {
padding-left: 18px;
margin-bottom: 0;
}
</style>
<div class="container">
<div class="col-md-4 col-md-offset-4">
<div class="form-wrapper">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="text-center">R E S E T &nbsp; P A S S W O R D</h3>
</div>
<div class="panel-body">
<div class="row">
<div class="col-xs-12">
@if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form role="form" method="POST" action="{{ url('/password/reset') }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<input type="hidden" name="token" value="{{ $token }}">
<div class="form-group">
<label class="control-label">Email Address</label>
<input type="email" class="form-control" name="email" value="{{ old('email') }}" title="Please enter your email address" placeholder="example@gmail.com">
<span class="help-block"></span>
</div>
<div class="form-group">
<label class="control-label">Password</label>
<input type="password" class="form-control" name="password" placeholder="Password">
<span class="help-block"></span>
</div>
<div class="form-group">
<label class="control-label">Confirm Password</label>
<input type="password" class="form-control" name="password_confirmation" placeholder="Confirm Password">
<span class="help-block"></span>
</div>
<button type="submit" class="btn btn-default btn-block">Reset Password</button>
</form>
<br><br>
</div>
</div>
</div>
<div class="auth-wrapper">
<div class="auth-card">
<h1 class="auth-title">Reset password</h1>
<p class="auth-subtitle">Set a new password for your account.</p>
@if (count($errors) > 0)
<div class="alert alert-danger">
<strong>Whoops!</strong> There were some problems with your input.<br><br>
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
</div>
@endif
<form role="form" method="POST" action="{{ url('/password/reset') }}">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
<input type="hidden" name="token" value="{{ $token }}">
<div class="form-group">
<label for="email">Email Address</label>
<input type="email" class="form-control" name="email" id="email" value="{{ old('email') }}" title="Please enter your email address" placeholder="you@example.com">
</div>
<div class="form-group">
<label for="password">Password</label>
<input type="password" class="form-control" name="password" id="password" placeholder="New password">
</div>
<div class="form-group">
<label for="password_confirmation">Confirm Password</label>
<input type="password" class="form-control" name="password_confirmation" id="password_confirmation" placeholder="Confirm password">
</div>
<button type="submit" class="btn-auth">Reset password</button>
</form>
<p class="auth-footer"><a href="{{ url('/auth/login') }}">Back to sign in</a></p>
</div>
</div>
@endsection