Compare commits
95 Commits
feat/page-
...
feature/la
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8b6a1cbbc8 | ||
|
|
59fc920498 | ||
|
|
56f2f19422 | ||
|
|
dca4b79831 | ||
|
|
2bea1ce79a | ||
|
|
ea3fba0cd6 | ||
|
|
02a6aa8d24 | ||
|
|
8b195fff55 | ||
|
|
0a796ef4e4 | ||
|
|
604b986e6e | ||
|
|
995d3d3ea0 | ||
|
|
87af27fe10 | ||
|
|
e6496b8ae0 | ||
|
|
6390717622 | ||
|
|
2dbcf3e2e6 | ||
|
|
0f24a817ce | ||
|
|
1b645de66e | ||
|
|
e1ac5bd2a5 | ||
|
|
e3c5b44174 | ||
|
|
9a6e3a63b2 | ||
|
|
0f12309175 | ||
|
|
e25228e25e | ||
|
|
633249438c | ||
|
|
fe02cfe2d4 | ||
|
|
854a39db30 | ||
|
|
94b55851b4 | ||
|
|
08571b2358 | ||
|
|
0abc30c7a0 | ||
|
|
b4d92bb14a | ||
|
|
0327471c92 | ||
|
|
72b800b22d | ||
|
|
54eb09f080 | ||
|
|
6d67430c33 | ||
|
|
cde3a8597c | ||
|
|
6bc7f0b3f0 | ||
|
|
1007e59b7d | ||
|
|
fe3b645352 | ||
|
|
bcaad2306a | ||
|
|
0e3c86a075 | ||
|
|
b78a0dd6d2 | ||
|
|
af0fae29f8 | ||
|
|
5d2ab7ffe2 | ||
|
|
0b3ef61086 | ||
|
|
18dd91e2a8 | ||
|
|
42acec513f | ||
|
|
71f5c53b53 | ||
|
|
1e1440edaf | ||
|
|
0b157efbbf | ||
|
|
d2f492212b | ||
|
|
73770a85be | ||
|
|
5f44fd781f | ||
|
|
a4cbfd63da | ||
|
|
bbf0fd286d | ||
|
|
57cc16abf2 | ||
|
|
2688f9cab9 | ||
|
|
54c685ce79 | ||
|
|
9aa01a4f31 | ||
|
|
386f04b32f | ||
|
|
fafa871214 | ||
|
|
9874fb4b60 | ||
|
|
cb89f32a64 | ||
|
|
21ec11e998 | ||
|
|
0ca7174e2f | ||
|
|
fabc31ac2b | ||
|
|
427fbf616d | ||
|
|
1b30d340b3 | ||
|
|
56f790c279 | ||
|
|
1aaf083a8a | ||
|
|
ef9a79539a | ||
|
|
1f621ad7a3 | ||
|
|
ba86aa3039 | ||
|
|
30a6351136 | ||
|
|
519ee7a567 | ||
|
|
c938d6b08b | ||
|
|
566e657060 | ||
|
|
88679773fe | ||
|
|
11bf31af39 | ||
|
|
16fcca5333 | ||
|
|
0952f460d5 | ||
|
|
0d26eefab9 | ||
|
|
b7875f0236 | ||
|
|
4def6bcf09 | ||
|
|
a15c237f53 | ||
|
|
4f91dd8370 | ||
|
|
d0eeafcd52 | ||
|
|
e7a4dce4e1 | ||
|
|
f355b3a9b5 | ||
|
|
5a7008b8d9 | ||
|
|
9dfd6f3884 | ||
|
|
b2985a5b32 | ||
|
|
4ccd15566d | ||
|
|
b76eb97d66 | ||
|
|
423a23abce | ||
|
|
7b979abad1 | ||
|
|
31cf5dbb3b |
26
.env.local
26
.env.local
@@ -1,26 +0,0 @@
|
|||||||
# Local Development Configuration
|
|
||||||
# Copy to .env.local and fill in your values.
|
|
||||||
|
|
||||||
# ── MinIO credentials ─────────────────────────────────────────────────────────
|
|
||||||
MINIO_KEY=your_minio_root_user
|
|
||||||
MINIO_SECRET=your_minio_root_password
|
|
||||||
|
|
||||||
# ── SSH tunnel (remote DB) ────────────────────────────────────────────────────
|
|
||||||
# Only needed when starting with --profile ssh-db.
|
|
||||||
# NOTE: no inline comments allowed after values — Docker reads them literally.
|
|
||||||
|
|
||||||
SSH_HOST=136.114.183.15
|
|
||||||
SSH_PORT=22
|
|
||||||
SSH_USER=webmaster
|
|
||||||
# Must be an absolute path — Docker Compose does NOT expand ~
|
|
||||||
SSH_KEY_PATH=/Users/webmaster/.ssh/id_ed25519_crew_webmaster
|
|
||||||
|
|
||||||
SSH_DB_REMOTE_HOST=127.0.0.1
|
|
||||||
SSH_DB_REMOTE_PORT=3306
|
|
||||||
|
|
||||||
# Tell the app to route DB traffic through the tunnel container:
|
|
||||||
DB_HOST=db-tunnel
|
|
||||||
DB_PORT=3306
|
|
||||||
DB_DATABASE=custom_designs
|
|
||||||
DB_USERNAME=root
|
|
||||||
DB_PASSWORD=VeryStrongRootPass2025!
|
|
||||||
@@ -1,26 +1,6 @@
|
|||||||
# Local Development Configuration
|
# Local Development MinIO Configuration
|
||||||
# Copy to .env.local and fill in your values.
|
# Copy to .env.local and update with your MinIO credentials
|
||||||
|
|
||||||
# ── MinIO credentials ─────────────────────────────────────────────────────────
|
# MinIO credentials (get from your production server)
|
||||||
MINIO_KEY=your_minio_root_user
|
MINIO_KEY=your_minio_root_user
|
||||||
MINIO_SECRET=your_minio_root_password
|
MINIO_SECRET=your_minio_root_password
|
||||||
|
|
||||||
# ── SSH tunnel (remote DB) ────────────────────────────────────────────────────
|
|
||||||
# Only needed when starting with --profile ssh-db.
|
|
||||||
# IMPORTANT: no inline comments after values — Docker Compose reads them literally.
|
|
||||||
# IMPORTANT: SSH_KEY_PATH must be an absolute path — ~ is NOT expanded by Docker Compose.
|
|
||||||
#
|
|
||||||
SSH_HOST=your.server.ip.or.hostname
|
|
||||||
SSH_PORT=22
|
|
||||||
SSH_USER=root
|
|
||||||
SSH_KEY_PATH=/absolute/path/to/your/private/key
|
|
||||||
#
|
|
||||||
SSH_DB_REMOTE_HOST=127.0.0.1 # DB host as seen from the SSH server
|
|
||||||
SSH_DB_REMOTE_PORT=3306 # DB port as seen from the SSH server
|
|
||||||
#
|
|
||||||
# Tell the app to route DB traffic through the tunnel container:
|
|
||||||
DB_HOST=db-tunnel
|
|
||||||
DB_PORT=3306
|
|
||||||
DB_DATABASE=your_remote_db_name
|
|
||||||
DB_USERNAME=your_remote_db_user
|
|
||||||
DB_PASSWORD=your_remote_db_password
|
|
||||||
|
|||||||
11
.gitignore
vendored
11
.gitignore
vendored
@@ -1,14 +1,3 @@
|
|||||||
/vendor
|
/vendor
|
||||||
/node_modules
|
/node_modules
|
||||||
.env
|
.env
|
||||||
|
|
||||||
# SSH Keys - Never commit private keys
|
|
||||||
*.ppk
|
|
||||||
*.pem
|
|
||||||
*.key
|
|
||||||
id_rsa
|
|
||||||
id_dsa
|
|
||||||
id_ecdsa
|
|
||||||
id_ed25519
|
|
||||||
_key/
|
|
||||||
.ssh/
|
|
||||||
|
|||||||
48
Dockerfile
48
Dockerfile
@@ -1,41 +1,30 @@
|
|||||||
# Use PHP 7.2 with Apache (mcrypt available via PECL, compatible with Laravel 5.0)
|
# Use PHP 7.4 with Apache for Laravel 6.x
|
||||||
FROM php:7.2-apache
|
FROM php:7.4-apache
|
||||||
|
|
||||||
# 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 '/buster-updates/d' /etc/apt/sources.list
|
|
||||||
|
|
||||||
# Install system dependencies
|
# Install system dependencies
|
||||||
RUN apt-get update && apt-get install -y --allow-unauthenticated \
|
RUN apt-get update && apt-get install -y \
|
||||||
git \
|
git \
|
||||||
curl \
|
curl \
|
||||||
libpng-dev \
|
libpng-dev \
|
||||||
|
libonig-dev \
|
||||||
libxml2-dev \
|
libxml2-dev \
|
||||||
libmcrypt-dev \
|
libzip-dev \
|
||||||
zip \
|
zip \
|
||||||
unzip \
|
unzip \
|
||||||
libfreetype6-dev \
|
libfreetype6-dev \
|
||||||
libjpeg62-turbo-dev \
|
libjpeg62-turbo-dev \
|
||||||
openssh-client \
|
openssh-client \
|
||||||
libzip-dev \
|
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
|
||||||
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
|
|
||||||
&& docker-php-ext-install -j$(nproc) gd
|
&& docker-php-ext-install -j$(nproc) gd
|
||||||
|
|
||||||
# Install mcrypt via PECL (removed from core in PHP 7.2)
|
# Install PHP extensions (mcrypt removed - not available in PHP 7.4)
|
||||||
RUN pecl install mcrypt-1.0.4 && docker-php-ext-enable mcrypt
|
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath zip
|
||||||
|
|
||||||
# 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
|
# Enable Apache mod_rewrite
|
||||||
RUN a2enmod rewrite
|
RUN a2enmod rewrite
|
||||||
|
|
||||||
# Install Composer 2.2 (LTS version supporting PHP 7.2+)
|
# Install Composer (version 2.x for Laravel 6.x)
|
||||||
COPY --from=composer:2.2 /usr/bin/composer /usr/bin/composer
|
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
|
||||||
|
|
||||||
# Set working directory
|
# Set working directory
|
||||||
WORKDIR /var/www/html
|
WORKDIR /var/www/html
|
||||||
@@ -58,16 +47,17 @@ RUN chown -R www-data:www-data /var/www/html \
|
|||||||
# Create .env file if it doesn't exist
|
# Create .env file if it doesn't exist
|
||||||
RUN if [ ! -f .env ]; then cp .env.example .env; fi
|
RUN if [ ! -f .env ]; then cp .env.example .env; fi
|
||||||
|
|
||||||
# Install PHP dependencies (--no-plugins skips kylekatarnls/update-helper which is Composer 1 only)
|
# Install PHP dependencies
|
||||||
RUN composer install --no-dev --no-interaction --prefer-dist --no-plugins
|
# Note: composer install will be run via docker-entrypoint.sh or manually
|
||||||
|
# to avoid build-time network timeouts
|
||||||
|
# RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader
|
||||||
|
|
||||||
# Generate application key
|
# Generate application key (will be done at runtime)
|
||||||
RUN php artisan key:generate || true
|
# RUN php artisan key:generate || true
|
||||||
|
|
||||||
# Run Laravel 5.0 optimization
|
# Cache Laravel configuration and routes (will be done at runtime)
|
||||||
RUN php artisan clear-compiled && php artisan optimize
|
# RUN php artisan config:cache || true
|
||||||
|
# RUN php artisan route:cache || true
|
||||||
# Note: PHP 7.2 is compatible with Laravel 5.0 and yakpro-po obfuscation
|
|
||||||
|
|
||||||
# Configure Apache DocumentRoot to point to Laravel's public directory
|
# Configure Apache DocumentRoot to point to Laravel's public directory
|
||||||
ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
|
ENV APACHE_DOCUMENT_ROOT=/var/www/html/public
|
||||||
|
|||||||
17
Makefile
17
Makefile
@@ -1,17 +0,0 @@
|
|||||||
COMPOSE_LOCAL = docker compose -f docker-compose.local.yml
|
|
||||||
|
|
||||||
# ── Local stack (local MariaDB) ───────────────────────────────────────────────
|
|
||||||
up:
|
|
||||||
$(COMPOSE_LOCAL) up --build
|
|
||||||
|
|
||||||
down:
|
|
||||||
$(COMPOSE_LOCAL) down
|
|
||||||
|
|
||||||
# ── Local stack with SSH tunnel to remote DB ──────────────────────────────────
|
|
||||||
up-ssh:
|
|
||||||
$(COMPOSE_LOCAL) --env-file .env.local --profile ssh-db up --build
|
|
||||||
|
|
||||||
down-ssh:
|
|
||||||
$(COMPOSE_LOCAL) --env-file .env.local --profile ssh-db down
|
|
||||||
|
|
||||||
.PHONY: up down up-ssh down-ssh
|
|
||||||
175
UPGRADE_NOTES.md
Normal file
175
UPGRADE_NOTES.md
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
# Laravel 5.0 → 11 Upgrade Progress
|
||||||
|
|
||||||
|
## Current State (Baseline)
|
||||||
|
- **Laravel Version**: 5.5.* (Phase 2 Complete)
|
||||||
|
- **PHP Version**: 7.0+ required (container ready)
|
||||||
|
- **Database**: MySQL via PDO
|
||||||
|
- **Branch**: feature/laravel-upgrade
|
||||||
|
|
||||||
|
## Completed Upgrades
|
||||||
|
|
||||||
|
### ✅ Phase 1: Laravel 5.0 → 5.1 (COMPLETE)
|
||||||
|
- ✅ Updated composer.json
|
||||||
|
- ✅ Basic route compatibility verified
|
||||||
|
- ✅ Middleware working
|
||||||
|
- ✅ Authentication flow tested
|
||||||
|
|
||||||
|
### ✅ Phase 2: Laravel 5.1 → 5.5 LTS (COMPLETE)
|
||||||
|
- ✅ Updated composer.json (Laravel 5.5.*, Guzzle ^6.3, PHPUnit ~6.0)
|
||||||
|
- ✅ Created `routes/web.php` with all web routes
|
||||||
|
- ✅ Created `routes/api.php` with API routes (moved from /api prefix)
|
||||||
|
- ✅ Expanded `Route::controllers()` to explicit route definitions
|
||||||
|
- ✅ Updated RouteServiceProvider to use mapWebRoutes() and mapApiRoutes()
|
||||||
|
- ✅ Updated Exception Handler with Laravel 5.5 patterns
|
||||||
|
- ⚠️ **Requires PHP 7.0+** - Local test needs Docker container
|
||||||
|
|
||||||
|
## Dependencies Audit
|
||||||
|
|
||||||
|
### Core Dependencies
|
||||||
|
- ✅ `laravel/framework`: 5.0.* → Need to upgrade incrementally
|
||||||
|
- ✅ `webpatser/laravel-uuid`: ^2.0 → Compatible through Laravel 8
|
||||||
|
- ⚠️ `netshell/paypal`: dev-master → May need replacement (outdated)
|
||||||
|
- ⚠️ `guzzlehttp/guzzle`: ~5.0 → Need to upgrade to ^7.0
|
||||||
|
- ✅ `google/recaptcha`: ~1.1 → Still maintained
|
||||||
|
- ⚠️ `spatie/laravel-analytics`: ^1.4 → Need to upgrade to ^5.0
|
||||||
|
- ✅ `league/flysystem-sftp`: ^1.0 → Upgrade to ^3.0 for Laravel 9+
|
||||||
|
- ✅ `aws/aws-sdk-php`: ~3.0 → Compatible
|
||||||
|
|
||||||
|
### Custom Middleware Found
|
||||||
|
- `CheckTeamStorePassword` - Custom team store authentication
|
||||||
|
- `IsAdmin` - Admin role check
|
||||||
|
- `IsUser` - Normal user role check
|
||||||
|
- `isAuthorized` - Custom authorization
|
||||||
|
- `Cors` - CORS handling
|
||||||
|
|
||||||
|
### Custom Code Patterns Detected
|
||||||
|
- ✅ `app/helpers.php` - Auto-loaded helper functions (minio_url, minio_image_url)
|
||||||
|
- ✅ Routes in `app/Http/routes.php` (Laravel 5.0 pattern)
|
||||||
|
- ⚠️ Controllers echoing HTML directly (needs refactoring)
|
||||||
|
- ⚠️ Boolean stored as strings ("TRUE"/"FALSE" in database)
|
||||||
|
|
||||||
|
## Upgrade Path
|
||||||
|
|
||||||
|
### Phase 1: Laravel 5.0 → 5.1 (Week 1)
|
||||||
|
- ✅ Update composer.json
|
||||||
|
- ✅ Test route compatibility
|
||||||
|
- ✅ Verify middleware still works
|
||||||
|
- ✅ Test authentication flow
|
||||||
|
|
||||||
|
### Phase 2: Laravel 5.1 → 5.5 LTS (Week 2)
|
||||||
|
- ✅ Move routes to `routes/web.php`
|
||||||
|
- ✅ Update exception handler
|
||||||
|
- ⏭️ Test all database queries (needs Docker)
|
||||||
|
- ⏭️ Update validation rules (needs testing)
|
||||||
|
|
||||||
|
### Phase 3: PHP 7.0 → 7.4 & Laravel 5.5 → 6.x (Week 3)
|
||||||
|
- [ ] Update Dockerfile to PHP 7.4
|
||||||
|
- [ ] Remove mcrypt dependencies (if any encrypted data)
|
||||||
|
- [ ] Add string/array helpers package
|
||||||
|
- [ ] Test file uploads
|
||||||
|
|
||||||
|
### Phase 4: Laravel 6.x → 8.x (Week 4)
|
||||||
|
- [ ] Update factory syntax
|
||||||
|
- [ ] Test rate limiting
|
||||||
|
- [ ] Verify queue jobs
|
||||||
|
|
||||||
|
### Phase 5: PHP 8.0 & Laravel 8.x → 9.x (Week 5)
|
||||||
|
- [ ] Update Dockerfile to PHP 8.0
|
||||||
|
- [ ] Update Flysystem to v3 (affects MinIO config)
|
||||||
|
- [ ] Test query builder changes
|
||||||
|
|
||||||
|
### Phase 6: Laravel 9.x → 10.x (Week 6)
|
||||||
|
- [ ] Update to PHP 8.1
|
||||||
|
- [ ] Add type declarations where needed
|
||||||
|
- [ ] Test invokable validation rules
|
||||||
|
|
||||||
|
### Phase 7: Laravel 10.x → 11.x (Week 7)
|
||||||
|
- [ ] Update to PHP 8.2
|
||||||
|
- [ ] Test new application skeleton
|
||||||
|
- [ ] Verify all functionality
|
||||||
|
|
||||||
|
## How to Test the Upgrade
|
||||||
|
|
||||||
|
### Quick Test (Docker Required)
|
||||||
|
```bash
|
||||||
|
# Run the automated test script
|
||||||
|
./test-laravel-5.5.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Manual Test
|
||||||
|
```bash
|
||||||
|
# Build and start container
|
||||||
|
docker compose -f docker-compose.local.yml up -d --build
|
||||||
|
|
||||||
|
# Check Laravel version
|
||||||
|
docker compose -f docker-compose.local.yml exec app php artisan --version
|
||||||
|
|
||||||
|
# List all routes (verify new structure)
|
||||||
|
docker compose -f docker-compose.local.yml exec app php artisan route:list
|
||||||
|
|
||||||
|
# Access the application
|
||||||
|
# http://localhost:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
### Verify Key Changes
|
||||||
|
1. **Routes**: Check `routes/web.php` and `routes/api.php` exist
|
||||||
|
2. **API Prefix**: API routes now automatically prefixed with `/api`
|
||||||
|
3. **Authentication**: Login routes now use named routes (`login`, `register`)
|
||||||
|
4. **Middleware**: Web middleware auto-applied to routes/web.php
|
||||||
|
|
||||||
|
## Breaking Changes to Watch
|
||||||
|
|
||||||
|
### Database
|
||||||
|
- Boolean fields stored as strings ("TRUE"/"FALSE") - Need migration
|
||||||
|
- Direct DB facade usage throughout codebase
|
||||||
|
|
||||||
|
### Routes
|
||||||
|
- Controller array syntax in routes will be removed
|
||||||
|
- Need to update to standard controller@method or invokable
|
||||||
|
|
||||||
|
### Middleware
|
||||||
|
- Middleware signature changes in later versions
|
||||||
|
- CSRF token handling updates
|
||||||
|
|
||||||
|
### Views
|
||||||
|
- Blade syntax mostly compatible
|
||||||
|
- PHP in controllers (<?php echo) needs refactoring
|
||||||
|
|
||||||
|
### External Services
|
||||||
|
- PayPal integration (netshell/paypal) may need complete rewrite
|
||||||
|
- Google Analytics package needs major upgrade
|
||||||
|
- Screenshot Node.js service should remain compatible
|
||||||
|
|
||||||
|
## Rollback Plan
|
||||||
|
- Keep master branch untouched
|
||||||
|
- Tag current state: `git tag v5.0-baseline`
|
||||||
|
- Can revert entire branch if needed
|
||||||
|
- Parallel testing environment on port 8090
|
||||||
|
|
||||||
|
## Testing Checklist (After Each Upgrade)
|
||||||
|
- [ ] Homepage loads
|
||||||
|
- [ ] User registration/login works
|
||||||
|
- [ ] Sports category pages render
|
||||||
|
- [ ] Designer tool loads
|
||||||
|
- [ ] Pattern/clipart selection works
|
||||||
|
- [ ] Cart functionality
|
||||||
|
- [ ] Team store pages
|
||||||
|
- [ ] PayPal checkout flow
|
||||||
|
- [ ] Admin panel access
|
||||||
|
- [ ] Image serving from MinIO
|
||||||
|
- [ ] Screenshot generation service
|
||||||
|
- [ ] File uploads work
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
- Current Composer version 1.x - may need to use `composer self-update --1` during transition
|
||||||
|
- AWS SDK already at 3.0, compatible with all Laravel versions
|
||||||
|
- Helper functions (minio_url) should remain compatible
|
||||||
|
- Fabric.js designer tool is front-end only, won't be affected
|
||||||
|
|
||||||
|
## Completed Steps
|
||||||
|
1. ✅ Created feature branch (`feature/laravel-upgrade`)
|
||||||
|
2. ✅ Documented current state and dependencies
|
||||||
|
3. ✅ Created baseline tag (`v5.0-baseline`) for rollback
|
||||||
|
4. ✅ Updated composer.json for Laravel 5.1
|
||||||
|
5. ✅ Updated Guzzle 5.0 → 6.0 (required for Laravel 5.1)
|
||||||
|
6. ⏳ Next: Build container and run composer update
|
||||||
@@ -1,55 +1,64 @@
|
|||||||
<?php namespace App\Exceptions;
|
<?php
|
||||||
|
|
||||||
|
namespace App\Exceptions;
|
||||||
|
|
||||||
use Exception;
|
use Exception;
|
||||||
|
use Illuminate\Auth\AuthenticationException;
|
||||||
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
|
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
|
||||||
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
|
||||||
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
|
|
||||||
|
|
||||||
class Handler extends ExceptionHandler {
|
class Handler extends ExceptionHandler
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* A list of the exception types that are not reported.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $dontReport = [
|
||||||
|
\Illuminate\Auth\AuthenticationException::class,
|
||||||
|
\Illuminate\Auth\Access\AuthorizationException::class,
|
||||||
|
\Symfony\Component\HttpKernel\Exception\HttpException::class,
|
||||||
|
\Illuminate\Database\Eloquent\ModelNotFoundException::class,
|
||||||
|
\Illuminate\Session\TokenMismatchException::class,
|
||||||
|
\Illuminate\Validation\ValidationException::class,
|
||||||
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A list of the exception types that should not be reported.
|
* Report or log an exception.
|
||||||
*
|
*
|
||||||
* @var array
|
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
|
||||||
*/
|
*
|
||||||
protected $dontReport = [
|
* @param \Exception $exception
|
||||||
'Symfony\Component\HttpKernel\Exception\HttpException'
|
* @return void
|
||||||
];
|
*/
|
||||||
|
public function report(Exception $exception)
|
||||||
|
{
|
||||||
|
parent::report($exception);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Report or log an exception.
|
* Render an exception into an HTTP response.
|
||||||
*
|
*
|
||||||
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
|
* @param \Illuminate\Http\Request $request
|
||||||
*
|
* @param \Exception $exception
|
||||||
* @param \Exception $e
|
* @return \Illuminate\Http\Response
|
||||||
* @return void
|
*/
|
||||||
*/
|
public function render($request, Exception $exception)
|
||||||
public function report($e)
|
{
|
||||||
{
|
return parent::render($request, $exception);
|
||||||
if (!$e instanceof Exception) {
|
}
|
||||||
$e = new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine());
|
|
||||||
}
|
|
||||||
return parent::report($e);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Render an exception into an HTTP response.
|
|
||||||
*
|
|
||||||
* @param \Illuminate\Http\Request $request
|
|
||||||
* @param mixed $e
|
|
||||||
* @return \Illuminate\Http\Response
|
|
||||||
*/
|
|
||||||
public function render($request, $e)
|
|
||||||
{
|
|
||||||
if (!$e instanceof Exception) {
|
|
||||||
$e = new \ErrorException($e->getMessage(), $e->getCode(), E_ERROR, $e->getFile(), $e->getLine());
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($e instanceof NotFoundHttpException || $e instanceof ModelNotFoundException) {
|
|
||||||
return response()->view('errors.404', [], 404);
|
|
||||||
}
|
|
||||||
|
|
||||||
return parent::render($request, $e);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert an authentication exception into an unauthenticated response.
|
||||||
|
*
|
||||||
|
* @param \Illuminate\Http\Request $request
|
||||||
|
* @param \Illuminate\Auth\AuthenticationException $exception
|
||||||
|
* @return \Illuminate\Http\Response
|
||||||
|
*/
|
||||||
|
protected function unauthenticated($request, AuthenticationException $exception)
|
||||||
|
{
|
||||||
|
return $request->expectsJson()
|
||||||
|
? response()->json(['message' => 'Unauthenticated.'], 401)
|
||||||
|
: redirect()->guest(route('login'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,40 +1,32 @@
|
|||||||
<?php namespace App\Http\Controllers\Auth;
|
<?php namespace App\Http\Controllers\Auth;
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use Illuminate\Contracts\Auth\Guard;
|
use Illuminate\Foundation\Auth\AuthenticatesUsers;
|
||||||
use Illuminate\Contracts\Auth\Registrar;
|
|
||||||
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
|
|
||||||
|
|
||||||
class AuthController extends Controller {
|
class AuthController extends Controller {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Registration & Login Controller
|
| Login Controller
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
|
||||||
| This controller handles the registration of new users, as well as the
|
| This controller handles authenticating users for the application.
|
||||||
| authentication of existing users. By default, this controller uses
|
|
||||||
| a simple trait to add these behaviors. Why don't you explore it?
|
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use AuthenticatesAndRegistersUsers;
|
use AuthenticatesUsers;
|
||||||
|
|
||||||
protected $redirectTo = '/';
|
protected $redirectTo = '/';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new authentication controller instance.
|
* Create a new authentication controller instance.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Contracts\Auth\Guard $auth
|
|
||||||
* @param \Illuminate\Contracts\Auth\Registrar $registrar
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public function __construct(Guard $auth, Registrar $registrar)
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->auth = $auth;
|
$this->middleware('guest')->except('logout');
|
||||||
$this->registrar = $registrar;
|
|
||||||
|
|
||||||
$this->middleware('guest', ['except' => 'getLogout']);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
68
app/Http/Controllers/Auth/RegisterController.php
Normal file
68
app/Http/Controllers/Auth/RegisterController.php
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
<?php namespace App\Http\Controllers\Auth;
|
||||||
|
|
||||||
|
use App\User;
|
||||||
|
use App\Http\Controllers\Controller;
|
||||||
|
use Illuminate\Support\Facades\Validator;
|
||||||
|
use Illuminate\Foundation\Auth\RegistersUsers;
|
||||||
|
|
||||||
|
class RegisterController extends Controller
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Register Controller
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| This controller handles the registration of new users as well as their
|
||||||
|
| validation and creation.
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
use RegistersUsers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Where to redirect users after registration.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $redirectTo = '/';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new controller instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
$this->middleware('guest');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a validator for an incoming registration request.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @return \Illuminate\Contracts\Validation\Validator
|
||||||
|
*/
|
||||||
|
protected function validator(array $data)
|
||||||
|
{
|
||||||
|
return Validator::make($data, [
|
||||||
|
'name' => 'required|string|max:255',
|
||||||
|
'email' => 'required|string|email|max:255|unique:users',
|
||||||
|
'password' => 'required|string|min:6|confirmed',
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new user instance after a valid registration.
|
||||||
|
*
|
||||||
|
* @param array $data
|
||||||
|
* @return \App\User
|
||||||
|
*/
|
||||||
|
protected function create(array $data)
|
||||||
|
{
|
||||||
|
return User::create([
|
||||||
|
'name' => $data['name'],
|
||||||
|
'email' => $data['email'],
|
||||||
|
'password' => bcrypt($data['password']),
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +1,12 @@
|
|||||||
<?php namespace App\Http\Controllers;
|
<?php namespace App\Http\Controllers;
|
||||||
|
|
||||||
use Illuminate\Foundation\Bus\DispatchesCommands;
|
|
||||||
use Illuminate\Routing\Controller as BaseController;
|
use Illuminate\Routing\Controller as BaseController;
|
||||||
|
use Illuminate\Foundation\Bus\DispatchesJobs;
|
||||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||||
|
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||||
|
|
||||||
abstract class Controller extends BaseController {
|
abstract class Controller extends BaseController {
|
||||||
|
|
||||||
use DispatchesCommands, ValidatesRequests;
|
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ class MainController extends Controller {
|
|||||||
$categoryids = array();
|
$categoryids = array();
|
||||||
|
|
||||||
foreach($data as $row){
|
foreach($data as $row){
|
||||||
$categoryids[] = $row->Category;
|
$categoryids[] = (string)$row->Category;
|
||||||
}
|
}
|
||||||
|
|
||||||
$array_sports = $m->selectSportsByURL($url);
|
$array_sports = $m->selectSportsByURL($url);
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ use App\Http\Controllers\Controller;
|
|||||||
|
|
||||||
use Illuminate\Support\Facades\Request1;
|
use Illuminate\Support\Facades\Request1;
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Storage;
|
|
||||||
use App\Models\PrintPatternModel;
|
use App\Models\PrintPatternModel;
|
||||||
use App\Models\SizesModel;
|
use App\Models\SizesModel;
|
||||||
|
|
||||||
@@ -47,7 +46,7 @@ class PrintPatternController extends Controller {
|
|||||||
$NewImageName = $templateSize.'.'.$imageExt;
|
$NewImageName = $templateSize.'.'.$imageExt;
|
||||||
|
|
||||||
|
|
||||||
$thumbnail = "uploads/images/uniform-templates/".$templatecode."/".$templateType."/SIZES/" . $NewImageName;
|
$thumbnail = "uniform-templates/".$templatecode."/".$templateType."/SIZES/" . $NewImageName;
|
||||||
|
|
||||||
$data = array(
|
$data = array(
|
||||||
'TemplateCode' => $templatecode,
|
'TemplateCode' => $templatecode,
|
||||||
@@ -59,7 +58,9 @@ class PrintPatternController extends Controller {
|
|||||||
$i = $m->insertPrintPattern($data);
|
$i = $m->insertPrintPattern($data);
|
||||||
//var_dump($data);
|
//var_dump($data);
|
||||||
if($i){
|
if($i){
|
||||||
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templatecode.'/'.$templateType.'/SIZES/'.$NewImageName, file_get_contents($request->file('preview_print_template')->getRealPath()));
|
$r = $request->file('preview_print_template')->move(
|
||||||
|
base_path() . "/public/images/uniform-templates/".$templatecode."/".$templateType."/SIZES/", $NewImageName
|
||||||
|
);
|
||||||
echo '<div class="alert alert-success alert-dismissible">
|
echo '<div class="alert alert-success alert-dismissible">
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||||
<h4><i class="icon fa fa-check"></i> Success!</h4>
|
<h4><i class="icon fa fa-check"></i> Success!</h4>
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ use App\Http\Requests;
|
|||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
|
|
||||||
use Illuminate\Http\Request;
|
use Illuminate\Http\Request;
|
||||||
use Illuminate\Support\Facades\Storage;
|
|
||||||
use App\Models\TemplatesModel;
|
use App\Models\TemplatesModel;
|
||||||
use App\Models\SportsModel;
|
use App\Models\SportsModel;
|
||||||
use App\Models\PrintPatternModel;
|
use App\Models\PrintPatternModel;
|
||||||
@@ -49,7 +48,7 @@ class TemplatesController extends Controller {
|
|||||||
<h3><?php echo $row->TemplateName ?></h3>
|
<h3><?php echo $row->TemplateName ?></h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="sports-border">
|
<div class="sports-border">
|
||||||
<a href=""><img src="<?php echo minio_url($row->Thumbnail) ?>" alt="Sports" height="400px;" class="img img-responsive product-center" /></a>
|
<a href=""><img src="<?php echo url('public') . "/" . $row->Thumbnail ?>" alt="Sports" height="400px;" class="img img-responsive product-center" /></a>
|
||||||
<div class="sport-edit-btn">
|
<div class="sport-edit-btn">
|
||||||
<a href="<?php echo url('admin/templates') . "/edit/" . $row->TemplateCode . "/" ?>" class="btn btn-primary btn-block"><i class="fa fa-edit"></i> Edit</a>
|
<a href="<?php echo url('admin/templates') . "/edit/" . $row->TemplateCode . "/" ?>" class="btn btn-primary btn-block"><i class="fa fa-edit"></i> Edit</a>
|
||||||
</div>
|
</div>
|
||||||
@@ -130,13 +129,15 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
|
|
||||||
if($i){
|
if($i){
|
||||||
Storage::disk('minio')->put('images/templates/thumbnail/' . $NewImageName, file_get_contents($request->file('tempateImage')->getRealPath()));
|
$request->file('tempateImage')->move(
|
||||||
|
base_path() . '/public/images/templates/thumbnail', $NewImageName
|
||||||
|
);
|
||||||
|
|
||||||
//for front jersey
|
//for front jersey
|
||||||
if(!empty($request->file('svgJerseyFront')->getClientOriginalName())){
|
if(!empty($request->file('svgJerseyFront')->getClientOriginalName())){
|
||||||
|
|
||||||
$svgName = $request->file('svgJerseyFront')->getClientOriginalName();
|
$svgName = $request->file('svgJerseyFront')->getClientOriginalName();
|
||||||
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
//var_dump($svgThumbnail);
|
//var_dump($svgThumbnail);
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'TemplateCode' => $templateCode,
|
'TemplateCode' => $templateCode,
|
||||||
@@ -148,14 +149,16 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->insertTempaltePaths($Templatedata);
|
$i = $m->insertTempaltePaths($Templatedata);
|
||||||
if($i){
|
if($i){
|
||||||
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgJerseyFront')->getRealPath()));
|
$request->file('svgJerseyFront')->move(
|
||||||
|
base_path() . '/public/images/uniform-templates/'.$templateCode. '/DISPLAY' , $svgName
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!empty($request->file('svgJerseyBack')->getClientOriginalName())){
|
if(!empty($request->file('svgJerseyBack')->getClientOriginalName())){
|
||||||
|
|
||||||
$svgName = $request->file('svgJerseyBack')->getClientOriginalName();
|
$svgName = $request->file('svgJerseyBack')->getClientOriginalName();
|
||||||
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'TemplateCode' => $templateCode,
|
'TemplateCode' => $templateCode,
|
||||||
@@ -167,14 +170,16 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->insertTempaltePaths($Templatedata);
|
$i = $m->insertTempaltePaths($Templatedata);
|
||||||
if($i){
|
if($i){
|
||||||
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgJerseyBack')->getRealPath()));
|
$request->file('svgJerseyBack')->move(
|
||||||
|
base_path() . '/public/images/uniform-templates/'.$templateCode. '/DISPLAY' , $svgName
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!empty($request->file('svgShortRight')->getClientOriginalName())){
|
if(!empty($request->file('svgShortRight')->getClientOriginalName())){
|
||||||
|
|
||||||
$svgName = $request->file('svgShortRight')->getClientOriginalName();
|
$svgName = $request->file('svgShortRight')->getClientOriginalName();
|
||||||
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'TemplateCode' => $templateCode,
|
'TemplateCode' => $templateCode,
|
||||||
@@ -186,14 +191,16 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->insertTempaltePaths($Templatedata);
|
$i = $m->insertTempaltePaths($Templatedata);
|
||||||
if($i){
|
if($i){
|
||||||
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgShortRight')->getRealPath()));
|
$request->file('svgShortRight')->move(
|
||||||
|
base_path() . '/public/images/uniform-templates/'.$templateCode. '/DISPLAY' , $svgName
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!empty($request->file('svgShortLeft')->getClientOriginalName())){
|
if(!empty($request->file('svgShortLeft')->getClientOriginalName())){
|
||||||
|
|
||||||
$svgName = $request->file('svgShortLeft')->getClientOriginalName();
|
$svgName = $request->file('svgShortLeft')->getClientOriginalName();
|
||||||
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'TemplateCode' => $templateCode,
|
'TemplateCode' => $templateCode,
|
||||||
@@ -205,7 +212,9 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->insertTempaltePaths($Templatedata);
|
$i = $m->insertTempaltePaths($Templatedata);
|
||||||
if($i){
|
if($i){
|
||||||
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgShortLeft')->getRealPath()));
|
$request->file('svgShortLeft')->move(
|
||||||
|
base_path() . '/public/images/uniform-templates/'.$templateCode. '/DISPLAY' , $svgName
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -261,7 +270,9 @@ class TemplatesController extends Controller {
|
|||||||
'PatternId' => $getSkins
|
'PatternId' => $getSkins
|
||||||
);
|
);
|
||||||
|
|
||||||
Storage::disk('minio')->put('images/templates/thumbnail/' . $NewImageName, file_get_contents($request->file('tempateImage')->getRealPath()));
|
$request->file('tempateImage')->move(
|
||||||
|
base_path() . '/public/images/templates/thumbnail', $NewImageName
|
||||||
|
);
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
|
|
||||||
@@ -287,7 +298,7 @@ class TemplatesController extends Controller {
|
|||||||
//echo 'meron jerset front';
|
//echo 'meron jerset front';
|
||||||
|
|
||||||
$svgName = $request->file('svgJerseyFront')->getClientOriginalName();
|
$svgName = $request->file('svgJerseyFront')->getClientOriginalName();
|
||||||
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'Type' => 'Jersey',
|
'Type' => 'Jersey',
|
||||||
@@ -297,7 +308,9 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgJerseyFront']);
|
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgJerseyFront']);
|
||||||
if($i){
|
if($i){
|
||||||
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgJerseyFront')->getRealPath()));
|
$request->file('svgJerseyFront')->move(
|
||||||
|
base_path() . '/public/images/uniform-templates/'.$templateCode. '/DISPLAY' , $svgName
|
||||||
|
);
|
||||||
//echo 'image move success';
|
//echo 'image move success';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -305,7 +318,7 @@ class TemplatesController extends Controller {
|
|||||||
if (array_key_exists('svgJerseyBack', $post)) {
|
if (array_key_exists('svgJerseyBack', $post)) {
|
||||||
|
|
||||||
$svgName = $request->file('svgJerseyBack')->getClientOriginalName();
|
$svgName = $request->file('svgJerseyBack')->getClientOriginalName();
|
||||||
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'Type' => 'Jersey',
|
'Type' => 'Jersey',
|
||||||
@@ -314,13 +327,16 @@ class TemplatesController extends Controller {
|
|||||||
);
|
);
|
||||||
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgJerseyBack']);
|
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgJerseyBack']);
|
||||||
if($i){
|
if($i){
|
||||||
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgJerseyBack')->getRealPath()));
|
|
||||||
|
$request->file('svgJerseyBack')->move(
|
||||||
|
base_path() . '/public/images/uniform-templates/'.$templateCode. '/DISPLAY' , $svgName
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (array_key_exists('svgShortRight', $post)) {
|
if (array_key_exists('svgShortRight', $post)) {
|
||||||
$svgName = $request->file('svgShortRight')->getClientOriginalName();
|
$svgName = $request->file('svgShortRight')->getClientOriginalName();
|
||||||
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'Type' => 'Shorts',
|
'Type' => 'Shorts',
|
||||||
@@ -330,13 +346,15 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgShortRight']);
|
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgShortRight']);
|
||||||
if($i){
|
if($i){
|
||||||
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgShortRight')->getRealPath()));
|
$request->file('svgShortRight')->move(
|
||||||
|
base_path() . '/public/images/uniform-templates/'.$templateCode. '/DISPLAY' , $svgName
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (array_key_exists('svgShortLeft', $post)) {
|
if (array_key_exists('svgShortLeft', $post)) {
|
||||||
$svgName = $request->file('svgShortLeft')->getClientOriginalName();
|
$svgName = $request->file('svgShortLeft')->getClientOriginalName();
|
||||||
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'Type' => 'Shorts',
|
'Type' => 'Shorts',
|
||||||
@@ -346,7 +364,9 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgShortLeft']);
|
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgShortLeft']);
|
||||||
if($i){
|
if($i){
|
||||||
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgShortLeft')->getRealPath()));
|
$request->file('svgShortLeft')->move(
|
||||||
|
base_path() . '/public/images/uniform-templates/'.$templateCode. '/DISPLAY' , $svgName
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,46 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Http\Controllers;
|
|
||||||
|
|
||||||
use Illuminate\Http\Request;
|
|
||||||
use Illuminate\Support\Facades\Mail;
|
|
||||||
|
|
||||||
class TestEmailController extends Controller
|
|
||||||
{
|
|
||||||
|
|
||||||
public function show()
|
|
||||||
{
|
|
||||||
return view('test-email', ['token' => csrf_token()]);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function send(Request $request)
|
|
||||||
{
|
|
||||||
$this->validate($request, [
|
|
||||||
'recipient' => 'required|email',
|
|
||||||
]);
|
|
||||||
|
|
||||||
$recipient = $request->input('recipient');
|
|
||||||
$config = [
|
|
||||||
'driver' => config('mail.driver'),
|
|
||||||
'host' => config('mail.host'),
|
|
||||||
'port' => config('mail.port'),
|
|
||||||
'username' => config('mail.username'),
|
|
||||||
'encryption' => config('mail.encryption'),
|
|
||||||
];
|
|
||||||
|
|
||||||
try {
|
|
||||||
Mail::send('emails.test', ['config' => $config, 'recipient' => $recipient], function ($message) use ($recipient) {
|
|
||||||
$message->from('no-reply@crewsportswear.com', 'CREW Sportswear');
|
|
||||||
$message->to($recipient)->subject('CREW Sportswear — Test Email');
|
|
||||||
});
|
|
||||||
|
|
||||||
$status = 'success';
|
|
||||||
$message = 'Test email sent successfully to ' . $recipient . '.';
|
|
||||||
} catch (\Throwable $e) {
|
|
||||||
$status = 'danger';
|
|
||||||
$message = 'Failed to send email: ' . $e->getMessage();
|
|
||||||
}
|
|
||||||
|
|
||||||
return redirect()->back()->with('status', $status)->with('message', $message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -591,7 +591,7 @@ class TeamStoreController extends Controller
|
|||||||
//var_dump($items_group);
|
//var_dump($items_group);
|
||||||
$grouped_item = $m->selectTeamStoreGroupByCartKey($cartKey);
|
$grouped_item = $m->selectTeamStoreGroupByCartKey($cartKey);
|
||||||
if ($grouped_item) {
|
if ($grouped_item) {
|
||||||
$defId = $grouped_item[0]->StoreId;
|
$defId = $grouped_item->StoreId;
|
||||||
} else {
|
} else {
|
||||||
$defId = 0;
|
$defId = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -761,7 +761,10 @@ class UserController extends Controller
|
|||||||
);
|
);
|
||||||
|
|
||||||
$u = $UserModel->insertNewProductThumbnails($thumbs);
|
$u = $UserModel->insertNewProductThumbnails($thumbs);
|
||||||
Storage::disk('minio')->put('images/' . $thumbnail, file_get_contents($request->file('imgupload')[$i]->getRealPath()));
|
// 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);
|
||||||
}
|
}
|
||||||
|
|
||||||
$prod_code = array('ProductCode' => $getYear . '-' . str_pad($id, 10, '0', STR_PAD_LEFT));
|
$prod_code = array('ProductCode' => $getYear . '-' . str_pad($id, 10, '0', STR_PAD_LEFT));
|
||||||
@@ -805,7 +808,9 @@ class UserController extends Controller
|
|||||||
);
|
);
|
||||||
|
|
||||||
$u = $UserModel->insertNewProductThumbnails($thumbs);
|
$u = $UserModel->insertNewProductThumbnails($thumbs);
|
||||||
Storage::disk('minio')->put('images/' . $thumbnail, file_get_contents($request->file('upload_images')[$i]->getRealPath()));
|
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+'));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -821,8 +826,9 @@ class UserController extends Controller
|
|||||||
$id = $request->thumb_id;
|
$id = $request->thumb_id;
|
||||||
$UserModel = new UserModel;
|
$UserModel = new UserModel;
|
||||||
|
|
||||||
if (Storage::disk('minio')->exists('images/' . $file)) {
|
$storagePath = Storage::disk('sftp')->getDriver()->getAdapter()->getPathPrefix();
|
||||||
Storage::disk('minio')->delete('images/' . $file);
|
if (file_exists($storagePath . $file)) {
|
||||||
|
unlink($storagePath . $file);
|
||||||
}
|
}
|
||||||
|
|
||||||
$i = $UserModel->deleteImageThumb('Id', $id);
|
$i = $UserModel->deleteImageThumb('Id', $id);
|
||||||
@@ -967,11 +973,11 @@ class UserController extends Controller
|
|||||||
// var_dump($res);
|
// var_dump($res);
|
||||||
// if($res){
|
// if($res){
|
||||||
if ($request->file('store_logo') != null) {
|
if ($request->file('store_logo') != null) {
|
||||||
Storage::disk('minio')->put('uploads/images/teamstore/' . $orig_store_url . '/' . $store_logo_name, file_get_contents($request->file('store_logo')->getRealPath()));
|
Storage::disk('uploads')->put('/teamstore/' . $orig_store_url . '/' . $store_logo_name, fopen($request->file('store_logo'), 'r+'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($request->file('store_banner') != null) {
|
if ($request->file('store_banner') != null) {
|
||||||
Storage::disk('minio')->put('uploads/images/teamstore/' . $orig_store_url . '/' . $store_banner_name, file_get_contents($request->file('store_banner')->getRealPath()));
|
Storage::disk('uploads')->put('/teamstore/' . $orig_store_url . '/' . $store_banner_name, fopen($request->file('store_banner'), 'r+'));
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json(array(
|
return response()->json(array(
|
||||||
|
|||||||
@@ -10,12 +10,31 @@ class Kernel extends HttpKernel {
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $middleware = [
|
protected $middleware = [
|
||||||
'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
|
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
|
||||||
'Illuminate\Cookie\Middleware\EncryptCookies',
|
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
|
||||||
'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
|
\App\Http\Middleware\TrimStrings::class,
|
||||||
'Illuminate\Session\Middleware\StartSession',
|
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
|
||||||
'Illuminate\View\Middleware\ShareErrorsFromSession',
|
];
|
||||||
'App\Http\Middleware\VerifyCsrfToken',
|
|
||||||
|
/**
|
||||||
|
* The application's route middleware groups.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $middlewareGroups = [
|
||||||
|
'web' => [
|
||||||
|
\Illuminate\Cookie\Middleware\EncryptCookies::class,
|
||||||
|
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
|
||||||
|
\Illuminate\Session\Middleware\StartSession::class,
|
||||||
|
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
|
||||||
|
\App\Http\Middleware\VerifyCsrfToken::class,
|
||||||
|
\Illuminate\Routing\Middleware\SubstituteBindings::class,
|
||||||
|
],
|
||||||
|
|
||||||
|
'api' => [
|
||||||
|
'throttle:60,1',
|
||||||
|
'bindings',
|
||||||
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -24,14 +43,17 @@ class Kernel extends HttpKernel {
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $routeMiddleware = [
|
protected $routeMiddleware = [
|
||||||
'auth' => 'App\Http\Middleware\Authenticate',
|
'auth' => \App\Http\Middleware\Authenticate::class,
|
||||||
'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
|
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
|
||||||
'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
|
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
|
||||||
'teamstoresession' => 'App\Http\Middleware\CheckTeamStorePassword',
|
'can' => \Illuminate\Auth\Middleware\Authorize::class,
|
||||||
'admin' => '\App\Http\Middleware\IsAdmin',
|
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
|
||||||
'normaluser' => '\App\Http\Middleware\IsUser',
|
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
|
||||||
'isAuthorized' => '\App\Http\Middleware\isAuthorized',
|
'teamstoresession' => \App\Http\Middleware\CheckTeamStorePassword::class,
|
||||||
'cors' => 'App\Http\Middleware\Cors',
|
'admin' => \App\Http\Middleware\IsAdmin::class,
|
||||||
|
'normaluser' => \App\Http\Middleware\IsUser::class,
|
||||||
|
'isAuthorized' => \App\Http\Middleware\isAuthorized::class,
|
||||||
|
'cors' => \App\Http\Middleware\Cors::class,
|
||||||
];
|
];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
18
app/Http/Middleware/TrimStrings.php
Normal file
18
app/Http/Middleware/TrimStrings.php
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Middleware;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Http\Middleware\TrimStrings as Middleware;
|
||||||
|
|
||||||
|
class TrimStrings extends Middleware
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The names of the attributes that should not be trimmed.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected $except = [
|
||||||
|
'password',
|
||||||
|
'password_confirmation',
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -41,10 +41,6 @@ Route::get('cart', ['as' => 'cart', 'uses' => 'teamstore\TeamStoreController@car
|
|||||||
Route::get('/checkout', 'teamstore\TeamStoreController@checkout');
|
Route::get('/checkout', 'teamstore\TeamStoreController@checkout');
|
||||||
Route::get('/mail', 'teamstore\TeamStoreController@mail');
|
Route::get('/mail', 'teamstore\TeamStoreController@mail');
|
||||||
|
|
||||||
// Test email page
|
|
||||||
Route::get('/test-email', 'TestEmailController@show');
|
|
||||||
Route::post('/test-email/send', 'TestEmailController@send');
|
|
||||||
|
|
||||||
Route::get('/designer/{templateid}', 'designer\DesignerController@index');
|
Route::get('/designer/{templateid}', 'designer\DesignerController@index');
|
||||||
|
|
||||||
Route::get('/designer/preview/{designCode}', 'designer\DesignerController@getDesign');
|
Route::get('/designer/preview/{designCode}', 'designer\DesignerController@getDesign');
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ class MainModel extends Model {
|
|||||||
|
|
||||||
function selectSportsId($url) //
|
function selectSportsId($url) //
|
||||||
{
|
{
|
||||||
$i = DB::table('sports')->where('URL', '=', $url)->get();
|
$i = DB::table('sports')->where('URL', '=', $url)->first();
|
||||||
$id = $i[0]->Id;
|
$id = $i->Id;
|
||||||
|
|
||||||
$k = DB::table('templates')->where('SportsId', '=', $id)
|
$k = DB::table('templates')->where('SportsId', '=', $id)
|
||||||
->where('IsActive','=', "TRUE")
|
->where('IsActive','=', "TRUE")
|
||||||
@@ -146,8 +146,8 @@ class MainModel extends Model {
|
|||||||
|
|
||||||
function selectTemplatesByCategory($url, $cat) //
|
function selectTemplatesByCategory($url, $cat) //
|
||||||
{
|
{
|
||||||
$i = DB::table('sports')->where('URL', '=', $url)->get();
|
$i = DB::table('sports')->where('URL', '=', $url)->first();
|
||||||
$id = $i[0]->Id;
|
$id = $i->Id;
|
||||||
|
|
||||||
$k = DB::table('templates')->where('SportsId', '=', $id)
|
$k = DB::table('templates')->where('SportsId', '=', $id)
|
||||||
->where('Category','=', $cat)
|
->where('Category','=', $cat)
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class TeamStoreModel extends Model {
|
|||||||
$i = DB::table('cart_tmp')
|
$i = DB::table('cart_tmp')
|
||||||
->where('CartKey', $cartKey)
|
->where('CartKey', $cartKey)
|
||||||
->groupby('CartKey')
|
->groupby('CartKey')
|
||||||
->get();
|
->first();
|
||||||
return $i;
|
return $i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,8 +4,6 @@ use Illuminate\Support\ServiceProvider;
|
|||||||
use Storage;
|
use Storage;
|
||||||
use League\Flysystem\Filesystem;
|
use League\Flysystem\Filesystem;
|
||||||
use League\Flysystem\Sftp\SftpAdapter;
|
use League\Flysystem\Sftp\SftpAdapter;
|
||||||
use League\Flysystem\AwsS3v3\AwsS3Adapter as AwsS3v3Adapter;
|
|
||||||
use Aws\S3\S3Client;
|
|
||||||
|
|
||||||
class AppServiceProvider extends ServiceProvider {
|
class AppServiceProvider extends ServiceProvider {
|
||||||
|
|
||||||
@@ -29,21 +27,6 @@ class AppServiceProvider extends ServiceProvider {
|
|||||||
Storage::extend('sftp', function ($app, $config) {
|
Storage::extend('sftp', function ($app, $config) {
|
||||||
return new Filesystem(new SftpAdapter($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);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -57,10 +40,6 @@ class AppServiceProvider extends ServiceProvider {
|
|||||||
*/
|
*/
|
||||||
public function register()
|
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(
|
$this->app->bind(
|
||||||
'Illuminate\Contracts\Auth\Registrar',
|
'Illuminate\Contracts\Auth\Registrar',
|
||||||
'App\Services\Registrar'
|
'App\Services\Registrar'
|
||||||
|
|||||||
@@ -1,24 +1,20 @@
|
|||||||
<?php namespace App\Providers;
|
<?php
|
||||||
|
|
||||||
|
namespace App\Providers;
|
||||||
|
|
||||||
use Illuminate\Bus\Dispatcher;
|
|
||||||
use Illuminate\Support\ServiceProvider;
|
use Illuminate\Support\ServiceProvider;
|
||||||
|
|
||||||
class BusServiceProvider extends ServiceProvider {
|
class BusServiceProvider extends ServiceProvider
|
||||||
|
{
|
||||||
/**
|
/**
|
||||||
* Bootstrap any application services.
|
* Bootstrap any application services.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Bus\Dispatcher $dispatcher
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function boot(Dispatcher $dispatcher)
|
public function boot()
|
||||||
{
|
{
|
||||||
$dispatcher->mapUsing(function($command)
|
// Command bus mapping removed in Laravel 5.5+
|
||||||
{
|
// Commands are now auto-discovered
|
||||||
return Dispatcher::simpleMapping(
|
|
||||||
$command, 'App\Commands', 'App\Handlers\Commands'
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -30,5 +26,4 @@ class BusServiceProvider extends ServiceProvider {
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,12 +19,11 @@ class EventServiceProvider extends ServiceProvider {
|
|||||||
/**
|
/**
|
||||||
* Register any other events for your application.
|
* Register any other events for your application.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Contracts\Events\Dispatcher $events
|
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function boot(DispatcherContract $events)
|
public function boot()
|
||||||
{
|
{
|
||||||
parent::boot($events);
|
parent::boot();
|
||||||
|
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,44 +1,69 @@
|
|||||||
<?php namespace App\Providers;
|
<?php
|
||||||
|
|
||||||
use Illuminate\Routing\Router;
|
namespace App\Providers;
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Route;
|
||||||
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
|
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
|
||||||
|
|
||||||
class RouteServiceProvider extends ServiceProvider {
|
class RouteServiceProvider extends ServiceProvider
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* This namespace is applied to your controller routes.
|
||||||
|
*
|
||||||
|
* In addition, it is set as the URL generator's root namespace.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $namespace = 'App\Http\Controllers';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This namespace is applied to the controller routes in your routes file.
|
* Define your route model bindings, pattern filters, etc.
|
||||||
*
|
*
|
||||||
* In addition, it is set as the URL generator's root namespace.
|
* @return void
|
||||||
*
|
*/
|
||||||
* @var string
|
public function boot()
|
||||||
*/
|
{
|
||||||
protected $namespace = 'App\Http\Controllers';
|
parent::boot();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define your route model bindings, pattern filters, etc.
|
* Define the routes for the application.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Routing\Router $router
|
* @return void
|
||||||
* @return void
|
*/
|
||||||
*/
|
public function map()
|
||||||
public function boot(Router $router)
|
{
|
||||||
{
|
$this->mapApiRoutes();
|
||||||
parent::boot($router);
|
|
||||||
|
|
||||||
//
|
$this->mapWebRoutes();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define the routes for the application.
|
* Define the "web" routes for the application.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Routing\Router $router
|
* These routes all receive session state, CSRF protection, etc.
|
||||||
* @return void
|
*
|
||||||
*/
|
* @return void
|
||||||
public function map(Router $router)
|
*/
|
||||||
{
|
protected function mapWebRoutes()
|
||||||
$router->group(['namespace' => $this->namespace], function($router)
|
{
|
||||||
{
|
Route::middleware('web')
|
||||||
require app_path('Http/routes.php');
|
->namespace($this->namespace)
|
||||||
});
|
->group(base_path('routes/web.php'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define the "api" routes for the application.
|
||||||
|
*
|
||||||
|
* These routes are typically stateless.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function mapApiRoutes()
|
||||||
|
{
|
||||||
|
Route::prefix('api')
|
||||||
|
->middleware('api')
|
||||||
|
->namespace($this->namespace)
|
||||||
|
->group(base_path('routes/api.php'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
16
bootstrap/cache/packages.php
vendored
Executable file
16
bootstrap/cache/packages.php
vendored
Executable file
@@ -0,0 +1,16 @@
|
|||||||
|
<?php return array (
|
||||||
|
'nesbot/carbon' =>
|
||||||
|
array (
|
||||||
|
'providers' =>
|
||||||
|
array (
|
||||||
|
0 => 'Carbon\\Laravel\\ServiceProvider',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
'webpatser/laravel-uuid' =>
|
||||||
|
array (
|
||||||
|
'aliases' =>
|
||||||
|
array (
|
||||||
|
'Uuid' => 'Webpatser\\Uuid\\Uuid',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
187
bootstrap/cache/services.php
vendored
Executable file
187
bootstrap/cache/services.php
vendored
Executable file
@@ -0,0 +1,187 @@
|
|||||||
|
<?php return array (
|
||||||
|
'providers' =>
|
||||||
|
array (
|
||||||
|
0 => 'Illuminate\\Foundation\\Providers\\ArtisanServiceProvider',
|
||||||
|
1 => 'Illuminate\\Auth\\AuthServiceProvider',
|
||||||
|
2 => 'Illuminate\\Bus\\BusServiceProvider',
|
||||||
|
3 => 'Illuminate\\Cache\\CacheServiceProvider',
|
||||||
|
4 => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
5 => 'Illuminate\\Cookie\\CookieServiceProvider',
|
||||||
|
6 => 'Illuminate\\Database\\DatabaseServiceProvider',
|
||||||
|
7 => 'Illuminate\\Encryption\\EncryptionServiceProvider',
|
||||||
|
8 => 'Illuminate\\Filesystem\\FilesystemServiceProvider',
|
||||||
|
9 => 'Illuminate\\Foundation\\Providers\\FoundationServiceProvider',
|
||||||
|
10 => 'Illuminate\\Hashing\\HashServiceProvider',
|
||||||
|
11 => 'Illuminate\\Mail\\MailServiceProvider',
|
||||||
|
12 => 'Illuminate\\Pagination\\PaginationServiceProvider',
|
||||||
|
13 => 'Illuminate\\Pipeline\\PipelineServiceProvider',
|
||||||
|
14 => 'Illuminate\\Queue\\QueueServiceProvider',
|
||||||
|
15 => 'Illuminate\\Redis\\RedisServiceProvider',
|
||||||
|
16 => 'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider',
|
||||||
|
17 => 'Illuminate\\Session\\SessionServiceProvider',
|
||||||
|
18 => 'Illuminate\\Translation\\TranslationServiceProvider',
|
||||||
|
19 => 'Illuminate\\Validation\\ValidationServiceProvider',
|
||||||
|
20 => 'Illuminate\\View\\ViewServiceProvider',
|
||||||
|
21 => 'Carbon\\Laravel\\ServiceProvider',
|
||||||
|
22 => 'App\\Providers\\AppServiceProvider',
|
||||||
|
23 => 'App\\Providers\\BusServiceProvider',
|
||||||
|
24 => 'App\\Providers\\ConfigServiceProvider',
|
||||||
|
25 => 'App\\Providers\\EventServiceProvider',
|
||||||
|
26 => 'App\\Providers\\RouteServiceProvider',
|
||||||
|
27 => 'Netshell\\Paypal\\PaypalServiceProvider',
|
||||||
|
),
|
||||||
|
'eager' =>
|
||||||
|
array (
|
||||||
|
0 => 'Illuminate\\Auth\\AuthServiceProvider',
|
||||||
|
1 => 'Illuminate\\Cookie\\CookieServiceProvider',
|
||||||
|
2 => 'Illuminate\\Database\\DatabaseServiceProvider',
|
||||||
|
3 => 'Illuminate\\Encryption\\EncryptionServiceProvider',
|
||||||
|
4 => 'Illuminate\\Filesystem\\FilesystemServiceProvider',
|
||||||
|
5 => 'Illuminate\\Foundation\\Providers\\FoundationServiceProvider',
|
||||||
|
6 => 'Illuminate\\Pagination\\PaginationServiceProvider',
|
||||||
|
7 => 'Illuminate\\Session\\SessionServiceProvider',
|
||||||
|
8 => 'Illuminate\\View\\ViewServiceProvider',
|
||||||
|
9 => 'Carbon\\Laravel\\ServiceProvider',
|
||||||
|
10 => 'App\\Providers\\AppServiceProvider',
|
||||||
|
11 => 'App\\Providers\\BusServiceProvider',
|
||||||
|
12 => 'App\\Providers\\ConfigServiceProvider',
|
||||||
|
13 => 'App\\Providers\\EventServiceProvider',
|
||||||
|
14 => 'App\\Providers\\RouteServiceProvider',
|
||||||
|
15 => 'Netshell\\Paypal\\PaypalServiceProvider',
|
||||||
|
),
|
||||||
|
'deferred' =>
|
||||||
|
array (
|
||||||
|
'command.cache.clear' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.cache.forget' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.clear-compiled' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.auth.resets.clear' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.config.cache' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.config.clear' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.down' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.environment' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.key.generate' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.migrate' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.migrate.fresh' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.migrate.install' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.migrate.refresh' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.migrate.reset' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.migrate.rollback' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.migrate.status' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.optimize' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.package.discover' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.preset' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.queue.failed' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.queue.flush' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.queue.forget' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.queue.listen' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.queue.restart' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.queue.retry' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.queue.work' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.route.cache' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.route.clear' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.route.list' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.seed' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'Illuminate\\Console\\Scheduling\\ScheduleFinishCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'Illuminate\\Console\\Scheduling\\ScheduleRunCommand' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.storage.link' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.up' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.view.clear' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.app.name' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.auth.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.cache.table' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.console.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.controller.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.event.generate' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.event.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.exception.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.factory.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.job.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.listener.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.mail.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.middleware.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.migrate.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.model.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.notification.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.notification.table' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.policy.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.provider.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.queue.failed-table' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.queue.table' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.request.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.resource.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.rule.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.seeder.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.session.table' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.serve' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.test.make' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'command.vendor.publish' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'Illuminate\\Bus\\Dispatcher' => 'Illuminate\\Bus\\BusServiceProvider',
|
||||||
|
'Illuminate\\Contracts\\Bus\\Dispatcher' => 'Illuminate\\Bus\\BusServiceProvider',
|
||||||
|
'Illuminate\\Contracts\\Bus\\QueueingDispatcher' => 'Illuminate\\Bus\\BusServiceProvider',
|
||||||
|
'cache' => 'Illuminate\\Cache\\CacheServiceProvider',
|
||||||
|
'cache.store' => 'Illuminate\\Cache\\CacheServiceProvider',
|
||||||
|
'memcached.connector' => 'Illuminate\\Cache\\CacheServiceProvider',
|
||||||
|
'migrator' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'migration.repository' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'migration.creator' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'composer' => 'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider',
|
||||||
|
'hash' => 'Illuminate\\Hashing\\HashServiceProvider',
|
||||||
|
'mailer' => 'Illuminate\\Mail\\MailServiceProvider',
|
||||||
|
'swift.mailer' => 'Illuminate\\Mail\\MailServiceProvider',
|
||||||
|
'swift.transport' => 'Illuminate\\Mail\\MailServiceProvider',
|
||||||
|
'Illuminate\\Mail\\Markdown' => 'Illuminate\\Mail\\MailServiceProvider',
|
||||||
|
'Illuminate\\Contracts\\Pipeline\\Hub' => 'Illuminate\\Pipeline\\PipelineServiceProvider',
|
||||||
|
'queue' => 'Illuminate\\Queue\\QueueServiceProvider',
|
||||||
|
'queue.worker' => 'Illuminate\\Queue\\QueueServiceProvider',
|
||||||
|
'queue.listener' => 'Illuminate\\Queue\\QueueServiceProvider',
|
||||||
|
'queue.failer' => 'Illuminate\\Queue\\QueueServiceProvider',
|
||||||
|
'queue.connection' => 'Illuminate\\Queue\\QueueServiceProvider',
|
||||||
|
'redis' => 'Illuminate\\Redis\\RedisServiceProvider',
|
||||||
|
'redis.connection' => 'Illuminate\\Redis\\RedisServiceProvider',
|
||||||
|
'auth.password' => 'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider',
|
||||||
|
'auth.password.broker' => 'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider',
|
||||||
|
'translator' => 'Illuminate\\Translation\\TranslationServiceProvider',
|
||||||
|
'translation.loader' => 'Illuminate\\Translation\\TranslationServiceProvider',
|
||||||
|
'validator' => 'Illuminate\\Validation\\ValidationServiceProvider',
|
||||||
|
'validation.presence' => 'Illuminate\\Validation\\ValidationServiceProvider',
|
||||||
|
),
|
||||||
|
'when' =>
|
||||||
|
array (
|
||||||
|
'Illuminate\\Foundation\\Providers\\ArtisanServiceProvider' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
'Illuminate\\Bus\\BusServiceProvider' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
'Illuminate\\Cache\\CacheServiceProvider' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
'Illuminate\\Foundation\\Providers\\ConsoleSupportServiceProvider' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
'Illuminate\\Hashing\\HashServiceProvider' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
'Illuminate\\Mail\\MailServiceProvider' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
'Illuminate\\Pipeline\\PipelineServiceProvider' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
'Illuminate\\Queue\\QueueServiceProvider' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
'Illuminate\\Redis\\RedisServiceProvider' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
'Illuminate\\Auth\\Passwords\\PasswordResetServiceProvider' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
'Illuminate\\Translation\\TranslationServiceProvider' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
'Illuminate\\Validation\\ValidationServiceProvider' =>
|
||||||
|
array (
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
@@ -5,21 +5,24 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"type": "project",
|
"type": "project",
|
||||||
"require": {
|
"require": {
|
||||||
"laravel/framework": "5.0.*",
|
"php": "^7.2",
|
||||||
"webpatser/laravel-uuid": "^2.0",
|
"laravel/framework": "^6.0",
|
||||||
|
"laravel/helpers": "^1.1",
|
||||||
|
"laravel/tinker": "^2.0",
|
||||||
|
"webpatser/laravel-uuid": "^3.0",
|
||||||
"netshell/paypal": "dev-master",
|
"netshell/paypal": "dev-master",
|
||||||
"guzzlehttp/guzzle": "~5.0",
|
"guzzlehttp/guzzle": "^6.3",
|
||||||
"google/recaptcha": "~1.1",
|
"google/recaptcha": "~1.1",
|
||||||
"spatie/laravel-analytics": "^1.4",
|
"spatie/laravel-analytics": "^3.0",
|
||||||
"league/flysystem-sftp": "^1.0",
|
"league/flysystem-sftp": "^1.0",
|
||||||
"league/flysystem-aws-s3-v3": "~1.0",
|
"aws/aws-sdk-php": "~3.0"
|
||||||
"aws/aws-sdk-php": "~3.0",
|
|
||||||
"psr/http-message": "^1.0",
|
|
||||||
"guzzlehttp/psr7": "^1.4"
|
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"phpunit/phpunit": "~4.0",
|
"facade/ignition": "^1.4",
|
||||||
"phpspec/phpspec": "~2.1"
|
"fzaninotto/faker": "^1.4",
|
||||||
|
"mockery/mockery": "^1.0",
|
||||||
|
"nunomaduro/collision": "^3.0",
|
||||||
|
"phpunit/phpunit": "^8.0"
|
||||||
},
|
},
|
||||||
|
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -39,20 +42,21 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"post-install-cmd": [
|
"post-autoload-dump": [
|
||||||
"php artisan clear-compiled",
|
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
|
||||||
"php artisan optimize"
|
"@php artisan package:discover --ansi"
|
||||||
],
|
],
|
||||||
"post-update-cmd": [
|
"post-root-package-install": [
|
||||||
"php artisan clear-compiled",
|
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
|
||||||
"php artisan optimize"
|
|
||||||
],
|
],
|
||||||
"post-create-project-cmd": [
|
"post-create-project-cmd": [
|
||||||
"php -r \"copy('.env.example', '.env');\"",
|
"@php artisan key:generate --ansi"
|
||||||
"php artisan key:generate"
|
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"preferred-install": "dist"
|
"preferred-install": "dist",
|
||||||
|
"allow-plugins": {
|
||||||
|
"kylekatarnls/update-helper": true
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
4556
composer.lock
generated
4556
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -80,7 +80,7 @@ return [
|
|||||||
|
|
||||||
'key' => env('APP_KEY', 'SomeRandomString'),
|
'key' => env('APP_KEY', 'SomeRandomString'),
|
||||||
|
|
||||||
'cipher' => MCRYPT_RIJNDAEL_128,
|
'cipher' => 'AES-256-CBC',
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
@@ -118,7 +118,7 @@ return [
|
|||||||
'Illuminate\Bus\BusServiceProvider',
|
'Illuminate\Bus\BusServiceProvider',
|
||||||
'Illuminate\Cache\CacheServiceProvider',
|
'Illuminate\Cache\CacheServiceProvider',
|
||||||
'Illuminate\Foundation\Providers\ConsoleSupportServiceProvider',
|
'Illuminate\Foundation\Providers\ConsoleSupportServiceProvider',
|
||||||
'Illuminate\Routing\ControllerServiceProvider',
|
// 'Illuminate\Routing\ControllerServiceProvider', // Removed in Laravel 5.3+
|
||||||
'Illuminate\Cookie\CookieServiceProvider',
|
'Illuminate\Cookie\CookieServiceProvider',
|
||||||
'Illuminate\Database\DatabaseServiceProvider',
|
'Illuminate\Database\DatabaseServiceProvider',
|
||||||
'Illuminate\Encryption\EncryptionServiceProvider',
|
'Illuminate\Encryption\EncryptionServiceProvider',
|
||||||
@@ -153,7 +153,7 @@ return [
|
|||||||
/*
|
/*
|
||||||
* Google analytics
|
* Google analytics
|
||||||
*/
|
*/
|
||||||
'Spatie\LaravelAnalytics\LaravelAnalyticsServiceProvider',
|
// 'Spatie\LaravelAnalytics\LaravelAnalyticsServiceProvider', // Commented out - version 2.x needs reconfiguration
|
||||||
|
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|||||||
@@ -4,64 +4,59 @@ return [
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Default Authentication Driver
|
| Authentication Defaults
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
| This option controls the authentication driver that will be utilized.
|
|
||||||
| This driver manages the retrieval and authentication of the users
|
|
||||||
| attempting to get access to protected areas of your application.
|
|
||||||
|
|
|
||||||
| Supported: "database", "eloquent"
|
|
||||||
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'driver' => 'eloquent',
|
'defaults' => [
|
||||||
|
'guard' => 'web',
|
||||||
|
'passwords' => 'users',
|
||||||
|
],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Authentication Model
|
| Authentication Guards
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
| When using the "Eloquent" authentication driver, we need to know which
|
|
||||||
| Eloquent model should be used to retrieve your users. Of course, it
|
|
||||||
| is often just the "User" model but you may use whatever you like.
|
|
||||||
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'model' => 'App\User',
|
'guards' => [
|
||||||
|
'web' => [
|
||||||
|
'driver' => 'session',
|
||||||
|
'provider' => 'users',
|
||||||
|
],
|
||||||
|
|
||||||
|
'api' => [
|
||||||
|
'driver' => 'token',
|
||||||
|
'provider' => 'users',
|
||||||
|
'hash' => false,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Authentication Table
|
| User Providers
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
| When using the "Database" authentication driver, we need to know which
|
|
||||||
| table should be used to retrieve your users. We have chosen a basic
|
|
||||||
| default value but you may easily change it to any table you like.
|
|
||||||
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'table' => 'users',
|
'providers' => [
|
||||||
|
'users' => [
|
||||||
|
'driver' => 'eloquent',
|
||||||
|
'model' => App\User::class,
|
||||||
|
],
|
||||||
|
],
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Password Reset Settings
|
| Resetting Passwords
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
| Here you may set the options for resetting passwords including the view
|
|
||||||
| that is your password reset e-mail. You can also set the name of the
|
|
||||||
| table that maintains all of the reset tokens for your application.
|
|
||||||
|
|
|
||||||
| The expire time is the number of minutes that the reset token should be
|
|
||||||
| considered valid. This security feature keeps tokens short-lived so
|
|
||||||
| they have less time to be guessed. You may change this as needed.
|
|
||||||
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'password' => [
|
'passwords' => [
|
||||||
'email' => 'emails.password',
|
'users' => [
|
||||||
'table' => 'password_resets',
|
'provider' => 'users',
|
||||||
// 'expire' => 60,
|
'table' => 'password_resets',
|
||||||
|
'expire' => 60,
|
||||||
|
],
|
||||||
],
|
],
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ return [
|
|||||||
'port' => 22,
|
'port' => 22,
|
||||||
'username' => 'root',
|
'username' => 'root',
|
||||||
'password' => '',
|
'password' => '',
|
||||||
'privateKey' => '/var/keys/root.ppk',
|
'privateKey' => '/var/www/html/_key/instance2/root.ppk',
|
||||||
'root' => '/var/www/html/images',
|
'root' => '/var/www/html/images',
|
||||||
'timeout' => 10
|
'timeout' => 10
|
||||||
],
|
],
|
||||||
@@ -88,7 +88,7 @@ return [
|
|||||||
],
|
],
|
||||||
|
|
||||||
'minio' => [
|
'minio' => [
|
||||||
'driver' => 'minio',
|
'driver' => 's3',
|
||||||
'key' => env('MINIO_KEY'),
|
'key' => env('MINIO_KEY'),
|
||||||
'secret' => env('MINIO_SECRET'),
|
'secret' => env('MINIO_SECRET'),
|
||||||
'region' => env('MINIO_REGION', 'us-east-1'),
|
'region' => env('MINIO_REGION', 'us-east-1'),
|
||||||
|
|||||||
@@ -18,7 +18,6 @@ return [
|
|||||||
|
|
||||||
'prod_private_server_ip' => env('https://crewsportswear.app', 'https://crewsportswear.app'),
|
'prod_private_server_ip' => env('https://crewsportswear.app', 'https://crewsportswear.app'),
|
||||||
'images_url' => env('https://crewsportswear.app:5955', 'https://crewsportswear.app:5955'),
|
'images_url' => env('https://crewsportswear.app:5955', 'https://crewsportswear.app:5955'),
|
||||||
'minio_url' => env('MINIO_URL', 'https://minio.crewsportswear.app/crewsportswear'),
|
|
||||||
'uploads' => env('https://crewsportswear.com/uploads/images/', 'https://crewsportswear.com/uploads/images/'), // local
|
'uploads' => env('https://crewsportswear.com/uploads/images/', 'https://crewsportswear.com/uploads/images/'), // local
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
|
||||||
|
class AddUserIdToSessionsTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('sessions', function (Blueprint $table) {
|
||||||
|
$table->unsignedInteger('user_id')->nullable()->after('id');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('sessions', function (Blueprint $table) {
|
||||||
|
$table->dropColumn('user_id');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
|
||||||
|
class UpdateSessionsTableForLaravel55 extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('sessions', function (Blueprint $table) {
|
||||||
|
$table->string('ip_address', 45)->nullable()->after('user_id');
|
||||||
|
$table->text('user_agent')->nullable()->after('ip_address');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('sessions', function (Blueprint $table) {
|
||||||
|
$table->dropColumn(['ip_address', 'user_agent']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -31,7 +31,6 @@ services:
|
|||||||
volumes:
|
volumes:
|
||||||
- ./storage:/var/www/html/storage
|
- ./storage:/var/www/html/storage
|
||||||
- ./public/uploads:/var/www/html/public/uploads
|
- ./public/uploads:/var/www/html/public/uploads
|
||||||
- /var/crew-keys:/var/keys:ro
|
|
||||||
labels:
|
labels:
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
# Development environment (dev.crewsportswear.app)
|
# Development environment (dev.crewsportswear.app)
|
||||||
|
|||||||
@@ -1,19 +1,3 @@
|
|||||||
# ─────────────────────────────────────────────────────────────────────────────
|
|
||||||
# Local development stack
|
|
||||||
#
|
|
||||||
# Default (local MariaDB):
|
|
||||||
# docker compose -f docker-compose.local.yml up --build
|
|
||||||
#
|
|
||||||
# Remote DB via SSH private-key tunnel:
|
|
||||||
# 1. Set SSH_HOST, SSH_USER, SSH_KEY_PATH, SSH_DB_REMOTE_HOST,
|
|
||||||
# SSH_DB_REMOTE_PORT (and DB_* creds) in .env.local
|
|
||||||
# 2. docker compose -f docker-compose.local.yml --profile ssh-db up --build
|
|
||||||
# The app will talk to db-tunnel (port 3306) instead of the local db.
|
|
||||||
#
|
|
||||||
# App: http://localhost:8082
|
|
||||||
# phpMyAdmin: http://localhost:8083
|
|
||||||
# ─────────────────────────────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
db:
|
db:
|
||||||
image: mariadb:10.6
|
image: mariadb:10.6
|
||||||
@@ -43,9 +27,15 @@ services:
|
|||||||
environment:
|
environment:
|
||||||
- APP_ENV=local
|
- APP_ENV=local
|
||||||
- APP_DEBUG=true
|
- APP_DEBUG=true
|
||||||
|
- APP_KEY=base64:omrrKgpmHyPi61hoXrxtTwC/2tFkIsXUlb8UoKk3enk=
|
||||||
|
- APP_CIPHER=AES-256-CBC
|
||||||
- APP_URL=http://localhost:8082
|
- APP_URL=http://localhost:8082
|
||||||
- DB_CONNECTION=mysql
|
- DB_CONNECTION=mysql
|
||||||
- DB_PORT=${DB_PORT:-3306}
|
- DB_HOST=db
|
||||||
|
- DB_PORT=3307
|
||||||
|
- DB_DATABASE=crewsportswear
|
||||||
|
- DB_USERNAME=crewsportswear
|
||||||
|
- DB_PASSWORD=secret
|
||||||
- PROD_PRIVATE=http://localhost:8082
|
- PROD_PRIVATE=http://localhost:8082
|
||||||
- IMAGES_URL=http://localhost:8082
|
- IMAGES_URL=http://localhost:8082
|
||||||
- UPLOAD_URL=http://localhost:8082/uploads/
|
- UPLOAD_URL=http://localhost:8082/uploads/
|
||||||
@@ -68,65 +58,15 @@ services:
|
|||||||
- MINIO_REGION=us-east-1
|
- MINIO_REGION=us-east-1
|
||||||
- MINIO_USE_PATH_STYLE=false
|
- MINIO_USE_PATH_STYLE=false
|
||||||
- MINIO_URL=https://minio.crewsportswear.app
|
- MINIO_URL=https://minio.crewsportswear.app
|
||||||
# DB_HOST defaults to local container; set to db-tunnel in .env.local for SSH mode
|
|
||||||
- DB_HOST=${DB_HOST:-db}
|
|
||||||
- DB_DATABASE=${DB_DATABASE:-crewsportswear}
|
|
||||||
- DB_USERNAME=${DB_USERNAME:-crewsportswear}
|
|
||||||
- DB_PASSWORD=${DB_PASSWORD:-secret}
|
|
||||||
env_file:
|
|
||||||
- path: .env.local
|
|
||||||
required: false
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./:/var/www/html
|
- ./:/var/www/html
|
||||||
- ./storage:/var/www/html/storage
|
- ./storage:/var/www/html/storage
|
||||||
- ./public/uploads:/var/www/html/public/uploads
|
- ./public/uploads:/var/www/html/public/uploads
|
||||||
# Keep the vendor/ directory from the image — prevents the bind-mount
|
|
||||||
# from wiping out the composer install done during docker build.
|
|
||||||
- vendor_local:/var/www/html/vendor
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- db
|
- db
|
||||||
networks:
|
networks:
|
||||||
- crewsportswear-local
|
- crewsportswear-local
|
||||||
|
|
||||||
# ── SSH tunnel to a remote database ────────────────────────────────────────
|
|
||||||
# Activated only with: --profile ssh-db
|
|
||||||
# Requires SSH_HOST, SSH_USER, SSH_KEY_PATH (and optionally SSH_PORT,
|
|
||||||
# SSH_DB_REMOTE_HOST, SSH_DB_REMOTE_PORT) set in .env.local.
|
|
||||||
db-tunnel:
|
|
||||||
profiles:
|
|
||||||
- ssh-db
|
|
||||||
image: alpine:3.19
|
|
||||||
container_name: crewsportswear_db_tunnel
|
|
||||||
restart: unless-stopped
|
|
||||||
environment:
|
|
||||||
- SSH_HOST=${SSH_HOST}
|
|
||||||
- SSH_PORT=${SSH_PORT:-22}
|
|
||||||
- SSH_USER=${SSH_USER:-root}
|
|
||||||
- SSH_DB_REMOTE_HOST=${SSH_DB_REMOTE_HOST:-127.0.0.1}
|
|
||||||
- SSH_DB_REMOTE_PORT=${SSH_DB_REMOTE_PORT:-3306}
|
|
||||||
volumes:
|
|
||||||
# Mount your private key read-only; path configured in .env.local
|
|
||||||
- ${SSH_KEY_PATH:-~/.ssh/id_rsa}:/ssh/id_rsa:ro
|
|
||||||
command:
|
|
||||||
- sh
|
|
||||||
- -c
|
|
||||||
- |
|
|
||||||
apk add --no-cache openssh-client
|
|
||||||
cp /ssh/id_rsa /tmp/id_rsa
|
|
||||||
chmod 600 /tmp/id_rsa
|
|
||||||
echo "Starting SSH tunnel to $$SSH_HOST..."
|
|
||||||
exec ssh -N \
|
|
||||||
-o StrictHostKeyChecking=no \
|
|
||||||
-o ServerAliveInterval=30 \
|
|
||||||
-o ServerAliveCountMax=3 \
|
|
||||||
-o ExitOnForwardFailure=yes \
|
|
||||||
-i /tmp/id_rsa \
|
|
||||||
-L "0.0.0.0:3306:$$SSH_DB_REMOTE_HOST:$$SSH_DB_REMOTE_PORT" \
|
|
||||||
-p "$$SSH_PORT" \
|
|
||||||
"$$SSH_USER@$$SSH_HOST"
|
|
||||||
networks:
|
|
||||||
- crewsportswear-local
|
|
||||||
|
|
||||||
phpmyadmin:
|
phpmyadmin:
|
||||||
image: arm64v8/phpmyadmin
|
image: arm64v8/phpmyadmin
|
||||||
platform: linux/arm64
|
platform: linux/arm64
|
||||||
@@ -149,4 +89,3 @@ networks:
|
|||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
db_data:
|
db_data:
|
||||||
vendor_local:
|
|
||||||
|
|||||||
@@ -28,18 +28,9 @@ services:
|
|||||||
- ANALYTICS_SITE_ID=${ANALYTICS_SITE_ID}
|
- ANALYTICS_SITE_ID=${ANALYTICS_SITE_ID}
|
||||||
- ANALYTICS_CLIENT_ID=${ANALYTICS_CLIENT_ID}
|
- ANALYTICS_CLIENT_ID=${ANALYTICS_CLIENT_ID}
|
||||||
- ANALYTICS_SERVICE_EMAIL=${ANALYTICS_SERVICE_EMAIL}
|
- 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:
|
volumes:
|
||||||
- ./storage:/var/www/html/storage
|
- ./storage:/var/www/html/storage
|
||||||
- ./public/uploads:/var/www/html/public/uploads
|
- ./public/uploads:/var/www/html/public/uploads
|
||||||
- /var/crew-keys:/var/keys:ro
|
|
||||||
labels:
|
labels:
|
||||||
- "traefik.enable=true"
|
- "traefik.enable=true"
|
||||||
# Production environment (crewsportswear.com) - Uses paid SSL certificate
|
# Production environment (crewsportswear.com) - Uses paid SSL certificate
|
||||||
|
|||||||
@@ -13,11 +13,5 @@ mkdir -p bootstrap/cache
|
|||||||
chown -R www-data:www-data storage bootstrap/cache
|
chown -R www-data:www-data storage bootstrap/cache
|
||||||
chmod -R 775 storage bootstrap/cache
|
chmod -R 775 storage bootstrap/cache
|
||||||
|
|
||||||
# Install/update Composer dependencies if vendor is missing or composer.json changed
|
|
||||||
if [ ! -f vendor/autoload.php ]; then
|
|
||||||
echo "vendor/autoload.php not found — running composer install..."
|
|
||||||
composer install --no-interaction --prefer-dist
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Execute the main command
|
# Execute the main command
|
||||||
exec "$@"
|
exec "$@"
|
||||||
|
|||||||
@@ -1,90 +0,0 @@
|
|||||||
/**
|
|
||||||
* Augments canvas by assigning to `onObjectMove` and `onAfterRender`.
|
|
||||||
* This kind of sucks because other code using those methods will stop functioning.
|
|
||||||
* Need to fix it by replacing callbacks with pub/sub kind of subscription model.
|
|
||||||
* (or maybe use existing fabric.util.fire/observe (if it won't be too slow))
|
|
||||||
*/
|
|
||||||
function initCenteringGuidelines(canvas) {
|
|
||||||
|
|
||||||
var canvasWidth = canvas.getWidth(),
|
|
||||||
canvasHeight = canvas.getHeight(),
|
|
||||||
canvasWidthCenter = canvasWidth / 2,
|
|
||||||
canvasHeightCenter = canvasHeight / 2,
|
|
||||||
canvasWidthCenterMap = { },
|
|
||||||
canvasHeightCenterMap = { },
|
|
||||||
centerLineMargin = 4,
|
|
||||||
centerLineColor = 'rgba(255,0,241,0.5)',
|
|
||||||
centerLineWidth = 1,
|
|
||||||
ctx = canvas.getSelectionContext(),
|
|
||||||
viewportTransform;
|
|
||||||
|
|
||||||
for (var i = canvasWidthCenter - centerLineMargin, len = canvasWidthCenter + centerLineMargin; i <= len; i++) {
|
|
||||||
canvasWidthCenterMap[Math.round(i)] = true;
|
|
||||||
}
|
|
||||||
for (var i = canvasHeightCenter - centerLineMargin, len = canvasHeightCenter + centerLineMargin; i <= len; i++) {
|
|
||||||
canvasHeightCenterMap[Math.round(i)] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
function showVerticalCenterLine() {
|
|
||||||
showCenterLine(canvasWidthCenter + 0.5, 0, canvasWidthCenter + 0.5, canvasHeight);
|
|
||||||
}
|
|
||||||
|
|
||||||
function showHorizontalCenterLine() {
|
|
||||||
showCenterLine(0, canvasHeightCenter + 0.5, canvasWidth, canvasHeightCenter + 0.5);
|
|
||||||
}
|
|
||||||
|
|
||||||
function showCenterLine(x1, y1, x2, y2) {
|
|
||||||
ctx.save();
|
|
||||||
ctx.strokeStyle = centerLineColor;
|
|
||||||
ctx.lineWidth = centerLineWidth;
|
|
||||||
ctx.beginPath();
|
|
||||||
ctx.moveTo(x1 * viewportTransform[0], y1 * viewportTransform[3]);
|
|
||||||
ctx.lineTo(x2 * viewportTransform[0], y2 * viewportTransform[3]);
|
|
||||||
ctx.stroke();
|
|
||||||
ctx.restore();
|
|
||||||
}
|
|
||||||
|
|
||||||
var afterRenderActions = [],
|
|
||||||
isInVerticalCenter,
|
|
||||||
isInHorizontalCenter;
|
|
||||||
|
|
||||||
canvas.on('mouse:down', function () {
|
|
||||||
viewportTransform = canvas.viewportTransform;
|
|
||||||
});
|
|
||||||
|
|
||||||
canvas.on('object:moving', function(e) {
|
|
||||||
var object = e.target,
|
|
||||||
objectCenter = object.getCenterPoint(),
|
|
||||||
transform = canvas._currentTransform;
|
|
||||||
|
|
||||||
if (!transform) return;
|
|
||||||
|
|
||||||
isInVerticalCenter = Math.round(objectCenter.x) in canvasWidthCenterMap,
|
|
||||||
isInHorizontalCenter = Math.round(objectCenter.y) in canvasHeightCenterMap;
|
|
||||||
|
|
||||||
if (isInHorizontalCenter || isInVerticalCenter) {
|
|
||||||
object.setPositionByOrigin(new fabric.Point((isInVerticalCenter ? canvasWidthCenter : objectCenter.x), (isInHorizontalCenter ? canvasHeightCenter : objectCenter.y)), 'center', 'center');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
canvas.on('before:render', function() {
|
|
||||||
if (canvas.contextTop) {
|
|
||||||
canvas.clearContext(canvas.contextTop);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
canvas.on('after:render', function() {
|
|
||||||
if (isInVerticalCenter) {
|
|
||||||
showVerticalCenterLine();
|
|
||||||
}
|
|
||||||
if (isInHorizontalCenter) {
|
|
||||||
showHorizontalCenterLine();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
canvas.on('mouse:up', function() {
|
|
||||||
// clear these values, to stop drawing guidelines once mouse is up
|
|
||||||
isInVerticalCenter = isInHorizontalCenter = null;
|
|
||||||
canvas.renderAll();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
@@ -57,8 +57,8 @@
|
|||||||
|
|
||||||
<ul class="nav navbar-nav navbar-right">
|
<ul class="nav navbar-nav navbar-right">
|
||||||
@if (Auth::guest())
|
@if (Auth::guest())
|
||||||
<li><a href="{{ url('/auth/login') }}">Login</a></li>
|
<li><a href="{{ url('/login') }}">Login</a></li>
|
||||||
<li><a href="{{ url('/auth/register') }}">Register</a></li>
|
<li><a href="{{ url('/register') }}">Register</a></li>
|
||||||
@else
|
@else
|
||||||
<li class="dropdown">
|
<li class="dropdown">
|
||||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">{{ Auth::user()->username }} <span class="caret"></span></a>
|
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">{{ Auth::user()->username }} <span class="caret"></span></a>
|
||||||
|
|||||||
@@ -2,168 +2,58 @@
|
|||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<style>
|
<style>
|
||||||
html,
|
.error{
|
||||||
body {
|
color: red;
|
||||||
height: 100%;
|
|
||||||
background: #ffffff;
|
|
||||||
margin: 0;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
}
|
||||||
|
.form-wrapper{
|
||||||
.navbar-custom {
|
margin-top: 20%;
|
||||||
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>
|
</style>
|
||||||
|
<div class="container">
|
||||||
<div class="login-wrapper">
|
<div class="col-md-4 col-md-offset-4">
|
||||||
<div class="login-card">
|
<div class="form-wrapper">
|
||||||
<h1 class="login-title">Sign in</h1>
|
<div class="panel panel-default">
|
||||||
<p class="login-subtitle">Welcome back. Please enter your details.</p>
|
<div class="panel-heading">
|
||||||
<div id="login-response-msg"></div>
|
<h3 class="text-center">S I G N - I N</h3>
|
||||||
<form role="form" id="frm-login">
|
</div>
|
||||||
<input type="hidden" name="_token" value="{{ csrf_token() }}">
|
<div class="panel-body">
|
||||||
<div class="form-group">
|
<div class="row">
|
||||||
<label for="email">Email Address</label>
|
<div class="col-xs-12">
|
||||||
<input type="email" class="form-control" name="email" id="email" value="{{ old('email') }}" placeholder="you@example.com" title="Please enter your email address">
|
<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> 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('/register') }}" type="submit" id="btn-login" class="btn btn-primary btn-block">Register</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
</div>
|
||||||
<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">Don’t have an account? <a href="{{ url('/auth/register') }}">Create one</a></p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|||||||
@@ -2,154 +2,54 @@
|
|||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<style>
|
<style>
|
||||||
body {
|
.error{
|
||||||
background: #ffffff;
|
color: red;
|
||||||
margin: 0;
|
|
||||||
}
|
}
|
||||||
|
.form-wrapper{
|
||||||
.navbar-custom {
|
margin-top: 20%;
|
||||||
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>
|
</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 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
|
||||||
|
|
||||||
<div class="auth-wrapper">
|
@if (count($errors) > 0)
|
||||||
<div class="auth-card">
|
<div class="alert alert-danger">
|
||||||
<h1 class="auth-title">Forgot password</h1>
|
<strong>Whoops!</strong> There were some problems with your input.<br><br>
|
||||||
<p class="auth-subtitle">Enter your email and we’ll send you a reset link.</p>
|
<ul>
|
||||||
|
@foreach ($errors->all() as $error)
|
||||||
@if (session('status'))
|
<li>{{ $error }}</li>
|
||||||
<div class="alert alert-success">
|
@endforeach
|
||||||
{{ session('status') }}
|
</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>
|
</div>
|
||||||
@endif
|
</div>
|
||||||
|
|
||||||
@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>
|
||||||
</div>
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|||||||
@@ -2,242 +2,136 @@
|
|||||||
|
|
||||||
@section('content')
|
@section('content')
|
||||||
<style>
|
<style>
|
||||||
body {
|
.error {
|
||||||
background: #ffffff;
|
color: red;
|
||||||
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 {
|
.g-recaptcha {
|
||||||
width: 100%;
|
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>
|
</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="auth-wrapper">
|
<div class="form-group">
|
||||||
<div class="auth-card">
|
<label class="control-label">First name</label>
|
||||||
<h1 class="auth-title">Create account</h1>
|
<input type="text" class="form-control" name="firstname" placeholder="First name">
|
||||||
<p class="auth-subtitle">Fill in your details to get started.</p>
|
</div>
|
||||||
<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">
|
<div class="form-group">
|
||||||
<label>First name</label>
|
<label class="control-label">Last name</label>
|
||||||
<input type="text" class="form-control" name="firstname" placeholder="First name">
|
<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('/login') }}" type="submit" id="btn-login" class="btn btn-success btn-block">Login here</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</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>
|
||||||
</div>
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
@@ -3,158 +3,60 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
body {
|
.error{
|
||||||
background: #ffffff;
|
color: red;
|
||||||
margin: 0;
|
|
||||||
}
|
}
|
||||||
|
.form-wrapper{
|
||||||
.navbar-custom {
|
margin-top: 20%;
|
||||||
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>
|
</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 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="auth-wrapper">
|
<div class="form-group">
|
||||||
<div class="auth-card">
|
<label class="control-label">Email Address</label>
|
||||||
<h1 class="auth-title">Reset password</h1>
|
<input type="email" class="form-control" name="email" value="{{ old('email') }}" title="Please enter your email address" placeholder="example@gmail.com">
|
||||||
<p class="auth-subtitle">Set a new password for your account.</p>
|
<span class="help-block"></span>
|
||||||
|
</div>
|
||||||
@if (count($errors) > 0)
|
<div class="form-group">
|
||||||
<div class="alert alert-danger">
|
<label class="control-label">Password</label>
|
||||||
<strong>Whoops!</strong> There were some problems with your input.<br><br>
|
<input type="password" class="form-control" name="password" placeholder="Password">
|
||||||
<ul>
|
<span class="help-block"></span>
|
||||||
@foreach ($errors->all() as $error)
|
</div>
|
||||||
<li>{{ $error }}</li>
|
<div class="form-group">
|
||||||
@endforeach
|
<label class="control-label">Confirm Password</label>
|
||||||
</ul>
|
<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>
|
</div>
|
||||||
@endif
|
</div>
|
||||||
|
|
||||||
<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>
|
||||||
</div>
|
</div>
|
||||||
@endsection
|
@endsection
|
||||||
|
|||||||
@@ -886,8 +886,8 @@
|
|||||||
<script src="{{asset('/designer/js/custom-script.js')}}"></script>
|
<script src="{{asset('/designer/js/custom-script.js')}}"></script>
|
||||||
<script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script>
|
<script src="https://gitcdn.github.io/bootstrap-toggle/2.2.2/js/bootstrap-toggle.min.js"></script>
|
||||||
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
|
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js"></script>
|
||||||
<script src="{{asset('/designer/js/centering_guidelines.js')}}"></script>
|
<script src="https://rawgit.com/fabricjs/fabric.js/master/lib/centering_guidelines.js"></script>
|
||||||
<script src="{{asset('/designer/js/aligning_guidelines.js')}}"></script>
|
<script src="https://rawgit.com/fabricjs/fabric.js/master/lib/aligning_guidelines.js"></script>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
|||||||
@@ -407,7 +407,7 @@
|
|||||||
<td align="left" style="width: 180px;">
|
<td align="left" style="width: 180px;">
|
||||||
@foreach($img_thumb as $img)
|
@foreach($img_thumb as $img)
|
||||||
@if($img->ProductId == $item->ProductId)
|
@if($img->ProductId == $item->ProductId)
|
||||||
<img style="height: 200px; overflow: hidden; object-fit: contain;" src="{{ minio_url('images/' . $img->Image) }}">
|
<img style="height: 200px; overflow: hidden; object-fit: contain;" src="{{ config('site_config.images_url') }}/{{ $img->Image }}">
|
||||||
@endif
|
@endif
|
||||||
@endforeach
|
@endforeach
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>Test Email — CREW Sportswear</title>
|
|
||||||
</head>
|
|
||||||
<body style="font-family: Arial, sans-serif; color: #333; padding: 20px;">
|
|
||||||
<h2 style="color: #d9534f;">CREW Sportswear — Test Email</h2>
|
|
||||||
<p>This is a test email to verify that the mail configuration is working correctly.</p>
|
|
||||||
<p>Sent to: <strong>{{ $recipient }}</strong></p>
|
|
||||||
<hr>
|
|
||||||
<p style="font-size: 12px; color: #777;">
|
|
||||||
<strong>Mail Config Used:</strong><br>
|
|
||||||
Driver: {{ $config['driver'] }}<br>
|
|
||||||
Host: {{ $config['host'] }}<br>
|
|
||||||
Port: {{ $config['port'] }}<br>
|
|
||||||
Username: {{ $config['username'] }}<br>
|
|
||||||
Encryption: {{ $config['encryption'] }}
|
|
||||||
</p>
|
|
||||||
<hr>
|
|
||||||
<p style="font-size: 12px; color: #aaa;">This is an automated test message from CREW Sportswear.</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
||||||
<title>404 | Page Not Found</title>
|
|
||||||
<style>
|
|
||||||
body {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
background: #f4f6f8;
|
|
||||||
color: #334155;
|
|
||||||
display: table;
|
|
||||||
font-family: Arial, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.container {
|
|
||||||
text-align: center;
|
|
||||||
display: table-cell;
|
|
||||||
vertical-align: middle;
|
|
||||||
padding: 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.content {
|
|
||||||
text-align: center;
|
|
||||||
display: inline-block;
|
|
||||||
background: #ffffff;
|
|
||||||
padding: 32px 28px;
|
|
||||||
border-radius: 10px;
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
max-width: 560px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.code {
|
|
||||||
font-size: 52px;
|
|
||||||
font-weight: 700;
|
|
||||||
line-height: 1;
|
|
||||||
color: #111827;
|
|
||||||
margin-bottom: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.title {
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #111827;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.message {
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 1.6;
|
|
||||||
margin-bottom: 22px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.actions a {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 10px 16px;
|
|
||||||
margin: 0 6px 8px;
|
|
||||||
text-decoration: none;
|
|
||||||
border-radius: 6px;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-primary {
|
|
||||||
background: #111827;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-secondary {
|
|
||||||
background: #ffffff;
|
|
||||||
color: #111827;
|
|
||||||
border: 1px solid #d1d5db;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="container">
|
|
||||||
<div class="content">
|
|
||||||
<div class="code">404</div>
|
|
||||||
<div class="title">Page Not Found</div>
|
|
||||||
<div class="message">The page you are looking for does not exist or may have been moved.</div>
|
|
||||||
<div class="actions">
|
|
||||||
<a href="{{ url('/') }}" class="btn-primary">Go to Home</a>
|
|
||||||
<a href="{{ url('teamstore') }}" class="btn-secondary">Browse Team Stores</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -21,22 +21,24 @@
|
|||||||
<div id="navbar" class="navbar-collapse collapse">
|
<div id="navbar" class="navbar-collapse collapse">
|
||||||
<ul class="nav navbar-nav navbar-right navbar-nav-custom">
|
<ul class="nav navbar-nav navbar-right navbar-nav-custom">
|
||||||
@if (Request::segment(2) == "hi-five-sports-club" || Request::segment(2) == "hi-five-sports-zone")
|
@if (Request::segment(2) == "hi-five-sports-club" || Request::segment(2) == "hi-five-sports-zone")
|
||||||
<li class="nav-item-main"></li>
|
<li style="font-size: 14px;"></li>
|
||||||
@else
|
@else
|
||||||
<li class="nav-item-main">
|
<li style="font-size: 14px;">
|
||||||
<a href="{{ url('teamstore') }}" class="nav-link-main"><span>Team Store</span></a>
|
|
||||||
|
<a href="{{ url('teamstore') }}"><span style="text-transform:uppercase;">Team Store</span></a>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
<li class="nav-item-main">
|
<li style="font-size: 14px;">
|
||||||
<a href="{{ url('cart') }}" class="nav-link-main"><span>My Cart</span> <i class="fa fa-shopping-cart"></i>
|
<a href="{{ url('cart') }}"><span style="text-transform:uppercase;">My Cart</span> <i class="fa fa-shopping-cart"></i>
|
||||||
<span class="badge" id="my-cart-count">{{ \App\Http\Controllers\MainController::getCountCart() }}</span>
|
<span class="badge" id="my-cart-count">{{ \App\Http\Controllers\MainController::getCountCart() }}</span>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="#" class="dropdown-toggle user-profile nav-menu-toggle" data-toggle="dropdown" role="button" aria-expanded="false"><i class="fa fa-bars"></i></a>
|
<a href="#" class="dropdown-toggle user-profile" data-toggle="dropdown" role="button" aria-expanded="false"><i class="fa fa-bars" style="font-size: 21px;"></i></a>
|
||||||
<ul class="dropdown-menu navbar-menu-dropdown">
|
<ul class="dropdown-menu">
|
||||||
@if (Auth::guest())
|
@if (Auth::guest())
|
||||||
|
|
||||||
@if(Request::segment(1) == "designer")
|
@if(Request::segment(1) == "designer")
|
||||||
@@ -48,10 +50,10 @@
|
|||||||
</li>
|
</li>
|
||||||
@else
|
@else
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ url('/auth/login') }}" title="Login">Sign in</a>
|
<a href="{{ url('/login') }}" title="Login">Sign in</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ url('/auth/register') }}" title="Register">Register</a>
|
<a href="{{ url('/register') }}" title="Register">Register</a>
|
||||||
</li>
|
</li>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
@@ -86,155 +88,6 @@
|
|||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.navbar-custom {
|
|
||||||
min-height: 78px;
|
|
||||||
background: #ffffff;
|
|
||||||
border: 0;
|
|
||||||
border-bottom: 1px solid #e5e7eb;
|
|
||||||
box-shadow: 0 2px 8px rgba(15, 23, 42, 0.08);
|
|
||||||
margin-bottom: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-custom .container {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-brand {
|
|
||||||
height: 78px;
|
|
||||||
padding: 10px 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-brand>img {
|
|
||||||
height: 58px;
|
|
||||||
padding: 0;
|
|
||||||
width: auto;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-nav-custom > li > a.nav-link-main {
|
|
||||||
color: #1f2937 !important;
|
|
||||||
font-size: 13px;
|
|
||||||
font-weight: 700;
|
|
||||||
text-transform: uppercase;
|
|
||||||
letter-spacing: 0.45px;
|
|
||||||
border-radius: 8px;
|
|
||||||
padding: 8px 12px;
|
|
||||||
margin-top: 0;
|
|
||||||
transition: background-color 0.2s, color 0.2s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-nav-custom > li > a.nav-link-main:hover,
|
|
||||||
.navbar-nav-custom > li > a.nav-link-main:focus {
|
|
||||||
color: #111827 !important;
|
|
||||||
background: #f3f4f6 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-menu-toggle {
|
|
||||||
margin-top: 0 !important;
|
|
||||||
border: 1px solid #d1d5db;
|
|
||||||
border-radius: 8px;
|
|
||||||
width: 42px;
|
|
||||||
height: 42px;
|
|
||||||
display: flex !important;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
color: #374151 !important;
|
|
||||||
transition: background-color 0.2s, border-color 0.2s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-menu-toggle:hover,
|
|
||||||
.nav-menu-toggle:focus {
|
|
||||||
background: #f3f4f6 !important;
|
|
||||||
border-color: #9ca3af;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-menu-toggle i {
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-menu-dropdown {
|
|
||||||
margin-top: 8px;
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
border-radius: 10px;
|
|
||||||
overflow: hidden;
|
|
||||||
box-shadow: 0 10px 24px rgba(15, 23, 42, 0.14);
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-menu-dropdown > li > a {
|
|
||||||
padding: 10px 14px;
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-menu-dropdown > li > a:hover {
|
|
||||||
background: #f8fafc;
|
|
||||||
color: #111827;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-menu-dropdown .dropdown-header {
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #334155;
|
|
||||||
padding: 10px 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.badge {
|
|
||||||
font-size: 11px;
|
|
||||||
min-width: 24px;
|
|
||||||
height: 24px;
|
|
||||||
line-height: 24px;
|
|
||||||
border-radius: 999px;
|
|
||||||
background: #16a34a;
|
|
||||||
padding: 0 7px;
|
|
||||||
margin-left: 6px;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-toggle {
|
|
||||||
margin-top: 22px;
|
|
||||||
border: 1px solid #d1d5db;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-toggle .icon-bar {
|
|
||||||
background: #374151 !important;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 768px) {
|
|
||||||
.navbar-nav-custom {
|
|
||||||
min-height: 78px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-nav-custom > li {
|
|
||||||
float: none;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 768px){
|
|
||||||
.navbar-default .navbar-collapse,
|
|
||||||
.navbar-default .navbar-form {
|
|
||||||
margin-top: 12px;
|
|
||||||
border-top: 1px solid #e5e7eb;
|
|
||||||
background: #ffffff;
|
|
||||||
border-radius: 10px;
|
|
||||||
padding: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.navbar-nav-custom > li > a.nav-link-main {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.nav-menu-toggle {
|
|
||||||
margin-top: 0 !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 768px){
|
|
||||||
.navbar-default .navbar-nav>li>a {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#nav{
|
#nav{
|
||||||
list-style:none;
|
list-style:none;
|
||||||
margin-bottom:10px;
|
margin-bottom:10px;
|
||||||
@@ -290,8 +143,41 @@
|
|||||||
background:#3d4248;
|
background:#3d4248;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.navbar-brand {
|
||||||
|
padding: 0px; /* firefox bug fix */
|
||||||
|
}
|
||||||
|
.navbar-brand>img {
|
||||||
|
height: 200%;
|
||||||
|
padding: 15px; /* firefox bug fix */
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-custom{
|
||||||
|
min-height: 100px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 768px){
|
||||||
|
.navbar-default .navbar-collapse, .navbar-default .navbar-form{
|
||||||
|
margin-top: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 768px){
|
||||||
|
.navbar-default .navbar-nav>li>a{
|
||||||
|
margin-top: 23px;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.badge{
|
||||||
|
font-size: 14px;
|
||||||
|
width:35px;
|
||||||
|
border-radius: 0px;
|
||||||
|
}
|
||||||
|
|
||||||
.navbar-default .navbar-nav>li>a:hover {
|
.navbar-default .navbar-nav>li>a:hover {
|
||||||
background-color: #f3f4f6;
|
background-color: #777;
|
||||||
}
|
}
|
||||||
|
|
||||||
.modal {
|
.modal {
|
||||||
@@ -312,158 +198,6 @@
|
|||||||
text-align: left;
|
text-align: left;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
#about_us_modal .modal-content {
|
|
||||||
border: 0;
|
|
||||||
border-radius: 12px;
|
|
||||||
overflow: hidden;
|
|
||||||
box-shadow: 0 14px 34px rgba(0, 0, 0, 0.22);
|
|
||||||
}
|
|
||||||
|
|
||||||
#about_us_modal .modal-header {
|
|
||||||
background: #f8fafc;
|
|
||||||
border-bottom: 1px solid #e5e7eb;
|
|
||||||
padding: 16px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#about_us_modal .modal-title {
|
|
||||||
font-size: 20px;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #111827;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-us-content {
|
|
||||||
color: #334155;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1.7;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-us-intro {
|
|
||||||
margin: 0 0 14px;
|
|
||||||
color: #475569;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-us-block {
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
border-radius: 10px;
|
|
||||||
padding: 14px;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
background: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-us-block h5 {
|
|
||||||
margin: 0 0 8px;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #111827;
|
|
||||||
text-transform: uppercase;
|
|
||||||
letter-spacing: 0.3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-us-block p {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-us-list {
|
|
||||||
margin: 0;
|
|
||||||
padding-left: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.about-us-list li {
|
|
||||||
margin-bottom: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#about_us_modal .modal-footer {
|
|
||||||
border-top: 1px solid #e5e7eb;
|
|
||||||
background: #f8fafc;
|
|
||||||
padding: 12px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 767px) {
|
|
||||||
.about-us-block {
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#contact_us_modal .modal-content {
|
|
||||||
border: 0;
|
|
||||||
border-radius: 12px;
|
|
||||||
overflow: hidden;
|
|
||||||
box-shadow: 0 14px 34px rgba(0, 0, 0, 0.22);
|
|
||||||
}
|
|
||||||
|
|
||||||
#contact_us_modal .modal-header {
|
|
||||||
background: #f8fafc;
|
|
||||||
border-bottom: 1px solid #e5e7eb;
|
|
||||||
padding: 16px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#contact_us_modal .modal-title {
|
|
||||||
font-size: 20px;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #111827;
|
|
||||||
}
|
|
||||||
|
|
||||||
#contact_us_modal .modal-body {
|
|
||||||
padding: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-modal-subtitle {
|
|
||||||
margin: 0 0 16px;
|
|
||||||
font-size: 14px;
|
|
||||||
color: #6b7280;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-card {
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
border-radius: 10px;
|
|
||||||
padding: 14px;
|
|
||||||
background: #fff;
|
|
||||||
min-height: 140px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-card-title {
|
|
||||||
margin: 0 0 10px;
|
|
||||||
font-size: 13px;
|
|
||||||
font-weight: 700;
|
|
||||||
text-transform: uppercase;
|
|
||||||
letter-spacing: 0.4px;
|
|
||||||
color: #6b7280;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-card-value {
|
|
||||||
margin: 0;
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 1.6;
|
|
||||||
color: #111827;
|
|
||||||
word-break: break-word;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-card-value a {
|
|
||||||
color: #1d4ed8;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-card-value a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
#contact_us_modal .modal-footer {
|
|
||||||
border-top: 1px solid #e5e7eb;
|
|
||||||
background: #f8fafc;
|
|
||||||
padding: 12px 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 767px) {
|
|
||||||
#contact_us_modal .modal-body {
|
|
||||||
padding: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.contact-card {
|
|
||||||
min-height: 0;
|
|
||||||
margin-bottom: 12px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<!-- Privacy Modal -->
|
<!-- Privacy Modal -->
|
||||||
@@ -514,31 +248,7 @@
|
|||||||
<h4 class="modal-title">About Us</h4>
|
<h4 class="modal-title">About Us</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body">
|
||||||
<div class="about-us-content">
|
<p>Coming soon.</p>
|
||||||
<p class="about-us-intro">Crew Sportswear helps teams, schools, and organizations bring their identity to life through high-quality custom apparel and team store experiences.</p>
|
|
||||||
|
|
||||||
<div class="about-us-block">
|
|
||||||
<h5>Who We Are</h5>
|
|
||||||
<p>We are a team focused on custom uniforms, spirit wear, and branded gear built for athletes, students, and supporters. Our goal is to make ordering team apparel simple, consistent, and reliable.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="about-us-block">
|
|
||||||
<h5>What We Do</h5>
|
|
||||||
<ul class="about-us-list">
|
|
||||||
<li>Custom team uniforms and apparel across multiple sports</li>
|
|
||||||
<li>Print-on-demand production for flexible ordering and fulfillment</li>
|
|
||||||
<li>Design-your-own apparel with our online designer tool</li>
|
|
||||||
<li>Private or public online team stores for easy ordering</li>
|
|
||||||
<li>Batch and individual order workflows depending on program needs</li>
|
|
||||||
<li>Support for team branding, sizing, and product selection</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="about-us-block">
|
|
||||||
<h5>Our Commitment</h5>
|
|
||||||
<p>We’re committed to clear communication, dependable production quality, and a smooth customer experience from store launch through fulfillment.</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||||
@@ -556,28 +266,15 @@
|
|||||||
<button type="button" class="close" data-dismiss="modal">×</button>
|
<button type="button" class="close" data-dismiss="modal">×</button>
|
||||||
<h4 class="modal-title">Contact Us</h4>
|
<h4 class="modal-title">Contact Us</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-body">
|
<div class="modal-body text-center">
|
||||||
<p class="contact-modal-subtitle">We’re here to help. Reach out through any of the contact options below.</p>
|
<h1>Contact Us</h1>
|
||||||
<div class="row">
|
<hr>
|
||||||
<div class="col-sm-6">
|
<h3>Email Address: <small><a href="#">customer-service@crewsportswear.com</a></small></h3>
|
||||||
<div class="contact-card">
|
<h3>Address: <small><a href="#">1281 Humbracht Circle
|
||||||
<h5 class="contact-card-title">Email Address</h5>
|
Suite J
|
||||||
<p class="contact-card-value">
|
Bartlett, Illinois
|
||||||
<a href="mailto:customer-service@crewsportswear.com">customer-service@crewsportswear.com</a>
|
60103</a></small>
|
||||||
</p>
|
</h3>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-6">
|
|
||||||
<div class="contact-card">
|
|
||||||
<h5 class="contact-card-title">Address</h5>
|
|
||||||
<p class="contact-card-value">
|
|
||||||
1281 Humbracht Circle<br>
|
|
||||||
Suite J<br>
|
|
||||||
Bartlett, Illinois 60103
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="modal-footer">
|
<div class="modal-footer">
|
||||||
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||||
|
|||||||
@@ -1,171 +1,96 @@
|
|||||||
<style>
|
<div>
|
||||||
.privacy-policy {
|
<div>Privacy Policy</div>
|
||||||
color: #334155;
|
<br />
|
||||||
font-size: 14px;
|
<div>Your privacy is important to us. It is Crew Sportswear's policy to respect your privacy regarding any information we may collect from you across our website, http://crewsportswear.com, and other sites we own and operate.</div>
|
||||||
line-height: 1.7;
|
<br />
|
||||||
}
|
<div>1. Information we collect</div>
|
||||||
|
<br />
|
||||||
.privacy-title {
|
<div>Log data</div>
|
||||||
margin: 0 0 6px;
|
<br />
|
||||||
font-size: 26px;
|
<div>When you visit our website, our servers may automatically log the standard data provided by your web browser. It may include your computer’s Internet Protocol (IP) address, your browser type and version, the pages you visit, the time and date of your visit, the time spent on each page, and other details.</div>
|
||||||
font-weight: 700;
|
<br /><br />
|
||||||
color: #111827;
|
<div>Personal information</div>
|
||||||
}
|
<br />
|
||||||
|
<div>We may ask for personal information, such as your:</div>
|
||||||
.privacy-intro {
|
<br /><br />
|
||||||
margin: 0 0 18px;
|
<div>NameEmailSocial media profilesDate of birthPhone/mobile numberHome/Mailing addressWork addressPayment information</div>
|
||||||
color: #64748b;
|
<br />
|
||||||
}
|
<div>2. Legal bases for processing</div>
|
||||||
|
<br />
|
||||||
.privacy-section {
|
<div>We will process your personal information lawfully, fairly and in a transparent manner. We collect and process information about you only where we have legal bases for doing so.</div>
|
||||||
background: #ffffff;
|
<div> </div>
|
||||||
border: 1px solid #e5e7eb;
|
<div>These legal bases depend on the services you use and how you use them, meaning we collect and use your information only where:</div>
|
||||||
border-radius: 10px;
|
<div> </div>
|
||||||
padding: 14px 16px;
|
<br />
|
||||||
margin-bottom: 12px;
|
<div> it’s necessary for the performance of a contract to which you are a party or to take steps at your request before entering into such a contract (for example, when we provide a service you request from us);</div>
|
||||||
}
|
<div> it satisfies a legitimate interest (which is not overridden by your data protection interests), such as for research and development, to market and promote our services, and to protect our legal rights and interests;</div>
|
||||||
|
<div> you give us consent to do so for a specific purpose (for example, you might consent to us sending you our newsletter); or</div>
|
||||||
.privacy-section h5 {
|
<div> we need to process your data to comply with a legal obligation.</div>
|
||||||
margin: 0 0 8px;
|
<br />
|
||||||
font-size: 15px;
|
<div> </div>
|
||||||
font-weight: 700;
|
<div>Where you consent to our use of information about you for a specific purpose, you have the right to change your mind at any time (but this will not affect any processing that has already taken place).</div>
|
||||||
color: #111827;
|
<div> </div>
|
||||||
}
|
<div>We don’t keep personal information for longer than is necessary. While we retain this information, we will protect it within commercially acceptable means to prevent loss and theft, as well as unauthorised access, disclosure, copying, use or modification. That said, we advise that no method of electronic transmission or storage is 100% secure and cannot guarantee absolute data security. If necessary, we may retain your personal information for our compliance with a legal obligation or in order to protect your vital interests or the vital interests of another natural person.</div>
|
||||||
|
<br />
|
||||||
.privacy-section p {
|
<div>3. Collection and use of information</div>
|
||||||
margin: 0 0 10px;
|
<br />
|
||||||
}
|
<div>We may collect, hold, use and disclose information for the following purposes and personal information will not be further processed in a manner that is incompatible with these purposes:</div>
|
||||||
|
<br /><br />
|
||||||
.privacy-section p:last-child {
|
<div>to enable you to customise or personalise your experience of our website;to enable you to access and use our website, associated applications and associated social media platforms;to contact and communicate with you;for internal record keeping and administrative purposes;for analytics, market research and business development, including to operate and improve our website, associated applications and associated social media platforms;to run competitions and/or offer additional benefits to you;for advertising and marketing, including to send you promotional information about our products and services and information about third parties that we consider may be of interest to you; andto comply with our legal obligations and resolve any disputes that we may have.</div>
|
||||||
margin-bottom: 0;
|
<br />
|
||||||
}
|
<div>4. Disclosure of personal information to third parties</div>
|
||||||
|
<br />
|
||||||
.privacy-section ul {
|
<div>We may disclose personal information to:</div>
|
||||||
margin: 0 0 10px 18px;
|
<br /><br />
|
||||||
padding: 0;
|
<div>third party service providers for the purpose of enabling them to provide their services, including (without limitation) IT service providers, data storage, hosting and server providers, ad networks, analytics, error loggers, debt collectors, maintenance or problem-solving providers, marketing or advertising providers, professional advisors and payment systems operators;our employees, contractors and/or related entities; andcredit reporting agencies, courts, tribunals and regulatory authorities, in the event you fail to pay for goods or services we have provided to you.</div>
|
||||||
}
|
<br />
|
||||||
|
<div>5. International transfers of personal information</div>
|
||||||
.privacy-section li {
|
<br />
|
||||||
margin-bottom: 5px;
|
<div>The personal information we collect is stored and processed in United States, or where we or our partners, affiliates and third-party providers maintain facilities. By providing us with your personal information, you consent to the disclosure to these overseas third parties.</div>
|
||||||
}
|
<br />
|
||||||
|
<div>We will ensure that any transfer of personal information from countries in the European Economic Area (EEA) to countries outside the EEA will be protected by appropriate safeguards, for example by using standard data protection clauses approved by the European Commission, or the use of binding corporate rules or other legally accepted means.</div>
|
||||||
.privacy-footnote {
|
<br />
|
||||||
margin-top: 12px;
|
<div>Where we transfer personal information from a non-EEA country to another country, you acknowledge that third parties in other jurisdictions may not be subject to similar data protection laws to the ones in our jurisdiction. There are risks if any such third party engages in any act or practice that would contravene the data privacy laws in our jurisdiction and this might mean that you will not be able to seek redress under our jurisdiction’s privacy laws.</div>
|
||||||
border-top: 1px solid #e5e7eb;
|
<br />
|
||||||
padding-top: 12px;
|
<div>6. Your rights and controlling your personal information</div>
|
||||||
font-size: 13px;
|
<br />
|
||||||
color: #6b7280;
|
<div>Choice and consent: By providing personal information to us, you consent to us collecting, holding, using and disclosing your personal information in accordance with this privacy policy. If you are under 16 years of age, you must have, and warrant to the extent permitted by law to us, that you have your parent or legal guardian’s permission to access and use the website and they (your parents or guardian) have consented to you providing us with your personal information. You do not have to provide personal information to us, however, if you do not, it may affect your use of this website or the products and/or services offered on or through it.</div>
|
||||||
}
|
<br />
|
||||||
|
<div>Information from third parties: If we receive personal information about you from a third party, we will protect it as set out in this privacy policy. If you are a third party providing personal information about somebody else, you represent and warrant that you have such person’s consent to provide the personal information to us.</div>
|
||||||
.privacy-contact {
|
<br />
|
||||||
background: #f8fafc;
|
<div>Restrict: You may choose to restrict the collection or use of your personal information. If you have previously agreed to us using your personal information for direct marketing purposes, you may change your mind at any time by contacting us using the details below. If you ask us to restrict or limit how we process your personal information, we will let you know how the restriction affects your use of our website or products and services.</div>
|
||||||
}
|
<br />
|
||||||
</style>
|
<div>Access and data portability: You may request details of the personal information that we hold about you. You may request a copy of the personal information we hold about you. Where possible, we will provide this information in CSV format or other easily readable machine format. You may request that we erase the personal information we hold about you at any time. You may also request that we transfer this personal information to another third party.</div>
|
||||||
|
<br />
|
||||||
<div class="privacy-policy">
|
<div>Correction: If you believe that any information we hold about you is inaccurate, out of date, incomplete, irrelevant or misleading, please contact us using the details below. We will take reasonable steps to correct any information found to be inaccurate, incomplete, misleading or out of date.</div>
|
||||||
<h3 class="privacy-title">Privacy Policy</h3>
|
<br />
|
||||||
<p class="privacy-intro">Your privacy is important to us. It is Crew Sportswear's policy to respect your privacy regarding any information we may collect from you across our website, http://crewsportswear.com, and other sites we own and operate.</p>
|
<div>Notification of data breaches: We will comply laws applicable to us in respect of any data breach.</div>
|
||||||
|
<br />
|
||||||
<div class="privacy-section">
|
<div>Complaints: If you believe that we have breached a relevant data protection law and wish to make a complaint, please contact us using the details below and provide us with full details of the alleged breach. We will promptly investigate your complaint and respond to you, in writing, setting out the outcome of our investigation and the steps we will take to deal with your complaint. You also have the right to contact a regulatory body or data protection authority in relation to your complaint.</div>
|
||||||
<h5>1. Information we collect</h5>
|
<br />
|
||||||
<p><strong>Log data:</strong> When you visit our website, our servers may automatically log the standard data provided by your web browser. It may include your computer’s Internet Protocol (IP) address, your browser type and version, the pages you visit, the time and date of your visit, the time spent on each page, and other details.</p>
|
<div>Unsubscribe: To unsubscribe from our e-mail database or opt-out of communications (including marketing communications), please contact us using the details below or opt-out using the opt-out facilities provided in the communication.</div>
|
||||||
<p><strong>Personal information:</strong> We may ask for personal information, such as your:</p>
|
<br />
|
||||||
<ul>
|
<div>7. Cookies</div>
|
||||||
<li>Name</li>
|
<br />
|
||||||
<li>Email</li>
|
<div>We use “cookies” to collect information about you and your activity across our site. A cookie is a small piece of data that our website stores on your computer, and accesses each time you visit, so we can understand how you use our site. This helps us serve you content based on preferences you have specified. Please refer to our Cookie Policy for more information.</div>
|
||||||
<li>Social media profiles</li>
|
<br />
|
||||||
<li>Date of birth</li>
|
<div>8. Business transfers</div>
|
||||||
<li>Phone/mobile number</li>
|
<br />
|
||||||
<li>Home/Mailing address</li>
|
<div>If we or our assets are acquired, or in the unlikely event that we go out of business or enter bankruptcy, we would include data among the assets transferred to any parties who acquire us. You acknowledge that such transfers may occur, and that any parties who acquire us may continue to use your personal information according to this policy.</div>
|
||||||
<li>Work address</li>
|
<br />
|
||||||
<li>Payment information</li>
|
<div>9. Limits of our policy</div>
|
||||||
</ul>
|
<br />
|
||||||
</div>
|
<div>Our website may link to external sites that are not operated by us. Please be aware that we have no control over the content and policies of those sites, and cannot accept responsibility or liability for their respective privacy practices.</div>
|
||||||
|
<br />
|
||||||
<div class="privacy-section">
|
<div>10. Changes to this policy</div>
|
||||||
<h5>2. Legal bases for processing</h5>
|
<br />
|
||||||
<p>We will process your personal information lawfully, fairly and in a transparent manner. We collect and process information about you only where we have legal bases for doing so.</p>
|
<div>At our discretion, we may change our privacy policy to reflect current acceptable practices. We will take reasonable steps to let users know about changes via our website. Your continued use of this site after any changes to this policy will be regarded as acceptance of our practices around privacy and personal information.</div>
|
||||||
<p>These legal bases depend on the services you use and how you use them, meaning we collect and use your information only where:</p>
|
<br />
|
||||||
<ul>
|
<div>If we make a significant change to this privacy policy, for example changing a lawful basis on which we process your personal information, we will ask you to re-consent to the amended privacy policy.</div>
|
||||||
<li>it’s necessary for the performance of a contract to which you are a party or to take steps at your request before entering into such a contract;</li>
|
<br /><br />
|
||||||
<li>it satisfies a legitimate interest (which is not overridden by your data protection interests), such as research and development, marketing and legal protection;</li>
|
<div>Crew Sportswear Data Controller</div>
|
||||||
<li>you give us consent to do so for a specific purpose; or</li>
|
<div>Angelo Garcia</div>
|
||||||
<li>we need to process your data to comply with a legal obligation.</li>
|
<div>angelo@crewsportswear.com</div>
|
||||||
</ul>
|
<br /><br /><br />
|
||||||
<p>Where you consent to our use of information about you for a specific purpose, you have the right to change your mind at any time (but this will not affect any processing that has already taken place).</p>
|
<div>This policy is effective as of 23 February 2019.</div>
|
||||||
<p>We don’t keep personal information for longer than is necessary. While we retain this information, we will protect it within commercially acceptable means to prevent loss and theft, as well as unauthorised access, disclosure, copying, use or modification. That said, we advise that no method of electronic transmission or storage is 100% secure and cannot guarantee absolute data security.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="privacy-section">
|
|
||||||
<h5>3. Collection and use of information</h5>
|
|
||||||
<p>We may collect, hold, use and disclose information for the following purposes and personal information will not be further processed in a manner that is incompatible with these purposes:</p>
|
|
||||||
<ul>
|
|
||||||
<li>to enable you to customise or personalise your experience of our website;</li>
|
|
||||||
<li>to enable you to access and use our website, associated applications and associated social media platforms;</li>
|
|
||||||
<li>to contact and communicate with you;</li>
|
|
||||||
<li>for internal record keeping and administrative purposes;</li>
|
|
||||||
<li>for analytics, market research and business development;</li>
|
|
||||||
<li>to run competitions and/or offer additional benefits;</li>
|
|
||||||
<li>for advertising and marketing communications; and</li>
|
|
||||||
<li>to comply with legal obligations and resolve disputes.</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="privacy-section">
|
|
||||||
<h5>4. Disclosure of personal information to third parties</h5>
|
|
||||||
<p>We may disclose personal information to:</p>
|
|
||||||
<ul>
|
|
||||||
<li>third party service providers (including IT, hosting, analytics, marketing, advisors, and payment providers);</li>
|
|
||||||
<li>our employees, contractors and/or related entities; and</li>
|
|
||||||
<li>credit reporting agencies, courts, tribunals and regulatory authorities where required.</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="privacy-section">
|
|
||||||
<h5>5. International transfers of personal information</h5>
|
|
||||||
<p>The personal information we collect is stored and processed in United States, or where we or our partners, affiliates and third-party providers maintain facilities. By providing us with your personal information, you consent to disclosure to these overseas third parties.</p>
|
|
||||||
<p>We will ensure that any transfer of personal information from countries in the European Economic Area (EEA) to countries outside the EEA is protected by appropriate safeguards.</p>
|
|
||||||
<p>Where we transfer personal information from a non-EEA country to another country, you acknowledge that third parties in other jurisdictions may not be subject to similar data protection laws.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="privacy-section">
|
|
||||||
<h5>6. Your rights and controlling your personal information</h5>
|
|
||||||
<p><strong>Choice and consent:</strong> By providing personal information to us, you consent to us collecting, holding, using and disclosing your personal information in accordance with this privacy policy.</p>
|
|
||||||
<p><strong>Information from third parties:</strong> If we receive personal information about you from a third party, we will protect it as set out in this privacy policy.</p>
|
|
||||||
<p><strong>Restrict:</strong> You may choose to restrict the collection or use of your personal information.</p>
|
|
||||||
<p><strong>Access and data portability:</strong> You may request details or a copy of the personal information we hold about you, and request transfer to another third party where possible.</p>
|
|
||||||
<p><strong>Correction:</strong> If you believe any information we hold is inaccurate or out of date, please contact us so we can correct it.</p>
|
|
||||||
<p><strong>Notification of data breaches:</strong> We will comply with laws applicable to us in respect of any data breach.</p>
|
|
||||||
<p><strong>Complaints:</strong> If you believe we have breached a relevant data protection law, please contact us with full details and we will promptly investigate.</p>
|
|
||||||
<p><strong>Unsubscribe:</strong> To unsubscribe from communications, contact us using the details below or use opt-out facilities provided in communications.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="privacy-section">
|
|
||||||
<h5>7. Cookies</h5>
|
|
||||||
<p>We use “cookies” to collect information about you and your activity across our site. A cookie is a small piece of data that our website stores on your computer and accesses each time you visit. Please refer to our Cookie Policy for more information.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="privacy-section">
|
|
||||||
<h5>8. Business transfers</h5>
|
|
||||||
<p>If we or our assets are acquired, or if we go out of business or enter bankruptcy, data may be transferred to parties who acquire us. Any acquiring parties may continue to use your personal information according to this policy.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="privacy-section">
|
|
||||||
<h5>9. Limits of our policy</h5>
|
|
||||||
<p>Our website may link to external sites that are not operated by us. We have no control over the content and policies of those sites and cannot accept responsibility or liability for their respective privacy practices.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="privacy-section">
|
|
||||||
<h5>10. Changes to this policy</h5>
|
|
||||||
<p>At our discretion, we may change our privacy policy to reflect current acceptable practices. We will take reasonable steps to let users know about changes via our website. Your continued use of this site after changes to this policy will be regarded as acceptance of our practices around privacy and personal information.</p>
|
|
||||||
<p>If we make a significant change to this privacy policy, such as changing a lawful basis on which we process your personal information, we will ask you to re-consent to the amended privacy policy.</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="privacy-section privacy-contact">
|
|
||||||
<h5>Crew Sportswear Data Controller</h5>
|
|
||||||
<p>Angelo Garcia</p>
|
|
||||||
<p><a href="mailto:angelo@crewsportswear.com">angelo@crewsportswear.com</a></p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<p class="privacy-footnote">This policy is effective as of 23 February 2019.</p>
|
|
||||||
</div>
|
</div>
|
||||||
@@ -2,223 +2,15 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
body {
|
|
||||||
background: #f4f6f8;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-breadcrumb .breadcrumb {
|
|
||||||
background: #ffffff;
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
border-radius: 10px;
|
|
||||||
margin-bottom: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-title {
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #111827;
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-title-row hr {
|
|
||||||
border-color: #e5e7eb;
|
|
||||||
margin-top: 12px;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-card {
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
border-radius: 12px;
|
|
||||||
padding: 14px;
|
|
||||||
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
|
|
||||||
margin-bottom: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-card h3,
|
|
||||||
.cart-card h4,
|
|
||||||
.cart-card h5 {
|
|
||||||
color: #111827;
|
|
||||||
}
|
|
||||||
|
|
||||||
.summary-line {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
gap: 10px;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.summary-line .summary-label {
|
|
||||||
font-weight: 700;
|
|
||||||
color: #111827;
|
|
||||||
}
|
|
||||||
|
|
||||||
.summary-line .summary-value {
|
|
||||||
text-align: right;
|
|
||||||
color: #374151;
|
|
||||||
font-weight: 600;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
|
|
||||||
.summary-total {
|
|
||||||
margin-top: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.summary-total .summary-label {
|
|
||||||
font-size: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.summary-total .summary-value {
|
|
||||||
font-size: 22px;
|
|
||||||
color: #111827;
|
|
||||||
}
|
|
||||||
|
|
||||||
.summary-total-currency {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #6b7280;
|
|
||||||
font-weight: 600;
|
|
||||||
margin-left: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.order-summary {
|
|
||||||
position: sticky;
|
|
||||||
top: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-summary-title {
|
|
||||||
margin: 0;
|
|
||||||
font-size: 20px;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-store-head img {
|
|
||||||
border-radius: 6px;
|
|
||||||
margin-right: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-item-block + .cart-item-block {
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-items-shell {
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-items-shell .cart-store-head {
|
|
||||||
padding: 14px;
|
|
||||||
border-bottom: 1px solid #e5e7eb;
|
|
||||||
background: #f8fafc;
|
|
||||||
border-radius: 12px 12px 0 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-items-shell .cart-store-head h4 {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-items-shell .cart-item-block {
|
|
||||||
margin: 0;
|
|
||||||
border: 0;
|
|
||||||
border-bottom: 1px solid #e5e7eb;
|
|
||||||
border-radius: 0;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-items-shell .cart-item-block:last-child {
|
|
||||||
border-bottom: 0;
|
|
||||||
border-radius: 0 0 12px 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-item-title {
|
|
||||||
margin-top: 0;
|
|
||||||
margin-bottom: 8px;
|
|
||||||
font-size: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-item-title a {
|
|
||||||
color: #1f2937;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-item-title a:hover {
|
|
||||||
color: #0f172a;
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-meta {
|
|
||||||
color: #6b7280;
|
|
||||||
font-size: 13px;
|
|
||||||
margin-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-table-wrap .table {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-table-wrap .table > thead > tr > th {
|
|
||||||
border-bottom: 1px solid #e5e7eb;
|
|
||||||
font-size: 12px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
letter-spacing: 0.3px;
|
|
||||||
color: #64748b;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-table-wrap .table > tbody > tr > td {
|
|
||||||
border-top: 1px solid #f1f5f9;
|
|
||||||
vertical-align: middle;
|
|
||||||
font-size: 13px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-remove-btn {
|
|
||||||
color: #ef4444;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-remove-btn:hover {
|
|
||||||
color: #b91c1c;
|
|
||||||
}
|
|
||||||
|
|
||||||
.voucher-row .btn {
|
|
||||||
border-radius: 6px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.checkout-btn {
|
|
||||||
background-color: #ffc300;
|
|
||||||
border-color: #e2ad00;
|
|
||||||
text-align: -webkit-center;
|
|
||||||
border-radius: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.checkout-btn:hover {
|
|
||||||
background-color: #ffcf33;
|
|
||||||
border-color: #d39b00;
|
|
||||||
}
|
|
||||||
|
|
||||||
.continue-btn {
|
|
||||||
border-radius: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-cart {
|
|
||||||
color: #94a3b8;
|
|
||||||
text-align: center;
|
|
||||||
margin: 40px 0;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.previewImage{
|
.previewImage{
|
||||||
height: 150px;
|
height: 150px;
|
||||||
width: 95%;
|
width: 95%;
|
||||||
overflow:hidden;
|
overflow:hidden;
|
||||||
object-fit: contain;
|
object-fit: contain;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 991px) {
|
|
||||||
.order-summary {
|
|
||||||
position: static;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="row cart-breadcrumb">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<ol class="breadcrumb">
|
<ol class="breadcrumb">
|
||||||
@if(isset($store_array[0]->StoreUrl))
|
@if(isset($store_array[0]->StoreUrl))
|
||||||
@@ -231,9 +23,9 @@ body {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row cart-title-row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<h2 class="cart-title">My Cart</h2>
|
<h2 style="font-size: 20px; font-weight: bold;">MY CART</h2>
|
||||||
@if(Session::has('cartkeyError'))
|
@if(Session::has('cartkeyError'))
|
||||||
<div class="alert alert-danger alert-dismissible">
|
<div class="alert alert-danger alert-dismissible">
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||||
@@ -245,11 +37,11 @@ body {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@if(collect($row)->count() > 0)
|
@if($row && count($row) > 0)
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-4 col-md-push-8 order-summary" >
|
<div class="col-md-4 col-md-push-8 order-summary" >
|
||||||
<div class="cart-card">
|
<div style="border: 1px solid #e2e2e2; padding: 10px; border-bottom: none;">
|
||||||
@if(Session::has('msg'))
|
@if(Session::has('msg'))
|
||||||
<div class="alert alert-warning alert-dismissible">
|
<div class="alert alert-warning alert-dismissible">
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button>
|
||||||
@@ -257,45 +49,46 @@ body {
|
|||||||
{!! Session::get('msg') !!}
|
{!! Session::get('msg') !!}
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
<h3 class="cart-summary-title">Order Summary</h3>
|
<h3>Order Summary</h3>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if (!Auth::guest())
|
||||||
|
|
||||||
|
<div style="border: 1px solid #e2e2e2; padding: 10px; border-bottom: none;">
|
||||||
|
|
||||||
@if (!Auth::guest())
|
|
||||||
<hr>
|
|
||||||
<p><strong>Ship to:</strong></p>
|
<p><strong>Ship to:</strong></p>
|
||||||
|
|
||||||
@if ($address_book === null)
|
@if ($address_book === null)
|
||||||
<a href="{{ url('user/address-book/create') }}">[ Add ]</a>
|
<a href="{{ url('user/address-book/create') }}">[ Add ]</a>
|
||||||
@else
|
@else
|
||||||
<div>{{ $address_book[0]->Fullname }}</div>
|
<div>{{ $address_book[0]->Fullname }}</div>
|
||||||
<div>{{ $address_book[0]->ContactNumber }}</div>
|
<div>{{ $address_book[0]->ContactNumber }}</div>
|
||||||
<div>
|
<div>
|
||||||
{{ $address_book[0]->Address . ' ' . $address_book[0]->Address2 . ', ' . $address_book[0]->State . ', ' . $address_book[0]->City . ', ' . $address_book[0]->Country . ', ' . $address_book[0]->CountryCode . ' ' . $address_book[0]->ZipCode }}
|
{{ $address_book[0]->Address . ' ' . $address_book[0]->Address2 . ', ' . $address_book[0]->State . ', ' . $address_book[0]->City . ', ' . $address_book[0]->Country . ', ' . $address_book[0]->CountryCode . ' ' . $address_book[0]->ZipCode }}
|
||||||
<a href="{{ url('user/address-book/edit/'.$address_book[0]->Id) }}">[ Edit ]</a>
|
<a href="{{ url('user/address-book/edit/'.$address_book[0]->Id) }}">[ Edit ]</a>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
<hr>
|
</div>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
<div style="border: 1px solid #e2e2e2; padding: 10px; border-bottom: none;">
|
||||||
{{-- <h3>Subtotal: <span id="my_subtotal">{{ round($getSubtotal, 2) }}</span> <small>{{ $store_array[0]->StoreCurrency }}</small></h3> --}}
|
{{-- <h3>Subtotal: <span id="my_subtotal">{{ round($getSubtotal, 2) }}</span> <small>{{ $store_array[0]->StoreCurrency }}</small></h3> --}}
|
||||||
<div class="summary-line">
|
<h5><strong>Subtotal:</strong>
|
||||||
<span class="summary-label">Subtotal:</span>
|
<span>{{ number_format($tax['order_grandtotal'], 2) . ' ' . $store_array[0]->StoreCurrency }}</span>
|
||||||
<span class="summary-value">{{ number_format($tax['order_grandtotal'], 2) . ' ' . $store_array[0]->StoreCurrency }}</span>
|
</h5>
|
||||||
</div>
|
<h5><strong>Shipping Fee:</strong>
|
||||||
<div class="summary-line">
|
<span>{{ number_format($shipping_fee, 2) . ' ' . $store_array[0]->StoreCurrency }}</span>
|
||||||
<span class="summary-label">Shipping Fee:</span>
|
</h5>
|
||||||
<span class="summary-value">{{ number_format($shipping_fee, 2) . ' ' . $store_array[0]->StoreCurrency }}</span>
|
<h5> <strong>Tax:</strong>
|
||||||
</div>
|
<span>{{ number_format($tax['tax'], 2) . ' ' . $store_array[0]->StoreCurrency }}</span>
|
||||||
<div class="summary-line">
|
</h5>
|
||||||
<span class="summary-label">Tax:</span>
|
|
||||||
<span class="summary-value">{{ number_format($tax['tax'], 2) . ' ' . $store_array[0]->StoreCurrency }}</span>
|
|
||||||
</div>
|
|
||||||
<hr>
|
<hr>
|
||||||
<div class="summary-line summary-total">
|
<h3> <strong>Total:</strong> <span id="my_subtotal">{{ number_format($tax['order_grandtotal'] + $shipping_fee + $tax['tax'], 2) }}</span>
|
||||||
<span class="summary-label">Total:</span>
|
<span>{{ $store_array[0]->StoreCurrency }}</span>
|
||||||
<span class="summary-value"><span id="my_subtotal">{{ number_format($tax['order_grandtotal'] + $shipping_fee + $tax['tax'], 2) }}</span><span class="summary-total-currency">{{ $store_array[0]->StoreCurrency }}</span></span>
|
</h3>
|
||||||
</div>
|
|
||||||
<hr>
|
<hr>
|
||||||
<div class="form-group voucher-row" id="voucher_list">
|
<div class="form-group" id="voucher_list">
|
||||||
@foreach($row as $item)
|
@foreach($row as $item)
|
||||||
@if($item->VoucherId != null)
|
@if($item->VoucherId != null)
|
||||||
<div class="btn-group">
|
<div class="btn-group">
|
||||||
@@ -326,36 +119,36 @@ body {
|
|||||||
<span id="error_voucher" style="color: #dd4b39"></span>
|
<span id="error_voucher" style="color: #dd4b39"></span>
|
||||||
</form>
|
</form>
|
||||||
<div class="clearfix"></div>
|
<div class="clearfix"></div>
|
||||||
|
</div>
|
||||||
<hr>
|
|
||||||
<a @if($getSubtotal <= 0 ) disabled @endif href="{{ url('getCheckout') }}" class="btn btn-primary btn-block checkout-btn" ><img src="{{asset('/images/paypal1.png')}}" class="img img-responsive" style="height:30px;"></a><br>
|
<div style="border: 1px solid #e2e2e2; padding: 10px;">
|
||||||
<a href="{{ url('teamstore') . '/' . $store_array[0]->StoreUrl }}" class="btn btn-default btn-block continue-btn" type="submit">Continue Shopping</a>
|
<a @if($getSubtotal <= 0 ) disabled @endif href="{{ url('getCheckout') }}" class="btn btn-primary btn-block" style="background-color: #ffc300; border-color: #e2ad00; text-align: -webkit-center;" ><img src="{{asset('/images/paypal1.png')}}" class="img img-responsive" style="height:30px;"></a><br>
|
||||||
|
<a href="{{ url('teamstore') . '/' . $store_array[0]->StoreUrl }}" class="btn btn-default btn-block" type="submit">Continue Shopping</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-8 col-md-pull-4">
|
<div class="col-md-8 col-md-pull-4">
|
||||||
<div class="cart-card cart-items-shell">
|
<div style="border: 1px solid #e2e2e2; padding: 10px;">
|
||||||
<div class="cart-store-head">
|
<h4><img height="30px" class="store-logo" src="{{ minio_url('uploads/images/teamstore/' . $store_array[0]->ImageFolder . '/' . $store_array[0]->StoreLogo) }}"> {{ $store_array[0]->StoreName }}</h4>
|
||||||
<h4><img height="30px" class="store-logo" src="{{ minio_url('uploads/images/teamstore/' . $store_array[0]->ImageFolder . '/' . $store_array[0]->StoreLogo) }}"> {{ $store_array[0]->StoreName }}</h4>
|
</div>
|
||||||
</div>
|
|
||||||
@foreach($item_group as $item)
|
@foreach($item_group as $item)
|
||||||
@if($item->VoucherId == null)
|
@if($item->VoucherId == null)
|
||||||
<div class="cart-card cart-item-block">
|
<div style="border: 1px solid #e2e2e2; padding: 10px; border-top: none;">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
@foreach($img_thumb as $img)
|
@foreach($img_thumb as $img)
|
||||||
@if($img->ProductId == $item->ProductId)
|
@if($img->ProductId == $item->ProductId)
|
||||||
<img class="previewImage" src="{{ minio_url('images/' . $img->Image) }}">
|
<img class="previewImage" src="{{ config('site_config.images_url') }}/{{ $img->Image }}">
|
||||||
@endif
|
@endif
|
||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-9">
|
<div class="col-md-9">
|
||||||
<h4 class="cart-item-title">
|
<h4>
|
||||||
<a href="{{ url('teamstore') . '/' . $item->StoreURL . '/' . 'product/' . $item->ProductURL }}">{{ $item->ProductName }}</a>
|
<a href="{{ url('teamstore') . '/' . $item->StoreURL . '/' . 'product/' . $item->ProductURL }}">{{ $item->ProductName }}</a>
|
||||||
</h4>
|
</h4>
|
||||||
<p class="cart-meta">Total Price: {{ $item->total_price . ' ' . $store_array[0]->StoreCurrency }} • Row(s): {{ $item->qty }} </p>
|
<p>Total Price: {{ $item->total_price . ' ' . $store_array[0]->StoreCurrency }} • Row(s): {{ $item->qty }} </p>
|
||||||
<div class="table-responsive cart-table-wrap">
|
<div class="table-responsive">
|
||||||
<table class="table table-striped table-condensed">
|
<table class="table table-striped table-condensed">
|
||||||
|
|
||||||
@if($item->FormUsed=="jersey-and-shorts-form")
|
@if($item->FormUsed=="jersey-and-shorts-form")
|
||||||
@@ -459,20 +252,20 @@ body {
|
|||||||
<td>{{ $sub_item->ShortsSize }}</td>
|
<td>{{ $sub_item->ShortsSize }}</td>
|
||||||
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
||||||
<td>{{ $sub_item->Quantity }}</td>
|
<td>{{ $sub_item->Quantity }}</td>
|
||||||
<td><a class="btn btn-xs btn-link pull-right cart-remove-btn" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
<td><a class="btn btn-xs btn-link pull-right" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
@elseif($item->FormUsed=="tshirt-form")
|
@elseif($item->FormUsed=="tshirt-form")
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ $sub_item->Size }}</td>
|
<td>{{ $sub_item->Size }}</td>
|
||||||
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
||||||
<td>{{ $sub_item->Quantity }}</td>
|
<td>{{ $sub_item->Quantity }}</td>
|
||||||
<td><a class="btn btn-xs btn-link pull-right cart-remove-btn" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
<td><a class="btn btn-xs btn-link pull-right" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
@elseif($item->FormUsed=="quantity-form")
|
@elseif($item->FormUsed=="quantity-form")
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
||||||
<td>{{ $sub_item->Quantity }}</td>
|
<td>{{ $sub_item->Quantity }}</td>
|
||||||
<td><a class="btn btn-xs btn-link pull-right cart-remove-btn" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
<td><a class="btn btn-xs btn-link pull-right" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
@elseif($item->FormUsed=="name-number-form")
|
@elseif($item->FormUsed=="name-number-form")
|
||||||
<tr>
|
<tr>
|
||||||
@@ -480,7 +273,7 @@ body {
|
|||||||
<td>{{ $sub_item->Number }}</td>
|
<td>{{ $sub_item->Number }}</td>
|
||||||
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
||||||
<td>{{ $sub_item->Quantity }}</td>
|
<td>{{ $sub_item->Quantity }}</td>
|
||||||
<td><a class="btn btn-xs btn-link pull-right cart-remove-btn" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
<td><a class="btn btn-xs btn-link pull-right" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
@elseif($item->FormUsed=="name-number-size-form")
|
@elseif($item->FormUsed=="name-number-size-form")
|
||||||
<tr>
|
<tr>
|
||||||
@@ -489,14 +282,14 @@ body {
|
|||||||
<td>{{ $sub_item->Size }}</td>
|
<td>{{ $sub_item->Size }}</td>
|
||||||
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
||||||
<td>{{ $sub_item->Quantity }}</td>
|
<td>{{ $sub_item->Quantity }}</td>
|
||||||
<td><a class="btn btn-xs btn-link pull-right cart-remove-btn" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
<td><a class="btn btn-xs btn-link pull-right" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
@elseif($item->FormUsed=="number-form")
|
@elseif($item->FormUsed=="number-form")
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{ $sub_item->Number }}</td>
|
<td>{{ $sub_item->Number }}</td>
|
||||||
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
||||||
<td>{{ $sub_item->Quantity }}</td>
|
<td>{{ $sub_item->Quantity }}</td>
|
||||||
<td><a class="btn btn-xs btn-link pull-right cart-remove-btn" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
<td><a class="btn btn-xs btn-link pull-right" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
@elseif($item->FormUsed=="name-name2-size-form")
|
@elseif($item->FormUsed=="name-name2-size-form")
|
||||||
<tr>
|
<tr>
|
||||||
@@ -505,7 +298,7 @@ body {
|
|||||||
<td>{{ $sub_item->Size }}</td>
|
<td>{{ $sub_item->Size }}</td>
|
||||||
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
||||||
<td>{{ $sub_item->Quantity }}</td>
|
<td>{{ $sub_item->Quantity }}</td>
|
||||||
<td><a class="btn btn-xs btn-link pull-right cart-remove-btn" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
<td><a class="btn btn-xs btn-link pull-right" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
@elseif($item->FormUsed=="name-size-form")
|
@elseif($item->FormUsed=="name-size-form")
|
||||||
<tr>
|
<tr>
|
||||||
@@ -513,7 +306,7 @@ body {
|
|||||||
<td>{{ $sub_item->Size }}</td>
|
<td>{{ $sub_item->Size }}</td>
|
||||||
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
||||||
<td>{{ $sub_item->Quantity }}</td>
|
<td>{{ $sub_item->Quantity }}</td>
|
||||||
<td><a class="btn btn-xs btn-link pull-right cart-remove-btn" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
<td><a class="btn btn-xs btn-link pull-right" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
@elseif($item->FormUsed=="jersey-and-shorts-quantity-form")
|
@elseif($item->FormUsed=="jersey-and-shorts-quantity-form")
|
||||||
<tr>
|
<tr>
|
||||||
@@ -521,7 +314,7 @@ body {
|
|||||||
<td>{{ $sub_item->ShortsSize}}</td>
|
<td>{{ $sub_item->ShortsSize}}</td>
|
||||||
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
||||||
<td>{{ $sub_item->Quantity }}</td>
|
<td>{{ $sub_item->Quantity }}</td>
|
||||||
<td><a class="btn btn-xs btn-link pull-right cart-remove-btn" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
<td><a class="btn btn-xs btn-link pull-right" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
@elseif($item->FormUsed=="number-jersey-shorts-form")
|
@elseif($item->FormUsed=="number-jersey-shorts-form")
|
||||||
<tr>
|
<tr>
|
||||||
@@ -530,7 +323,7 @@ body {
|
|||||||
<td>{{ $sub_item->ShortsSize }}</td>
|
<td>{{ $sub_item->ShortsSize }}</td>
|
||||||
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
<td>{{ $sub_item->Price . ' ' . $store_array[0]->StoreCurrency }}</td>
|
||||||
<td>{{ $sub_item->Quantity }}</td>
|
<td>{{ $sub_item->Quantity }}</td>
|
||||||
<td><a class="btn btn-xs btn-link pull-right cart-remove-btn" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
<td><a class="btn btn-xs btn-link pull-right" href="{{ url('removeitem') }}/{{ $sub_item->Id }}"><span class="glyphicon glyphicon-remove"></span></a></td>
|
||||||
</tr>
|
</tr>
|
||||||
@else
|
@else
|
||||||
|
|
||||||
@@ -545,14 +338,13 @@ body {
|
|||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@else
|
@else
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<h3 class="empty-cart">Your cart is currently empty.</h3>
|
<h3 style="color:#d2d2d2;">Your cart is currently empty.</h3>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -64,7 +64,7 @@
|
|||||||
<table class="table">
|
<table class="table">
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td rowspan="2" class="text-center"><img class="previewImage" src="{{ minio_url('images/' . $item->Image) }}"></td>
|
<td rowspan="2" class="text-center"><img class="previewImage" src="http://{{ config('site_config.images_url') }}/{{ $item->Image }} "></td>
|
||||||
<td colspan="5">
|
<td colspan="5">
|
||||||
<h4>{{ $item->ProductName }} {{ $itemOrder }} <br>Price: ${{ $item->Price }}</h4>
|
<h4>{{ $item->ProductName }} {{ $itemOrder }} <br>Price: ${{ $item->Price }}</h4>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -8,8 +8,14 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12" >
|
<div class="col-md-12" >
|
||||||
<ul class="breadcrumb">
|
<ul class="breadcrumb">
|
||||||
<li class=""><a href="{{url()}}">Home</a></li>
|
<li class=""><a href="{{ url('/') }}">Home</a></li>
|
||||||
<li class="active"> {{ $array_sports[0]->SportsName }} </li>
|
<li class="active">
|
||||||
|
@if($array_sports && $array_sports->count() > 0)
|
||||||
|
{!! $array_sports->first()->SportsName !!}
|
||||||
|
@else
|
||||||
|
Category
|
||||||
|
@endif
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -18,12 +24,12 @@
|
|||||||
@foreach ($row as $r)
|
@foreach ($row as $r)
|
||||||
<div class="col-md-3 col-sm-6 col-xs-12 list-sport">
|
<div class="col-md-3 col-sm-6 col-xs-12 list-sport">
|
||||||
<div class="thumb-border">
|
<div class="thumb-border">
|
||||||
<a href="{{ url() }}/{{ Request::path() }}/{{ $r->Id }}">
|
<a href="{{ url('/') }}/{{ Request::path() }}/{{ $r->Id ?? '' }}">
|
||||||
<img src="{{ minio_url('uploads/images/sports-category/' . $r->Thumbnail) }}" alt="{{ $r->Category }}" class="image" />
|
<img src="{{ minio_url('uploads/images/sports-category/' . ($r->Thumbnail ?? 'default.png')) }}" alt="{{ $r->Category ?? 'Category' }}" class="image" />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<h3 class="sports-title">{{ $r->Category }}</h3>
|
<h3 class="sports-title">{{ $r->Category ?? 'Unknown' }}</h3>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@endforeach
|
@endforeach
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12" >
|
<div class="col-md-12" >
|
||||||
<ul class="breadcrumb">
|
<ul class="breadcrumb">
|
||||||
<li class=""><a href="{{url()}}">Home</a></li>
|
<li class=""><a href="{{url('/')}}">Home</a></li>
|
||||||
<li class=""><a href="{{url('sports')}}/{{ $cat }}" >{{ $cat }}</a></li>
|
<li class=""><a href="{{url('sports')}}/{{ $cat }}" >{{ $cat }}</a></li>
|
||||||
<li class="active"> {{ $array_category[0]->Category }}</li>
|
<li class="active"> {{ $array_category[0]->Category }}</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|||||||
@@ -7,17 +7,14 @@
|
|||||||
@endif
|
@endif
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
body {
|
|
||||||
background: #f4f6f8;
|
|
||||||
}
|
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin-top: 34px;
|
margin-top: 40px;
|
||||||
margin-bottom: 24px;
|
margin-bottom: 40px;
|
||||||
|
|
||||||
}
|
}
|
||||||
/* h2:after {
|
/* h2:after {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
@@ -44,15 +41,6 @@
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.featured-title {
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: 700;
|
|
||||||
letter-spacing: 0.6px;
|
|
||||||
color: #111827;
|
|
||||||
text-transform: uppercase;
|
|
||||||
}
|
|
||||||
|
|
||||||
.price{
|
.price{
|
||||||
font-size: 25px;
|
font-size: 25px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
@@ -63,107 +51,19 @@
|
|||||||
border-bottom: 2px solid #4B8E4B;
|
border-bottom: 2px solid #4B8E4B;
|
||||||
}
|
}
|
||||||
.thumbnail{
|
.thumbnail{
|
||||||
-webkit-transition: all 0.5s;
|
/* opacity:0.70; */
|
||||||
|
-webkit-transition: all 0.5s;
|
||||||
transition: all 0.5s;
|
transition: all 0.5s;
|
||||||
}
|
}
|
||||||
|
.thumbnail:hover{
|
||||||
|
opacity:1.00;
|
||||||
|
box-shadow: 0px 0px 10px #4bc6ff;
|
||||||
|
}
|
||||||
.line{
|
.line{
|
||||||
margin-bottom: 5px;
|
margin-bottom: 5px;
|
||||||
}
|
}
|
||||||
.products-grid {
|
.thumbnail>img{
|
||||||
margin-top: 6px;
|
height:201.84px;
|
||||||
}
|
|
||||||
|
|
||||||
.product-col {
|
|
||||||
margin-bottom: 22px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-card {
|
|
||||||
height: 100%;
|
|
||||||
background: #ffffff;
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
border-radius: 12px;
|
|
||||||
overflow: hidden;
|
|
||||||
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
|
|
||||||
transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-card:hover {
|
|
||||||
transform: translateY(-2px);
|
|
||||||
border-color: #d1d5db;
|
|
||||||
box-shadow: 0 10px 24px rgba(2, 6, 23, 0.08);
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-image-link {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
padding: 16px;
|
|
||||||
min-height: 240px;
|
|
||||||
background: #f8fafc;
|
|
||||||
border-bottom: 1px solid #e5e7eb;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-image {
|
|
||||||
width: auto;
|
|
||||||
max-width: 100%;
|
|
||||||
height: auto;
|
|
||||||
max-height: 202px;
|
|
||||||
object-fit: contain;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-card-body {
|
|
||||||
padding: 12px 14px 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-name-holder {
|
|
||||||
margin: 0;
|
|
||||||
font-size: 14px;
|
|
||||||
font-weight: 700;
|
|
||||||
line-height: 1.35;
|
|
||||||
color: #111827;
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-card-footer {
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: space-between;
|
|
||||||
gap: 10px;
|
|
||||||
margin-top: 12px;
|
|
||||||
padding-top: 10px;
|
|
||||||
border-top: 1px solid #eef2f7;
|
|
||||||
}
|
|
||||||
|
|
||||||
.price {
|
|
||||||
margin: 0;
|
|
||||||
font-size: 22px;
|
|
||||||
line-height: 1;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #111827;
|
|
||||||
}
|
|
||||||
|
|
||||||
.price small,
|
|
||||||
.price-currency {
|
|
||||||
font-size: 13px;
|
|
||||||
color: #6b7280;
|
|
||||||
font-weight: 600;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-view-details {
|
|
||||||
border-radius: 8px;
|
|
||||||
min-height: 36px;
|
|
||||||
font-weight: 600;
|
|
||||||
font-size: 12px;
|
|
||||||
padding: 8px 12px;
|
|
||||||
letter-spacing: 0.2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.empty-state {
|
|
||||||
margin: 50px 0;
|
|
||||||
color: #6b7280;
|
|
||||||
font-size: 15px;
|
|
||||||
}
|
}
|
||||||
@media screen and (max-width: 770px) {
|
@media screen and (max-width: 770px) {
|
||||||
.right{
|
.right{
|
||||||
@@ -227,164 +127,6 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ── Category nav ──────────────────────────────────────────────────────── */
|
|
||||||
.cat-nav {
|
|
||||||
background: #ffffff;
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
border-radius: 12px;
|
|
||||||
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
|
|
||||||
padding: 0;
|
|
||||||
margin-bottom: 24px;
|
|
||||||
overflow: visible;
|
|
||||||
}
|
|
||||||
.cat-nav ul {
|
|
||||||
list-style: none;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
}
|
|
||||||
.cat-nav > ul > li {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.cat-nav > ul > li > a {
|
|
||||||
display: block;
|
|
||||||
padding: 14px 20px;
|
|
||||||
font-weight: 700;
|
|
||||||
font-size: 13px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: #222;
|
|
||||||
text-decoration: none;
|
|
||||||
letter-spacing: .5px;
|
|
||||||
border-bottom: 3px solid transparent;
|
|
||||||
transition: border-color .2s, color .2s;
|
|
||||||
}
|
|
||||||
.cat-nav > ul > li > a:hover,
|
|
||||||
.cat-nav > ul > li > a.active {
|
|
||||||
color: #4B8E4B;
|
|
||||||
border-bottom-color: #4B8E4B;
|
|
||||||
}
|
|
||||||
/* sub-category dropdown */
|
|
||||||
.cat-nav .sub-menu {
|
|
||||||
display: none;
|
|
||||||
position: absolute;
|
|
||||||
top: 100%;
|
|
||||||
left: 0;
|
|
||||||
min-width: 200px;
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #ddd;
|
|
||||||
border-top: 3px solid #4B8E4B;
|
|
||||||
box-shadow: 0 4px 12px rgba(0,0,0,.12);
|
|
||||||
z-index: 999;
|
|
||||||
list-style: none;
|
|
||||||
margin: 0;
|
|
||||||
padding: 6px 0;
|
|
||||||
}
|
|
||||||
.cat-nav > ul > li:hover .sub-menu {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.cat-nav .sub-menu li a {
|
|
||||||
display: block;
|
|
||||||
padding: 9px 18px;
|
|
||||||
font-size: 13px;
|
|
||||||
color: #333;
|
|
||||||
text-decoration: none;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.cat-nav .sub-menu li a:hover,
|
|
||||||
.cat-nav .sub-menu li a.active {
|
|
||||||
background: #f0f9f0;
|
|
||||||
color: #4B8E4B;
|
|
||||||
}
|
|
||||||
.cat-count {
|
|
||||||
display: inline-block;
|
|
||||||
background: #ddd;
|
|
||||||
border-radius: 10px;
|
|
||||||
font-size: 11px;
|
|
||||||
padding: 1px 7px;
|
|
||||||
margin-left: 4px;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ── League / conference pill filter (sub-sub-category) ─────────────────── */
|
|
||||||
.league-filter {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
gap: 8px;
|
|
||||||
padding: 10px 12px 14px;
|
|
||||||
margin-bottom: 18px;
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
border-radius: 12px;
|
|
||||||
background: #fff;
|
|
||||||
align-items: center;
|
|
||||||
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
|
|
||||||
}
|
|
||||||
.league-filter .lf-label {
|
|
||||||
font-size: 11px;
|
|
||||||
font-weight: 700;
|
|
||||||
text-transform: uppercase;
|
|
||||||
color: #888;
|
|
||||||
letter-spacing: .5px;
|
|
||||||
margin-right: 4px;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.league-filter a {
|
|
||||||
display: inline-block;
|
|
||||||
padding: 5px 14px;
|
|
||||||
border-radius: 20px;
|
|
||||||
background: #f0f0f0;
|
|
||||||
color: #333;
|
|
||||||
font-size: 12px;
|
|
||||||
font-weight: 600;
|
|
||||||
text-decoration: none;
|
|
||||||
white-space: nowrap;
|
|
||||||
border: 1px solid #ddd;
|
|
||||||
transition: background .2s, color .2s, border-color .2s;
|
|
||||||
}
|
|
||||||
.league-filter a:hover {
|
|
||||||
background: #e0f2e0;
|
|
||||||
color: #4B8E4B;
|
|
||||||
border-color: #4B8E4B;
|
|
||||||
}
|
|
||||||
.league-filter a.active {
|
|
||||||
background: #4B8E4B;
|
|
||||||
color: #fff;
|
|
||||||
border-color: #4B8E4B;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 991px) {
|
|
||||||
.product-image-link {
|
|
||||||
min-height: 220px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-view-details {
|
|
||||||
padding: 7px 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 767px) {
|
|
||||||
h2 {
|
|
||||||
margin-top: 24px;
|
|
||||||
margin-bottom: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.featured-title {
|
|
||||||
font-size: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-card-footer {
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: stretch;
|
|
||||||
gap: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.btn-view-details {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[v-cloak] { display: none; }
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
@@ -405,277 +147,83 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<h2 class="featured-title">Featured Products</h2>
|
<h2>FEATURED PRODUCTS</h2>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row">
|
||||||
{{-- ── Vue category + product grid ─────────────────────────────────────── --}}
|
|
||||||
<script>
|
|
||||||
window._tsProducts = {!! json_encode(
|
|
||||||
collect($product_array)
|
|
||||||
->where('PrivacyStatus', 'public')
|
|
||||||
->map(function($p) use ($thumbnails) {
|
|
||||||
$thumbList = isset($thumbnails) ? $thumbnails : [];
|
|
||||||
$thumb = collect($thumbList)->filter(function($t) use ($p) {
|
|
||||||
return $t['product_id'] == $p->Id;
|
|
||||||
})->first();
|
|
||||||
return [
|
|
||||||
'id' => $p->Id,
|
|
||||||
'name' => $p->ProductName,
|
|
||||||
'price' => $p->ProductPrice,
|
|
||||||
'url' => $p->ProductURL,
|
|
||||||
'img' => $thumb ? $thumb['thumb'] : 'product-image-placeholder.png',
|
|
||||||
'folder'=> $thumb ? $thumb['folder'] : '',
|
|
||||||
];
|
|
||||||
})->values()->toArray(),
|
|
||||||
JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT
|
|
||||||
) !!};
|
|
||||||
window._tsStore = {
|
|
||||||
url : {!! json_encode($store_array[0]->StoreUrl, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT) !!},
|
|
||||||
currency : {!! json_encode($store_array[0]->StoreCurrency, JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT) !!},
|
|
||||||
minoBase : {!! json_encode(rtrim(config('filesystems.disks.minio.url', ''), '/') . '/' . env('MINIO_BUCKET', 'crewsportswear') . '/', JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT) !!},
|
|
||||||
};
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<div id="ts-app" v-cloak>
|
|
||||||
|
|
||||||
{{-- ── Category nav ── --}}
|
|
||||||
<nav class="cat-nav" v-if="categories.length > 0">
|
|
||||||
<ul>
|
|
||||||
<li>
|
|
||||||
<a href="#" :class="{active: activeCategory===null && activeSubCategory===null}"
|
|
||||||
@click.prevent="activeCategory=null; activeSubCategory=null">
|
|
||||||
All
|
|
||||||
<span class="cat-count">@{{ totalPublic }}</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li v-for="cat in categories" :key="cat.name">
|
|
||||||
<a href="#"
|
|
||||||
:class="{active: activeCategory===cat.name}"
|
|
||||||
@click.prevent="selectCategory(cat.name)">
|
|
||||||
@{{ cat.name }}
|
|
||||||
<span class="cat-count">@{{ cat.count }}</span>
|
|
||||||
</a>
|
|
||||||
<ul class="sub-menu" v-if="cat.subs.length > 0">
|
|
||||||
<li v-for="sub in cat.subs" :key="sub.name">
|
|
||||||
<a href="#"
|
|
||||||
:class="{active: activeCategory===cat.name && activeSubCategory===sub.name}"
|
|
||||||
@click.prevent="selectSub(cat.name, sub.name)">
|
|
||||||
@{{ sub.name }}
|
|
||||||
<span class="cat-count">@{{ sub.count }}</span>
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
|
|
||||||
{{-- ── League / conference pill filter ── --}}
|
|
||||||
<div class="league-filter" v-if="isLeagueStore && activeCategory !== null && leagues.length > 0">
|
|
||||||
<span class="lf-label">League / Conf:</span>
|
|
||||||
<a href="#"
|
|
||||||
:class="{active: activeLeague === null}"
|
|
||||||
@click.prevent="activeLeague = null">All</a>
|
|
||||||
<a href="#"
|
|
||||||
v-for="lg in leagues" :key="lg.name"
|
|
||||||
:class="{active: activeLeague === lg.name}"
|
|
||||||
@click.prevent="activeLeague = lg.name">
|
|
||||||
@{{ lg.name }}
|
|
||||||
<span class="cat-count">@{{ lg.count }}</span>
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{-- ── Announcements (kept outside loop) ── --}}
|
|
||||||
@if ($announcement->IsActive)
|
@if ($announcement->IsActive)
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<div class="alert alert-info">
|
<div class="alert alert-info">
|
||||||
<p><b>Shop Announcements:</b></p>
|
<p><b>Shop Announcements:</b></p>
|
||||||
{!! nl2br(e($announcement->Announcement)) !!}
|
{!! nl2br(e($announcement->Announcement)) !!}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
@endif
|
@endif
|
||||||
@if($store_array[0]->Id == 174 || $store_array[0]->Id == 175 || $store_array[0]->Id == 178 || $store_array[0]->Id == 179 || $store_array[0]->Id == 177 || $store_array[0]->Id == 189 || $store_array[0]->Id == 176 || $store_array[0]->Id == 190 || $store_array[0]->Id == 191 || $store_array[0]->Id == 192 || $store_array[0]->Id == 194)
|
@if($store_array[0]->Id == 174 || $store_array[0]->Id == 175 || $store_array[0]->Id == 178 || $store_array[0]->Id == 179 || $store_array[0]->Id == 177 || $store_array[0]->Id == 189 || $store_array[0]->Id == 176 || $store_array[0]->Id == 190 || $store_array[0]->Id == 191 || $store_array[0]->Id == 192 || $store_array[0]->Id == 194)
|
||||||
<div class="row">
|
<div class="col-md-12">
|
||||||
<div class="col-md-12">
|
<div class="alert alert-warning">
|
||||||
<div class="alert alert-warning">
|
<p><b>Please read:</b></p>
|
||||||
|
1. All orders will be batch shipped to your school for pick up.<br>
|
||||||
|
2. Orders will be batch processed on a weekly basis, please allow 2-3 weeks for delivery.<br>
|
||||||
|
3. Masks and gaiters sold on Crew are not intended for medical use. Crew does not make any medical or health claims.<br>
|
||||||
|
4. Refunds and exchanges are not allowed due to the hygenic nature of the product.<br>
|
||||||
|
@if($store_array[0]->Id == 175)
|
||||||
|
5. $1 from every item sold will benefit the 2020-2021 Maine South Schoolwide Fundraiser.
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@else
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="alert alert-warning">
|
||||||
<p><b>Please read:</b></p>
|
<p><b>Please read:</b></p>
|
||||||
1. All orders will be batch shipped to your school for pick up.<br>
|
1. Items purchased are made on demand. Orders will be shipped based on dates set by your store administrator.<br>
|
||||||
2. Orders will be batch processed on a weekly basis, please allow 2-3 weeks for delivery.<br>
|
2. Store payments are processed through PayPal. A PayPal account is not required to make a purchase.<br>
|
||||||
3. Masks and gaiters sold on Crew are not intended for medical use. Crew does not make any medical or health claims.<br>
|
@if($store_array[0]->Id == 222)
|
||||||
4. Refunds and exchanges are not allowed due to the hygenic nature of the product.<br>
|
3. Orders will be batch processed on a monthly basis, please allow 4-6 weeks for delivery.<br>
|
||||||
@if($store_array[0]->Id == 175)
|
@else
|
||||||
5. $1 from every item sold will benefit the 2020-2021 Maine South Schoolwide Fundraiser.
|
3. Orders will be batch processed on a weekly basis, please allow 2-3 weeks for delivery.<br>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
4. We are currently only shipping to US locations. For international orders, please contact <b>orders@crewsportswear.com</b> if you'd like to place an order.<br>
|
||||||
</div>
|
5. Expect shipping delays due to COVID-19.<br>
|
||||||
</div>
|
6. All sales are final. No returns or exchanges will be accepted.<br><br>
|
||||||
@endif
|
|
||||||
|
|
||||||
{{-- ── Product grid ── --}}
|
<b>DISCLAIMER:</b> Masks and gaiters sold by Crew Sportswear are not intended for medical use. Crew Sportswear does not make any medical or health claims.
|
||||||
<div class="row products-grid">
|
</div>
|
||||||
<div class="col-md-12 text-center" v-if="filtered.length === 0">
|
</div>
|
||||||
<p class="empty-state">No products found in this category.</p>
|
@endif
|
||||||
</div>
|
<!-- BEGIN PRODUCTS -->
|
||||||
<div class="col-md-3 col-sm-6 product-col" v-for="p in filtered" :key="p.id">
|
|
||||||
<div class="product-card">
|
@foreach($product_array as $i => $product)
|
||||||
<a :href="productUrl(p)" class="product-image-link">
|
@if($product->PrivacyStatus == "public")
|
||||||
<img class="product-image" :src="imgUrl(p)" :alt="p.name">
|
@foreach($thumbnails as $t => $thumb)
|
||||||
</a>
|
@if($thumb['product_id'] == $product->Id)
|
||||||
<div class="product-card-body">
|
@define $storeFolder = $thumb['folder']
|
||||||
<h4 class="text-center product-name-holder">@{{ p.name }}</h4>
|
@define $filename = $thumb['thumb']
|
||||||
<div class="product-card-footer">
|
@endif
|
||||||
<p class="price">@{{ p.price }} <small class="price-currency">@{{ store.currency }}</small></p>
|
@endforeach
|
||||||
<a :href="productUrl(p)" class="btn btn-success btn-view-details">View Details</a>
|
|
||||||
|
<div class="col-md-3 col-sm-6">
|
||||||
|
<span class="thumbnail">
|
||||||
|
<a href="{{ url('teamstore') }}/{{ $store_array[0]->StoreUrl }}/product/{{ $product->ProductURL }}">
|
||||||
|
<img style="height: 201.84px;" src="{{ config('site_config.images_url') }}/{{ $filename }}" alt="{{ $product->ProductName }}" >
|
||||||
|
</a>
|
||||||
|
<h4 class="text-center product-name-holder">{{ $product->ProductName }}</h4>
|
||||||
|
<hr class="line">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-7 col-sm-7">
|
||||||
|
<p class="price">{{ $product->ProductPrice }} <small style="font-size: 15px;"> {{ $store_array[0]->StoreCurrency }}</small></p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-5 col-sm-5">
|
||||||
|
<a href="{{ url('teamstore') }}/{{ $store_array[0]->StoreUrl }}/product/{{ $product->ProductURL }}" class="btn btn-success right" > View Details</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
@endif
|
||||||
</div>
|
@endforeach
|
||||||
|
<!-- END PRODUCTS -->
|
||||||
</div>{{-- /ts-app --}}
|
|
||||||
|
</div>
|
||||||
<script src="https://unpkg.com/vue@3/dist/vue.global.prod.js"></script>
|
</div> <!-- cotainer -->
|
||||||
<script>
|
|
||||||
(function () {
|
|
||||||
// ── sport & item-type keyword maps ──────────────────────────────────
|
|
||||||
const SPORTS = [
|
|
||||||
'Basketball','Football','Soccer','Baseball','Softball',
|
|
||||||
'Volleyball','Hockey','Lacrosse','Wrestling','Tennis',
|
|
||||||
'Swimming','Track','Cross Country','Golf','Cheerleading',
|
|
||||||
'Dance','Rugby','Bowling','Gymnastics','Cycling',
|
|
||||||
];
|
|
||||||
const ITEMS = [
|
|
||||||
'Jersey','T-Shirt','Tee','Hoodie','Sweatshirt','Jacket',
|
|
||||||
'Shorts','Pants','Tank','Top','Pullover','Zip-Up',
|
|
||||||
'Hat','Cap','Beanie','Polo','Uniform','Warmup','Pinnie',
|
|
||||||
];
|
|
||||||
// ── league / conference keyword map ──────────────────────────────────
|
|
||||||
// Order matters: more specific phrases first
|
|
||||||
const LEAGUES = [
|
|
||||||
{ key: 'WNBA', terms: ['\\bwnba\\b'] },
|
|
||||||
{ key: 'NBA', terms: ['\\bnba\\b'] },
|
|
||||||
{ key: 'NFL', terms: ['\\bnfl\\b'] },
|
|
||||||
{ key: 'MLB', terms: ['\\bmlb\\b'] },
|
|
||||||
{ key: 'NHL', terms: ['\\bnhl\\b'] },
|
|
||||||
{ key: 'MLS', terms: ['\\bmls\\b'] },
|
|
||||||
{ key: 'Big Ten', terms: ['\\bbig\\s*ten\\b','\\bbig\\s*10\\b','\\bbig10\\b'] },
|
|
||||||
{ key: 'ACC', terms: ['\\bacc\\b'] },
|
|
||||||
{ key: 'SEC', terms: ['\\bsec\\b'] },
|
|
||||||
{ key: 'Big 12', terms: ['\\bbig\\s*12\\b','\\bbig12\\b'] },
|
|
||||||
{ key: 'Pac-12', terms: ['\\bpac[-\\s]*12\\b','\\bpac12\\b'] },
|
|
||||||
{ key: 'AAC', terms: ['\\baac\\b'] },
|
|
||||||
{ key: 'CUSA', terms: ['\\bcusa\\b','\\bc-usa\\b'] },
|
|
||||||
{ key: 'MAC', terms: ['\\bmac\\b'] },
|
|
||||||
{ key: 'Sun Belt',terms: ['\\bsun\\s+belt\\b'] },
|
|
||||||
{ key: 'Mountain West', terms: ['\\bmountain\\s+west\\b','\\bmwc\\b'] },
|
|
||||||
];
|
|
||||||
|
|
||||||
function classify(name) {
|
|
||||||
const n = name.toLowerCase();
|
|
||||||
const sport = SPORTS.find(s => n.includes(s.toLowerCase())) || 'Other';
|
|
||||||
const item = ITEMS.find(i => n.includes(i.toLowerCase())) || 'Other';
|
|
||||||
let league = null;
|
|
||||||
for (const lg of LEAGUES) {
|
|
||||||
if (lg.terms.some(t => {
|
|
||||||
try { return new RegExp(t, 'i').test(n); } catch(e) { return n.includes(t); }
|
|
||||||
})) {
|
|
||||||
league = lg.key;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return { sport, item, league };
|
|
||||||
}
|
|
||||||
|
|
||||||
const { createApp } = Vue;
|
|
||||||
const store = window._tsStore || { url:'', currency:'', minoBase:'' };
|
|
||||||
const allProducts = Array.isArray(window._tsProducts) ? window._tsProducts : [];
|
|
||||||
|
|
||||||
createApp({
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
products : allProducts,
|
|
||||||
store : store,
|
|
||||||
activeCategory : null,
|
|
||||||
activeSubCategory: null,
|
|
||||||
activeLeague : null,
|
|
||||||
};
|
|
||||||
},
|
|
||||||
computed: {
|
|
||||||
totalPublic() {
|
|
||||||
return this.products.length;
|
|
||||||
},
|
|
||||||
isLeagueStore() {
|
|
||||||
return this.store.url === 'hi-five-franchise-store';
|
|
||||||
},
|
|
||||||
// Build [ { name:'Basketball', count:N, subs:[{name:'Jersey',count:N},...] }, ... ]
|
|
||||||
categories() {
|
|
||||||
const map = {};
|
|
||||||
this.products.forEach(p => {
|
|
||||||
const { sport, item } = classify(p.name);
|
|
||||||
if (!map[sport]) map[sport] = {};
|
|
||||||
map[sport][item] = (map[sport][item] || 0) + 1;
|
|
||||||
});
|
|
||||||
return Object.entries(map)
|
|
||||||
.sort((a,b) => a[0].localeCompare(b[0]))
|
|
||||||
.map(([name, subs]) => ({
|
|
||||||
name,
|
|
||||||
count: Object.values(subs).reduce((a,b) => a+b, 0),
|
|
||||||
subs: Object.entries(subs)
|
|
||||||
.sort((a,b) => a[0].localeCompare(b[0]))
|
|
||||||
.map(([s, count]) => ({ name: s, count }))
|
|
||||||
.filter(s => s.name !== 'Other' || Object.keys(subs).length === 1),
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
// Available leagues for the currently active category (+ optional sub)
|
|
||||||
// Only computed for hi-five-franchise-store
|
|
||||||
leagues() {
|
|
||||||
if (!this.isLeagueStore) return [];
|
|
||||||
const map = {};
|
|
||||||
this.products.forEach(p => {
|
|
||||||
const { sport, item, league } = classify(p.name);
|
|
||||||
if (!league) return;
|
|
||||||
if (this.activeCategory && sport !== this.activeCategory) return;
|
|
||||||
if (this.activeSubCategory && item !== this.activeSubCategory) return;
|
|
||||||
map[league] = (map[league] || 0) + 1;
|
|
||||||
});
|
|
||||||
return Object.entries(map)
|
|
||||||
.sort((a, b) => a[0].localeCompare(b[0]))
|
|
||||||
.map(([name, count]) => ({ name, count }));
|
|
||||||
},
|
|
||||||
filtered() {
|
|
||||||
if (!this.activeCategory && !this.activeLeague) return this.products;
|
|
||||||
return this.products.filter(p => {
|
|
||||||
const { sport, item, league } = classify(p.name);
|
|
||||||
if (this.activeCategory && sport !== this.activeCategory) return false;
|
|
||||||
if (this.activeSubCategory && item !== this.activeSubCategory) return false;
|
|
||||||
if (this.isLeagueStore && this.activeLeague && league !== this.activeLeague) return false;
|
|
||||||
return true;
|
|
||||||
});
|
|
||||||
},
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
selectCategory(cat) {
|
|
||||||
this.activeCategory = cat;
|
|
||||||
this.activeSubCategory = null;
|
|
||||||
this.activeLeague = null;
|
|
||||||
},
|
|
||||||
selectSub(cat, sub) {
|
|
||||||
this.activeCategory = cat;
|
|
||||||
this.activeSubCategory = sub;
|
|
||||||
this.activeLeague = null;
|
|
||||||
},
|
|
||||||
productUrl(p) {
|
|
||||||
return '/teamstore/' + store.url + '/product/' + p.url;
|
|
||||||
},
|
|
||||||
imgUrl(p) {
|
|
||||||
return store.minoBase + 'images/' + p.img;
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}).mount('#ts-app');
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</div>{{-- /container --}}
|
|
||||||
@endsection
|
@endsection
|
||||||
|
|||||||
@@ -7,45 +7,6 @@
|
|||||||
@endif
|
@endif
|
||||||
<style>
|
<style>
|
||||||
|
|
||||||
body {
|
|
||||||
background: #f4f6f8;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-page {
|
|
||||||
padding-top: 14px;
|
|
||||||
padding-bottom: 28px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-breadcrumb {
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
border-radius: 10px;
|
|
||||||
margin-bottom: 18px;
|
|
||||||
padding: 10px 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-breadcrumb .breadcrumb {
|
|
||||||
margin: 0;
|
|
||||||
background: transparent;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-breadcrumb .breadcrumb > li,
|
|
||||||
.product-breadcrumb .breadcrumb > li.active,
|
|
||||||
.product-breadcrumb .breadcrumb > li + li:before {
|
|
||||||
color: #6b7280;
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-breadcrumb .breadcrumb > li > a {
|
|
||||||
color: #374151;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-breadcrumb .breadcrumb > li > a:hover {
|
|
||||||
color: #111827;
|
|
||||||
}
|
|
||||||
|
|
||||||
p{
|
p{
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
margin-top: 5px;
|
margin-top: 5px;
|
||||||
@@ -69,8 +30,7 @@
|
|||||||
box-shadow: 0px 0px 10px #4bc6ff;
|
box-shadow: 0px 0px 10px #4bc6ff;
|
||||||
} */
|
} */
|
||||||
.line{
|
.line{
|
||||||
margin: 14px 0;
|
margin-bottom: 5px;
|
||||||
border-color: #e5e7eb;
|
|
||||||
}
|
}
|
||||||
@media screen and (max-width: 770px) {
|
@media screen and (max-width: 770px) {
|
||||||
.right{
|
.right{
|
||||||
@@ -157,45 +117,18 @@
|
|||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#myCarousel {
|
|
||||||
position: relative;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-control {
|
|
||||||
width: 34px;
|
|
||||||
height: 34px;
|
|
||||||
top: 50%;
|
|
||||||
margin-top: -17px;
|
|
||||||
opacity: 1;
|
|
||||||
text-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-control.left {
|
.carousel-control.left {
|
||||||
left: -18px;
|
margin-left: -35px;
|
||||||
margin-left: 0;
|
margin-top: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.carousel-control.right {
|
.carousel-control.right {
|
||||||
right: -18px;
|
margin-right: -35px;
|
||||||
margin-right: 0;
|
margin-top: 7px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.carousel-control .glyphicon {
|
.carousel-control {
|
||||||
width: 34px;
|
width: 0%;
|
||||||
height: 34px;
|
|
||||||
line-height: 34px;
|
|
||||||
border-radius: 50%;
|
|
||||||
background: rgba(255, 255, 255, 0.95);
|
|
||||||
border: 1px solid #d1d5db;
|
|
||||||
color: #374151;
|
|
||||||
font-size: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-control:hover .glyphicon {
|
|
||||||
background: #ffffff;
|
|
||||||
border-color: #9ca3af;
|
|
||||||
color: #111827;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.custom-chevron-left,
|
.custom-chevron-left,
|
||||||
@@ -206,127 +139,11 @@
|
|||||||
|
|
||||||
.hide-bullets {
|
.hide-bullets {
|
||||||
list-style:none;
|
list-style:none;
|
||||||
margin-left: 0;
|
margin-left: -40px;
|
||||||
margin-top: 0;
|
margin-top:20px;
|
||||||
margin-bottom: 0;
|
|
||||||
padding-left: 0;
|
|
||||||
}
|
}
|
||||||
.hide-bullets > li {
|
|
||||||
margin-bottom: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-gallery-card,
|
|
||||||
.product-info-card,
|
|
||||||
.description-card {
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
border-radius: 12px;
|
|
||||||
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-gallery-card {
|
|
||||||
padding: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-image-stage {
|
|
||||||
border: 1px solid #eef0f3;
|
|
||||||
border-radius: 10px;
|
|
||||||
background: #fcfcfd;
|
|
||||||
min-height: 430px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-product-image {
|
|
||||||
max-height: 400px;
|
|
||||||
width: auto;
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.thumbnail {
|
|
||||||
border-radius: 10px;
|
|
||||||
border: 1px solid #d1d5db;
|
|
||||||
background: #fff;
|
|
||||||
margin-bottom: 0;
|
|
||||||
transition: border-color 0.2s, box-shadow 0.2s;
|
|
||||||
}
|
|
||||||
|
|
||||||
.thumbnail:hover {
|
|
||||||
border-color: #9ca3af;
|
|
||||||
box-shadow: 0 3px 12px rgba(0, 0, 0, 0.08);
|
|
||||||
}
|
|
||||||
|
|
||||||
.a_thumbnail.active {
|
|
||||||
border-color: #3b82f6;
|
|
||||||
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.image-thumbnails {
|
|
||||||
border-radius: 8px;
|
|
||||||
object-fit: contain;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-info-card {
|
|
||||||
padding: 22px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-title {
|
|
||||||
margin: 0;
|
|
||||||
font-size: 28px;
|
|
||||||
line-height: 1.2;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #111827;
|
|
||||||
}
|
|
||||||
|
|
||||||
.price {
|
|
||||||
font-size: 30px;
|
|
||||||
margin: 8px 0 18px;
|
|
||||||
color: #0f172a;
|
|
||||||
font-weight: 700;
|
|
||||||
}
|
|
||||||
|
|
||||||
.price small {
|
|
||||||
font-size: 14px;
|
|
||||||
color: #6b7280;
|
|
||||||
font-weight: 500;
|
|
||||||
}
|
|
||||||
|
|
||||||
#frm-order-list {
|
|
||||||
padding-top: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#btn-add-to-cart {
|
|
||||||
min-height: 44px;
|
|
||||||
padding: 10px 18px;
|
|
||||||
border-radius: 9px;
|
|
||||||
font-weight: 600;
|
|
||||||
font-size: 14px;
|
|
||||||
letter-spacing: 0.2px;
|
|
||||||
margin-top: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.description-card {
|
|
||||||
margin-top: 18px;
|
|
||||||
padding: 18px 22px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.description-title {
|
|
||||||
margin: 0 0 10px;
|
|
||||||
font-size: 16px;
|
|
||||||
font-weight: 600;
|
|
||||||
color: #111827;
|
|
||||||
}
|
|
||||||
|
|
||||||
.description-text {
|
|
||||||
margin: 0;
|
|
||||||
font-size: 14px;
|
|
||||||
line-height: 1.65;
|
|
||||||
color: #4b5563;
|
|
||||||
}
|
|
||||||
|
|
||||||
.spacer-top{
|
.spacer-top{
|
||||||
margin-top: 24px;
|
margin-top: 40px;
|
||||||
}
|
}
|
||||||
.roster-input{
|
.roster-input{
|
||||||
border-radius: 0px;
|
border-radius: 0px;
|
||||||
@@ -391,49 +208,12 @@
|
|||||||
overflow: auto;
|
overflow: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media screen and (max-width: 991px) {
|
|
||||||
.product-info-card {
|
|
||||||
margin-top: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.main-image-stage {
|
|
||||||
min-height: 350px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#btn-add-to-cart {
|
|
||||||
width: 100%;
|
|
||||||
float: none !important;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media screen and (max-width: 768px) {
|
|
||||||
.main-image-stage {
|
|
||||||
min-height: 300px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-control.left {
|
|
||||||
left: -10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-control.right {
|
|
||||||
right: -10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.product-title {
|
|
||||||
font-size: 23px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.price {
|
|
||||||
font-size: 26px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<div class="container product-page">
|
<div class="container">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<nav aria-label="breadcrumb" class="product-breadcrumb">
|
<nav aria-label="breadcrumb">
|
||||||
<ol class="breadcrumb">
|
<ol class="breadcrumb">
|
||||||
<li class="breadcrumb-item"><a href="{{ url('teamstore') }}/{{ $store_array[0]->StoreUrl }}">Home</a></li>
|
<li class="breadcrumb-item"><a href="{{ url('teamstore') }}/{{ $store_array[0]->StoreUrl }}">Home</a></li>
|
||||||
<li class="breadcrumb-item active" aria-current="page">{{ $product_array[0]->ProductName }}</li>
|
<li class="breadcrumb-item active" aria-current="page">{{ $product_array[0]->ProductName }}</li>
|
||||||
@@ -444,62 +224,68 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
||||||
<div class="col-md-5 col-sm-5">
|
<div class="col-md-5 col-sm-5">
|
||||||
<div class="main-gallery-card">
|
<div class="row">
|
||||||
<div id="carousel-bounding-box">
|
<div class="col-sm-12" id="carousel-bounding-box">
|
||||||
<div class="main-image-stage">
|
<div class="carousel slide" id="myCarousel" data-interval="false">
|
||||||
<div class="carousel slide" id="myCarousel" data-interval="false">
|
<!-- Carousel items -->
|
||||||
<div class="carousel-inner">
|
<div class="carousel-inner">
|
||||||
@define $i = 0
|
@define $i = 0
|
||||||
@foreach($thumbnails_array as $thumbnail)
|
@foreach($thumbnails_array as $thumbnail)
|
||||||
@if($thumbnail->ImageClass == 'active')
|
@if($thumbnail->ImageClass == 'active')
|
||||||
<div class="active item text-center" data-slide-number="{{ $i }}">
|
<div class="active item text-center" data-slide-number="{{ $i }}">
|
||||||
<span class="zoom img-zoom">
|
<span class="zoom img-zoom">
|
||||||
<img class="main-product-image" src="{{ minio_url('images/' . $thumbnail->Image) }}">
|
<img style="height:400px;" src="{{ config('site_config.images_url') }}/{{ $thumbnail->Image }}">
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@else
|
@else
|
||||||
<div class="item text-center" data-slide-number="{{ $i }}">
|
<div class="item text-center" data-slide-number="{{ $i }}">
|
||||||
<span class="zoom img-zoom">
|
<span class="zoom img-zoom">
|
||||||
<img class="main-product-image" src="{{ minio_url('images/' . $thumbnail->Image) }}">
|
<img style="height:400px;" src="{{ config('site_config.images_url') }}/{{ $thumbnail->Image }}">
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
@define $i++
|
@define $i++
|
||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
|
||||||
|
|
||||||
<a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
|
|
||||||
<span class="glyphicon glyphicon-chevron-left"></span>
|
|
||||||
</a>
|
|
||||||
<a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
|
|
||||||
<span class="glyphicon glyphicon-chevron-right"></span>
|
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Carousel nav -->
|
||||||
|
<a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
|
||||||
|
<span class="glyphicon glyphicon-chevron-left"></span>
|
||||||
|
</a>
|
||||||
|
<a class="right carousel-control" href="#myCarousel" role="button" data-slide="next">
|
||||||
|
<span class="glyphicon glyphicon-chevron-right"></span>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- </div> -->
|
||||||
|
</div>
|
||||||
|
|
||||||
<hr class="line">
|
<hr class="line">
|
||||||
|
|
||||||
<ul class="hide-bullets row">
|
<div class="row">
|
||||||
@define $j = 0
|
<div class="col-md-12">
|
||||||
@foreach($thumbnails_array as $thumbnail)
|
<ul class="hide-bullets">
|
||||||
<li class="col-sm-3 col-xs-3">
|
@define $j = 0
|
||||||
<a class="thumbnail a_thumbnail {{ $thumbnail->ImageClass }}" id="carousel-selector-{{ $j }}">
|
@foreach($thumbnails_array as $thumbnail)
|
||||||
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $thumbnail->Image) }}"/>
|
<li class="col-sm-3 col-xs-3">
|
||||||
</a>
|
<a class="thumbnail a_thumbnail {{ $thumbnail->ImageClass }}" id="carousel-selector-{{ $j }}">
|
||||||
</li>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ config('site_config.images_url') }}/{{ $thumbnail->Image }}"/>
|
||||||
@define $j++
|
</a>
|
||||||
@endforeach
|
</li>
|
||||||
</ul>
|
@define $j++
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-md-7 col-sm-7">
|
<div class="col-md-7 col-sm-7">
|
||||||
<div class="product-info-card">
|
<div class="panel panel-default">
|
||||||
<h1 class="product-title">{{ $product_array[0]->ProductName }}</h1>
|
<div class="panel-heading">
|
||||||
<p class="price">{{ $product_array[0]->ProductPrice }} <small> {{ $store_array[0]->StoreCurrency }} </small></p>
|
<h1>{{ $product_array[0]->ProductName }}</h1> <p class="price">{{ $product_array[0]->ProductPrice }} <small> {{ $store_array[0]->StoreCurrency }} </small></p>
|
||||||
|
</div>
|
||||||
|
<div class="panel-body">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<form id="frm-order-list">
|
<form id="frm-order-list">
|
||||||
@@ -514,28 +300,24 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="spacer-top"></div>
|
||||||
<div class="description-card">
|
<div class="row">
|
||||||
<h3 class="description-title">Description</h3>
|
<div class="col-md-12">
|
||||||
<p class="description-text">{{ $product_array[0]->ProductDescription }}</p>
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
</div>
|
<li role="presentation" class="active"><a href="#productDescription" aria-controls="productDescription" role="tab" data-toggle="tab">Description</a></li>
|
||||||
|
</ul>
|
||||||
<div class="spacer-top"></div>
|
<!-- Tab panes -->
|
||||||
<div class="row">
|
<div class="tab-content">
|
||||||
<div class="col-md-12">
|
<div role="tabpanel" class="tab-pane active" id="productDescription">
|
||||||
<ul class="nav nav-tabs" role="tablist">
|
<div class="row">
|
||||||
<li role="presentation" class="active"><a href="#productDescription" aria-controls="productDescription" role="tab" data-toggle="tab">More Details</a></li>
|
<div class="col-md-12">
|
||||||
</ul>
|
<p>{{ $product_array[0]->ProductDescription }}</p>
|
||||||
<div class="tab-content">
|
</div>
|
||||||
<div role="tabpanel" class="tab-pane active" id="productDescription">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-12">
|
|
||||||
<p>{{ $product_array[0]->ProductDescription }}</p>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,237 +2,108 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
body {
|
a.thumbnail>img {
|
||||||
background: #f4f6f8;
|
/* height: 250px; */
|
||||||
}
|
}
|
||||||
|
|
||||||
.store-page {
|
.hide-bullets {
|
||||||
padding-top: 14px;
|
list-style:none;
|
||||||
padding-bottom: 26px;
|
margin-left: -40px;
|
||||||
|
margin-top:20px;
|
||||||
|
position: relative;
|
||||||
}
|
}
|
||||||
|
.thumbnail{
|
||||||
.store-header {
|
border: none;
|
||||||
margin-bottom: 14px;
|
display: unset;
|
||||||
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
.li-custom{
|
||||||
.store-title {
|
padding:10px;
|
||||||
margin: 0;
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #111827;
|
|
||||||
}
|
}
|
||||||
|
.store-logo{
|
||||||
.store-subtitle {
|
/* height: 250px;
|
||||||
margin: 6px 0 0;
|
width: 250px;
|
||||||
font-size: 13px;
|
|
||||||
color: #6b7280;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-toolbar {
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
border-radius: 12px;
|
|
||||||
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
|
|
||||||
padding: 14px;
|
|
||||||
margin-bottom: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-toolbar label {
|
|
||||||
font-size: 12px;
|
|
||||||
color: #4b5563;
|
|
||||||
font-weight: 600;
|
|
||||||
margin-bottom: 6px;
|
|
||||||
text-transform: uppercase;
|
|
||||||
letter-spacing: 0.4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-toolbar .form-control,
|
|
||||||
.store-toolbar .btn {
|
|
||||||
height: 40px;
|
|
||||||
border-radius: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-toolbar .form-control {
|
|
||||||
border-color: #d1d5db;
|
|
||||||
box-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-toolbar .form-control:focus {
|
|
||||||
border-color: #9ca3af;
|
|
||||||
box-shadow: 0 0 0 3px rgba(156, 163, 175, 0.18);
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-grid {
|
|
||||||
list-style: none;
|
|
||||||
padding-left: 0;
|
|
||||||
margin: 0 -10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-grid > li {
|
|
||||||
padding: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-card {
|
|
||||||
background: #fff;
|
|
||||||
border: 1px solid #e5e7eb;
|
|
||||||
border-radius: 12px;
|
|
||||||
box-shadow: 0 1px 2px rgba(16, 24, 40, 0.04);
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
height: 100%;
|
object-fit: contain; */
|
||||||
transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s;
|
/* cursor: pointer; */
|
||||||
}
|
}
|
||||||
|
a.thumbnail>img{
|
||||||
.store-card:hover {
|
height: 150px
|
||||||
transform: translateY(-2px);
|
|
||||||
border-color: #d1d5db;
|
|
||||||
box-shadow: 0 8px 24px rgba(15, 23, 42, 0.08);
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-link {
|
|
||||||
display: block;
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-link:hover,
|
|
||||||
.store-link:focus {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-logo-wrap {
|
|
||||||
height: 170px;
|
|
||||||
background: #f8fafc;
|
|
||||||
border-bottom: 1px solid #e5e7eb;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
padding: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-logo {
|
|
||||||
max-width: 100%;
|
|
||||||
max-height: 100%;
|
|
||||||
width: auto;
|
|
||||||
height: auto;
|
|
||||||
object-fit: contain;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-meta {
|
|
||||||
padding: 12px;
|
|
||||||
min-height: 72px;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-name {
|
|
||||||
margin: 0;
|
|
||||||
font-size: 15px;
|
|
||||||
line-height: 1.35;
|
|
||||||
font-weight: 700;
|
|
||||||
color: #111827;
|
|
||||||
text-align: center;
|
|
||||||
text-transform: uppercase;
|
|
||||||
word-break: break-word;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-lock {
|
|
||||||
color: #6b7280;
|
|
||||||
margin-left: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-pagination {
|
|
||||||
margin-top: 18px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-pagination .pagination {
|
|
||||||
margin: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 767px) {
|
|
||||||
.store-title {
|
|
||||||
font-size: 21px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-toolbar {
|
|
||||||
padding: 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.store-logo-wrap {
|
|
||||||
height: 155px;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<div class="container store-page">
|
<div class="container">
|
||||||
<div class="row store-header">
|
<div class="row">
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<h2 class="store-title">Team Stores</h2>
|
<h2 style="font-size: 20px; font-weight: bold; ">TEAM STORES</h2>
|
||||||
<p class="store-subtitle">Browse and open your team store.</p>
|
<hr>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div><!-- /row -->
|
||||||
|
<div class="row">
|
||||||
<div class="store-toolbar">
|
<!-- <div class="col-sm-12"> -->
|
||||||
<form role="search" id="frm_search_store">
|
<!-- <div class="well"> -->
|
||||||
<div class="row">
|
<form class="form-horizontal" role="search" id="frm_search_store">
|
||||||
<div class="col-md-8 col-sm-7">
|
<div class="col-lg-7">
|
||||||
<label>Search Store</label>
|
<div class="form-group">
|
||||||
<div class="input-group">
|
<div class="col-sm-12">
|
||||||
<input type="text" class="form-control" placeholder="Search store" value="{{ $keyword }}" name="q">
|
<label>Seach Store</label>
|
||||||
<div class="input-group-btn">
|
<div class="input-group">
|
||||||
<button class="btn btn-default" type="submit"><i class="fa fa-search"></i></button>
|
<input type="text" class="form-control" placeholder="Search Store" value="{{ $keyword }}" name="q">
|
||||||
|
<div class="input-group-btn">
|
||||||
|
<button class="btn btn-default" type="submit"><i class="fa fa-search"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="col-lg-5">
|
||||||
<div class="col-md-4 col-sm-5">
|
<div class="form-group">
|
||||||
<label>Sort by</label>
|
<label class="col-sm-7 control-label hidden-xs"> </label>
|
||||||
<select class="form-control" name="s" id="select_sort_stores">
|
<div class="col-sm-5">
|
||||||
<option @if($filter == "al-asc") selected @endif value="al-asc">Store Name A → Z</option>
|
<label>Sort by:</label>
|
||||||
<option @if($filter == "al-desc") selected @endif value="al-desc">Store Name Z → A</option>
|
<select class="form-control" name="s" id="select_sort_stores">
|
||||||
<option @if($filter == "latest") selected @endif value="latest">Newest → Oldest</option>
|
<option @if($filter == "al-asc") selected @endif value="al-asc">Store Name A → Z</option>
|
||||||
<option @if($filter == "oldest") selected @endif value="oldest">Oldest → Newest</option>
|
<option @if($filter == "al-desc") selected @endif value="al-desc">Store Name Z → A</option>
|
||||||
</select>
|
<option @if($filter == "latest") selected @endif value="latest">Newest → Oldest</option>
|
||||||
</div>
|
<option @if($filter == "oldest") selected @endif value="oldest">Oldest → Newest</option>
|
||||||
</div>
|
</select>
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="slider-thumbs">
|
|
||||||
<ul class="store-grid row">
|
|
||||||
@foreach ($stores_array as $store)
|
|
||||||
<li class="col-lg-3 col-md-4 col-sm-6 col-xs-12">
|
|
||||||
<div class="store-card">
|
|
||||||
@if($store->Password != null)
|
|
||||||
<a class="store-link password-protected" href="#" data-store-id="{{ $store->Id }}" data-store-url="{{ $store->StoreUrl }}">
|
|
||||||
<div class="store-logo-wrap">
|
|
||||||
<img class="store-logo" src="{{ minio_url('uploads/images/teamstore/' . $store->ImageFolder . '/' . $store->StoreLogo) }}">
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
<div class="store-meta">
|
|
||||||
<h4 class="store-name">{{ $store->StoreName }} <i class="fa fa-lock store-lock" title="This store is password protected."></i></h4>
|
|
||||||
</div>
|
</div>
|
||||||
@else
|
</div>
|
||||||
<a class="store-link" href="{{ url('teamstore') . '/' . $store->StoreUrl }}">
|
|
||||||
<div class="store-logo-wrap">
|
|
||||||
<img class="store-logo" src="{{ minio_url('uploads/images/teamstore/' . $store->ImageFolder . '/' . $store->StoreLogo) }}">
|
|
||||||
</div>
|
|
||||||
<div class="store-meta">
|
|
||||||
<h4 class="store-name">{{ $store->StoreName }}</h4>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
@endif
|
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</form>
|
||||||
@endforeach
|
<div class="clearfix"></div>
|
||||||
</ul>
|
<!-- </div> -->
|
||||||
|
<!-- </div> -->
|
||||||
</div>
|
</div>
|
||||||
|
<div class="row" id="slider-thumbs">
|
||||||
<div class="row store-pagination">
|
<!-- Bottom switcher of slider -->
|
||||||
|
<ul class="hide-bullets">
|
||||||
|
@foreach ($stores_array as $store)
|
||||||
|
<li class="li-custom col-lg-3 col-md-3 col-sm-4 col-xs-12">
|
||||||
|
<div style="border: 1px solid #dddddd; padding: 5px;">
|
||||||
|
@if($store->Password != null )
|
||||||
|
<a class="thumbnail password-protected" href="#" data-store-id="{{ $store->Id }}" data-store-url="{{ $store->StoreUrl }}">
|
||||||
|
<img class="store-logo" src="{{ minio_url('uploads/images/teamstore/' . $store->ImageFolder . '/' . $store->StoreLogo) }}">
|
||||||
|
</a>
|
||||||
|
<h4 style="border-top: 1px solid #dddddd; padding: 10px; font-size: 16px; font-weight: bold; text-transform: uppercase;" class="text-center">{{ $store->StoreName }} <i class="fa fa-lock" title="This store is password protected."></i></h4>
|
||||||
|
@else
|
||||||
|
<a class="thumbnail" href="{{ url('teamstore') . '/' . $store->StoreUrl }}">
|
||||||
|
<img class="store-logo" src="{{ minio_url('uploads/images/teamstore/' . $store->ImageFolder . '/' . $store->StoreLogo) }}">
|
||||||
|
</a>
|
||||||
|
<h4 style="border-top: 1px solid #dddddd; padding: 10px; font-size: 16px; font-weight: bold; text-transform: uppercase;" class="text-center">{{ $store->StoreName }}</h4>
|
||||||
|
@endif
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
@endforeach
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
{!! $stores_array->render() !!}
|
{!! $stores_array->render() !!}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div><!-- /container -->
|
||||||
|
|
||||||
|
|
||||||
<div id="team-store-login" class="modal fade" role="dialog">
|
<div id="team-store-login" class="modal fade" role="dialog">
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
@extends('layout.main')
|
|
||||||
|
|
||||||
@section('content')
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6 col-md-offset-3" style="margin-top: 40px; margin-bottom: 40px;">
|
|
||||||
<div class="panel panel-default">
|
|
||||||
<div class="panel-heading">
|
|
||||||
<h3 class="panel-title"><strong>Send Test Email</strong></h3>
|
|
||||||
</div>
|
|
||||||
<div class="panel-body">
|
|
||||||
|
|
||||||
@if (session('message'))
|
|
||||||
<div class="alert alert-{{ session('status') }} alert-dismissible" role="alert">
|
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
|
||||||
<span aria-hidden="true">×</span>
|
|
||||||
</button>
|
|
||||||
{{ session('message') }}
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
|
|
||||||
<!-- Mail Config Info -->
|
|
||||||
<div class="well well-sm" style="font-size: 12px;">
|
|
||||||
<strong>Current Mail Config</strong><br>
|
|
||||||
Driver: <code>{{ config('mail.driver') ?: '(not set)' }}</code><br>
|
|
||||||
Host: <code>{{ config('mail.host') ?: '(not set)' }}</code><br>
|
|
||||||
Port: <code>{{ config('mail.port') ?: '(not set)' }}</code><br>
|
|
||||||
Username: <code>{{ config('mail.username') ?: '(not set)' }}</code><br>
|
|
||||||
Encryption: <code>{{ config('mail.encryption') ?: '(not set)' }}</code>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<form method="POST" action="{{ url('test-email/send') }}">
|
|
||||||
<input type="hidden" name="_token" value="{{ csrf_token() }}">
|
|
||||||
<input type="hidden" name="token" value="{{ $token }}">
|
|
||||||
<div class="form-group{{ $errors->has('recipient') ? ' has-error' : '' }}">
|
|
||||||
<label for="recipient">Recipient Email</label>
|
|
||||||
<input type="email"
|
|
||||||
name="recipient"
|
|
||||||
id="recipient"
|
|
||||||
class="form-control"
|
|
||||||
placeholder="you@example.com"
|
|
||||||
value="{{ old('recipient') }}"
|
|
||||||
required>
|
|
||||||
@if ($errors->has('recipient'))
|
|
||||||
<span class="help-block">{{ $errors->first('recipient') }}</span>
|
|
||||||
@endif
|
|
||||||
</div>
|
|
||||||
<button type="submit" class="btn btn-primary btn-block">
|
|
||||||
<i class="fa fa-envelope"></i> Send Test Email
|
|
||||||
</button>
|
|
||||||
</form>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@endsection
|
|
||||||
@@ -108,7 +108,7 @@
|
|||||||
<label>Item URL</label>
|
<label>Item URL</label>
|
||||||
<input type="text" class="form-control" id="product_url" name="itemUrl" placeholder="Item URL">
|
<input type="text" class="form-control" id="product_url" name="itemUrl" placeholder="Item URL">
|
||||||
<!-- <div class="input-group">
|
<!-- <div class="input-group">
|
||||||
<span class="input-group-addon" id="basic-addon3">{{ url() . "/teamstore/" . $store_array[0]->StoreUrl . '/'}}</span>
|
<span class="input-group-addon" id="basic-addon3">{{ url('/') . "/teamstore/" . $store_array[0]->StoreUrl . '/'}}</span>
|
||||||
<input type="text" class="form-control" id="product_url" name="itemUrl" aria-describedby="basic-addon3" data-error="#err-itemUrl" >
|
<input type="text" class="form-control" id="product_url" name="itemUrl" aria-describedby="basic-addon3" data-error="#err-itemUrl" >
|
||||||
</div>
|
</div>
|
||||||
<span id="err-itemUrl"></span> -->
|
<span id="err-itemUrl"></span> -->
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
@foreach($array_client_designs as $row)
|
@foreach($array_client_designs as $row)
|
||||||
@foreach($array_template_paths as $key => $row1)
|
@foreach($array_template_paths as $key => $row1)
|
||||||
@if($key == 0)
|
@if($key == 0)
|
||||||
<img src="{{ minio_url('images/' . $row->DesignCode . '-front-thumbnail.png') }}" alt="{{ $row->DesignName }}" id="main-thumbnail" class="img img-responsive">
|
<img src="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png" alt="{{ $row->DesignName }}" id="main-thumbnail" class="img img-responsive">
|
||||||
@endif
|
@endif
|
||||||
@endforeach
|
@endforeach
|
||||||
@endforeach
|
@endforeach
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
@if($key == 0)
|
@if($key == 0)
|
||||||
<li class="col-sm-3 col-xs-3">
|
<li class="col-sm-3 col-xs-3">
|
||||||
<a class="thumbnail a_thumbnail active">
|
<a class="thumbnail a_thumbnail active">
|
||||||
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $row->DesignCode . '-front-thumbnail.png') }}"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png"/>
|
||||||
</a>
|
</a>
|
||||||
<!-- <p>Select Default Thumbnail:</p>
|
<!-- <p>Select Default Thumbnail:</p>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
@else
|
@else
|
||||||
<li class="col-sm-3 col-xs-3">
|
<li class="col-sm-3 col-xs-3">
|
||||||
<a class="thumbnail a_thumbnail">
|
<a class="thumbnail a_thumbnail">
|
||||||
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $row->DesignCode . '-' . strtolower($row1->Side) . '-thumbnail.png') }}"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-{{ strtolower($row1->Side) }}-thumbnail.png"/>
|
||||||
</a>
|
</a>
|
||||||
<!-- <p> </p>
|
<!-- <p> </p>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
@@ -133,7 +133,7 @@
|
|||||||
<label>Item URL</label>
|
<label>Item URL</label>
|
||||||
<input type="text" class="form-control" id="product_url" name="itemUrl" placeholder="Item URL">
|
<input type="text" class="form-control" id="product_url" name="itemUrl" placeholder="Item URL">
|
||||||
<!-- <div class="input-group">
|
<!-- <div class="input-group">
|
||||||
<span class="input-group-addon" id="basic-addon3">{{ url() . "/teamstore/" . $store_array[0]->StoreUrl . '/'}}</span>
|
<span class="input-group-addon" id="basic-addon3">{{ url('/') . "/teamstore/" . $store_array[0]->StoreUrl . '/'}}</span>
|
||||||
<input type="text" class="form-control" id="product_url" name="itemUrl" aria-describedby="basic-addon3" data-error="#err-itemUrl" >
|
<input type="text" class="form-control" id="product_url" name="itemUrl" aria-describedby="basic-addon3" data-error="#err-itemUrl" >
|
||||||
</div>
|
</div>
|
||||||
<span id="err-itemUrl"></span> -->
|
<span id="err-itemUrl"></span> -->
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
@foreach($array_client_designs as $row)
|
@foreach($array_client_designs as $row)
|
||||||
<div class="col-md-3 col-sm-6">
|
<div class="col-md-3 col-sm-6">
|
||||||
<span class="thumbnail">
|
<span class="thumbnail">
|
||||||
<img src="{{ minio_url('images/' . $row->DesignCode . '-front-thumbnail.png') }}" alt="{{ $row->DesignName }}" >
|
<img src="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png" alt="{{ $row->DesignName }}" >
|
||||||
<h4 class="design-name-holder">{{ $row->DesignName }}</h4>
|
<h4 class="design-name-holder">{{ $row->DesignName }}</h4>
|
||||||
<small>{{ date('F j, Y g:i a', strtotime($row->DateCreated)) }}</small>
|
<small>{{ date('F j, Y g:i a', strtotime($row->DateCreated)) }}</small>
|
||||||
<hr class="line">
|
<hr class="line">
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-2">
|
<div class="col-md-2">
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<img class="previewImage" id="active_thumbnail" src="{{ minio_url('images/' . $array_thumbnail_display[0]->Image) }}">
|
<img class="previewImage" id="active_thumbnail" src="{{ config('site_config.images_url') . '/images/' . $array_thumbnail_display[0]->Image }}">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-10">
|
<div class="col-md-10">
|
||||||
|
|||||||
@@ -93,7 +93,7 @@
|
|||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
@foreach($img_thumb as $img)
|
@foreach($img_thumb as $img)
|
||||||
@if($img->ProductId == $item->ProductId)
|
@if($img->ProductId == $item->ProductId)
|
||||||
<img class="previewImage" src="{{ minio_url('images/' . $img->Image) }}">
|
<img class="previewImage" src="{{ config('site_config.images_url') }}/{{ $img->Image }}">
|
||||||
@endif
|
@endif
|
||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
@foreach($array_client_designs as $row)
|
@foreach($array_client_designs as $row)
|
||||||
@foreach($array_template_paths as $key => $row1)
|
@foreach($array_template_paths as $key => $row1)
|
||||||
@if($key == 0)
|
@if($key == 0)
|
||||||
<img src="{{ minio_url('images/' . $row->DesignCode . '-front-thumbnail.png') }}" alt="{{ $row->DesignName }}" id="main-thumbnail" class="img img-responsive">
|
<img src="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png" alt="{{ $row->DesignName }}" id="main-thumbnail" class="img img-responsive">
|
||||||
@endif
|
@endif
|
||||||
@endforeach
|
@endforeach
|
||||||
@endforeach
|
@endforeach
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
@if($key == 0)
|
@if($key == 0)
|
||||||
<li class="col-sm-3 col-xs-3">
|
<li class="col-sm-3 col-xs-3">
|
||||||
<a class="thumbnail a_thumbnail active">
|
<a class="thumbnail a_thumbnail active">
|
||||||
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $row->DesignCode . '-front-thumbnail.png') }}"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png"/>
|
||||||
</a>
|
</a>
|
||||||
<!-- <p>Select Default Thumbnail:</p>
|
<!-- <p>Select Default Thumbnail:</p>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
@@ -66,7 +66,7 @@
|
|||||||
@else
|
@else
|
||||||
<li class="col-sm-3 col-xs-3">
|
<li class="col-sm-3 col-xs-3">
|
||||||
<a class="thumbnail a_thumbnail">
|
<a class="thumbnail a_thumbnail">
|
||||||
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $row->DesignCode . '-' . strtolower($row1->Side) . '-thumbnail.png') }}"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-{{ strtolower($row1->Side) }}-thumbnail.png"/>
|
||||||
</a>
|
</a>
|
||||||
<!-- <p> </p>
|
<!-- <p> </p>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
@@ -133,7 +133,7 @@
|
|||||||
<label>Item URL</label>
|
<label>Item URL</label>
|
||||||
<input type="text" class="form-control" id="product_url" name="itemUrl" placeholder="Item URL">
|
<input type="text" class="form-control" id="product_url" name="itemUrl" placeholder="Item URL">
|
||||||
<!-- <div class="input-group">
|
<!-- <div class="input-group">
|
||||||
<span class="input-group-addon" id="basic-addon3">{{ url() . "/teamstore/" . $store_array[0]->StoreUrl . '/'}}</span>
|
<span class="input-group-addon" id="basic-addon3">{{ url('/') . "/teamstore/" . $store_array[0]->StoreUrl . '/'}}</span>
|
||||||
<input type="text" class="form-control" id="product_url" name="itemUrl" aria-describedby="basic-addon3" data-error="#err-itemUrl" >
|
<input type="text" class="form-control" id="product_url" name="itemUrl" aria-describedby="basic-addon3" data-error="#err-itemUrl" >
|
||||||
</div>
|
</div>
|
||||||
<span id="err-itemUrl"></span> -->
|
<span id="err-itemUrl"></span> -->
|
||||||
|
|||||||
@@ -59,7 +59,7 @@
|
|||||||
<div class="col-md-3 col-sm-6">
|
<div class="col-md-3 col-sm-6">
|
||||||
<div class="thumbnail" >
|
<div class="thumbnail" >
|
||||||
<a href="{{ url('user/store-items/item') }}/{{ $product->ProductURL }}">
|
<a href="{{ url('user/store-items/item') }}/{{ $product->ProductURL }}">
|
||||||
<img style="height:200px" src="{{ minio_url('images/' . $filename) . '?t=' . time() }}" alt="{{ $product->ProductName }}" >
|
<img style="height:200px" src="{{ config('site_config.images_url') }}/{{ $filename . '?t=' . time() }}" alt="{{ $product->ProductName }}" >
|
||||||
</a>
|
</a>
|
||||||
<hr class="line">
|
<hr class="line">
|
||||||
<div class="pull-right">
|
<div class="pull-right">
|
||||||
|
|||||||
@@ -63,7 +63,7 @@
|
|||||||
<div id="{{ 'order_number_' . $product->Id }}">
|
<div id="{{ 'order_number_' . $product->Id }}">
|
||||||
<div class="thumbnail" >
|
<div class="thumbnail" >
|
||||||
<a href="#">
|
<a href="#">
|
||||||
<img style="height:200px" src="{{ minio_url('images/' . $filename) . '?t=' . time() }}" alt="{{ $product->ProductName }}" >
|
<img style="height:200px" src="{{ config('site_config.images_url') }}/{{ $filename . '?t=' . time() }}" alt="{{ $product->ProductName }}" >
|
||||||
</a>
|
</a>
|
||||||
<hr class="line">
|
<hr class="line">
|
||||||
<div class="pull-right">
|
<div class="pull-right">
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
@foreach($array_client_designs as $row)
|
@foreach($array_client_designs as $row)
|
||||||
@foreach($array_template_paths as $key => $row1)
|
@foreach($array_template_paths as $key => $row1)
|
||||||
@if($key == 0)
|
@if($key == 0)
|
||||||
<img src="{{ minio_url('images/' . $row->DesignCode . '-front-thumbnail.png') }}" alt="{{ $row->DesignName }}" id="main-thumbnail" class="img img-responsive">
|
<img src="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png" alt="{{ $row->DesignName }}" id="main-thumbnail" class="img img-responsive">
|
||||||
@endif
|
@endif
|
||||||
@endforeach
|
@endforeach
|
||||||
@endforeach
|
@endforeach
|
||||||
@@ -53,13 +53,13 @@
|
|||||||
@if($key == 0)
|
@if($key == 0)
|
||||||
<li class="col-sm-3 col-xs-3">
|
<li class="col-sm-3 col-xs-3">
|
||||||
<a class="thumbnail a_thumbnail active">
|
<a class="thumbnail a_thumbnail active">
|
||||||
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $row->DesignCode . '-front-thumbnail.png') }}"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png"/>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
@else
|
@else
|
||||||
<li class="col-sm-3 col-xs-3">
|
<li class="col-sm-3 col-xs-3">
|
||||||
<a class="thumbnail a_thumbnail">
|
<a class="thumbnail a_thumbnail">
|
||||||
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $row->DesignCode . '-' . strtolower($row1->Side) . '-thumbnail.png') }}"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-{{ strtolower($row1->Side) }}-thumbnail.png"/>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
@endif
|
@endif
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
<div class="col-md-12 text-center">
|
<div class="col-md-12 text-center">
|
||||||
@foreach($thumbnails_array as $thumbnail)
|
@foreach($thumbnails_array as $thumbnail)
|
||||||
@if($thumbnail->ImageClass == 'active')
|
@if($thumbnail->ImageClass == 'active')
|
||||||
<img style="height:400px" src="{{ minio_url('images/' . $thumbnail->Image) . '?t=' . time() }}" id="main-thumbnail">
|
<img style="height:400px" src="{{ config('site_config.images_url') }}/{{ $thumbnail->Image . '?t=' . time() }}" id="main-thumbnail">
|
||||||
@endif
|
@endif
|
||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
@@ -58,7 +58,7 @@
|
|||||||
<li class="col-sm-3 col-xs-4">
|
<li class="col-sm-3 col-xs-4">
|
||||||
<a class="thumbnail a_thumbnail {{ $thumbnail->ImageClass }}" style="border-bottom-left-radius: 0px; border-bottom-right-radius: 0px; margin-bottom: -28px;">
|
<a class="thumbnail a_thumbnail {{ $thumbnail->ImageClass }}" style="border-bottom-left-radius: 0px; border-bottom-right-radius: 0px; margin-bottom: -28px;">
|
||||||
<!-- <span class="close">×</span> -->
|
<!-- <span class="close">×</span> -->
|
||||||
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $thumbnail->Image) . '?t=' . time() }}"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ config('site_config.images_url') }}/{{ $thumbnail->Image . '?t=' . time() }}"/>
|
||||||
</a>
|
</a>
|
||||||
<div class="funkyradio">
|
<div class="funkyradio">
|
||||||
<div class="funkyradio-primary">
|
<div class="funkyradio-primary">
|
||||||
@@ -200,7 +200,7 @@
|
|||||||
|
|
||||||
<tr id="{{ 'item-' . $thumbnail->Id }}">
|
<tr id="{{ 'item-' . $thumbnail->Id }}">
|
||||||
<td class="text-center" style="width: 50px"><i class="fa fa-bars"></i></td>
|
<td class="text-center" style="width: 50px"><i class="fa fa-bars"></i></td>
|
||||||
<td><img class="img img-responsive product-center" style="height: 59.45px;" src="{{ minio_url('images/' . $thumbnail->Image) . '?t=' . time() }}"/></td>
|
<td><img class="img img-responsive product-center" style="height: 59.45px;" src="{{ config('site_config.images_url') }}/{{ $thumbnail->Image . '?t=' . time() }}"/></td>
|
||||||
<td class="text-center">
|
<td class="text-center">
|
||||||
<!-- <button class="btn btn-default btn-xs btn-edit-clipart" data-id="#"><i class="fa fa-edit"></i></button> -->
|
<!-- <button class="btn btn-default btn-xs btn-edit-clipart" data-id="#"><i class="fa fa-edit"></i></button> -->
|
||||||
<button class="btn btn-default btn-sm btn-delete-item-image" data-id="{{ $thumbnail->Id }}" data-filename="{{ $thumbnail->Image }}" title="Delete Image"><i class="fa fa-trash"></i></button>
|
<button class="btn btn-default btn-sm btn-delete-item-image" data-id="{{ $thumbnail->Id }}" data-filename="{{ $thumbnail->Image }}" title="Delete Image"><i class="fa fa-trash"></i></button>
|
||||||
|
|||||||
22
routes/api.php
Normal file
22
routes/api.php
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| API Routes
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Here is where you can register API routes for your application. These
|
||||||
|
| routes are loaded by the RouteServiceProvider within a group which
|
||||||
|
| is assigned the "api" middleware group. Enjoy building your API!
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
Route::group(['middleware' => ['isAuthorized', 'cors']], function () {
|
||||||
|
Route::post('login', 'ApiController@login');
|
||||||
|
Route::post('insert', 'ApiController@insert');
|
||||||
|
Route::get('tracking', 'ApiController@getTrackingStatus');
|
||||||
|
Route::get('order-status', 'ApiController@getOrderStatus');
|
||||||
|
Route::get('steps', 'ApiController@getSteps');
|
||||||
|
});
|
||||||
190
routes/web.php
Normal file
190
routes/web.php
Normal file
@@ -0,0 +1,190 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Route;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Web Routes
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| Here is where you can register web routes for your application. These
|
||||||
|
| routes are loaded by the RouteServiceProvider within a group which
|
||||||
|
| contains the "web" middleware group. Now create something great!
|
||||||
|
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Authentication Routes (expanded from Route::controllers)
|
||||||
|
Route::get('login', 'Auth\AuthController@showLoginForm')->name('login');
|
||||||
|
Route::post('login', 'Auth\AuthController@login');
|
||||||
|
Route::post('logout', 'Auth\AuthController@logout')->name('logout');
|
||||||
|
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
|
||||||
|
Route::post('register', 'Auth\RegisterController@register');
|
||||||
|
|
||||||
|
// Password Reset Routes
|
||||||
|
Route::get('password/reset', 'Auth\PasswordController@getEmail');
|
||||||
|
Route::post('password/email', 'Auth\PasswordController@postEmail');
|
||||||
|
Route::get('password/reset/{token}', 'Auth\PasswordController@getReset');
|
||||||
|
Route::post('password/reset', 'Auth\PasswordController@postReset');
|
||||||
|
|
||||||
|
// Main Routes
|
||||||
|
Route::get('/', 'MainController@index');
|
||||||
|
Route::get('/sportslist', 'MainController@sports');
|
||||||
|
Route::get('/sports/{url}', 'MainController@templatesCat');
|
||||||
|
Route::get('/sports/{url}/{id}', 'MainController@templatesByCategory');
|
||||||
|
Route::get('/templatelist', 'MainController@fetchTemplates');
|
||||||
|
Route::get('/cartcount', 'MainController@countCart');
|
||||||
|
Route::get('/removeitem/{id}', 'MainController@removeCartItem');
|
||||||
|
|
||||||
|
// Custom Authentication
|
||||||
|
Route::post('/custom/auth', 'CustomAuthController@authenticate');
|
||||||
|
Route::post('/custom/register', 'CustomAuthController@postRegister');
|
||||||
|
|
||||||
|
// Cart and Checkout
|
||||||
|
Route::get('cart', 'teamstore\TeamStoreController@cart')->name('cart');
|
||||||
|
Route::get('/checkout', 'teamstore\TeamStoreController@checkout');
|
||||||
|
Route::get('/mail', 'teamstore\TeamStoreController@mail');
|
||||||
|
|
||||||
|
// Designer Routes
|
||||||
|
Route::get('/designer/{templateid}', 'designer\DesignerController@index');
|
||||||
|
Route::get('/designer/preview/{designCode}', 'designer\DesignerController@getDesign');
|
||||||
|
Route::post('/designer/a/buy-form', 'designer\DesignerController@buyForm');
|
||||||
|
|
||||||
|
// Designer Edit Routes
|
||||||
|
Route::get('/designer/edit/{designCode}', 'designer\DesignerController@editDesign');
|
||||||
|
|
||||||
|
// Designer AJAX Routes
|
||||||
|
Route::post('/designer/a/save-roster', 'designer\DesignerController@saveRoster');
|
||||||
|
Route::post('/designer/a/gradient-append', 'designer\DesignerController@gradientAppend');
|
||||||
|
Route::post('/designer/a/set-pattern', 'designer\DesignerController@setPattern');
|
||||||
|
Route::post('/designer/a/set-trim-pattern', 'designer\DesignerController@setTrimPattern');
|
||||||
|
Route::post('/designer/a/get-template-default-colors', 'designer\DesignerController@getTemplateDefaultColors');
|
||||||
|
Route::post('/designer/a/get-font-display', 'designer\DesignerController@getFontDisplay');
|
||||||
|
Route::post('/designer/a/get-cliparts', 'designer\DesignerController@getCliparts');
|
||||||
|
Route::post('/designer/a/clipart-properties', 'designer\DesignerController@clipartProperties');
|
||||||
|
Route::post('/designer/a/save-design', 'designer\DesignerController@saveDesign');
|
||||||
|
Route::post('/designer/edit/a/edit-gradient-append', 'designer\DesignerController@editGradientAppend');
|
||||||
|
Route::post('/designer/edit/a/edit-pattern-properties', 'designer\DesignerController@editPatternProperties');
|
||||||
|
Route::post('/designer/edit/a/edit-set-pattern', 'designer\DesignerController@editSetPattern');
|
||||||
|
Route::get('/designer/a/tab-clipart-content', 'designer\DesignerController@tabClipartContent');
|
||||||
|
Route::post('/designer/a/save-design-details', 'designer\DesignerController@saveDesignDetails');
|
||||||
|
|
||||||
|
// Team Store Routes
|
||||||
|
Route::get('/teamstore', 'teamstore\TeamStoreController@storelist');
|
||||||
|
Route::get('/teamstore/{storename}', 'teamstore\TeamStoreController@index');
|
||||||
|
Route::get('/teamstore/{storename}/product/{producurl}', 'teamstore\TeamStoreController@productDetails');
|
||||||
|
Route::post('/teamstore/q/add-to-cart', 'teamstore\TeamStoreController@addToCart');
|
||||||
|
Route::get('/teamstore/q/clearsession', 'teamstore\TeamStoreController@clearSession');
|
||||||
|
Route::post('/teamstore/q/add-voucher', 'teamstore\TeamStoreController@addVoucher');
|
||||||
|
Route::post('/teamstore/q/add-new-row', 'teamstore\TeamStoreController@addNewRow');
|
||||||
|
Route::post('/teamstore/checkpassword', 'teamstore\TeamStoreController@checkTeamStorePassword');
|
||||||
|
|
||||||
|
// User Routes (Protected by normaluser middleware)
|
||||||
|
Route::group(['middleware' => 'normaluser', 'prefix' => 'user'], function () {
|
||||||
|
Route::get('/', 'user\UserController@index');
|
||||||
|
|
||||||
|
// Address Book
|
||||||
|
Route::get('address-book', 'user\UserController@addressBook');
|
||||||
|
Route::get('address-book/create', 'user\UserController@createAddressBook');
|
||||||
|
Route::post('address-book/save', 'user\UserController@saveAddressBook');
|
||||||
|
Route::get('address-book/edit/{id}', 'user\UserController@editAddressBook');
|
||||||
|
Route::post('address-book/update', 'user\UserController@updateAddressBook');
|
||||||
|
|
||||||
|
// Profile
|
||||||
|
Route::get('profile', 'user\UserController@profile');
|
||||||
|
Route::get('profile/edit', 'user\UserController@editProfile');
|
||||||
|
Route::post('profile/update', 'user\UserController@updateProfile');
|
||||||
|
Route::get('profile/change-password', 'user\UserController@changePassword');
|
||||||
|
Route::post('profile/update-password', 'user\UserController@updatePassword');
|
||||||
|
|
||||||
|
// Orders
|
||||||
|
Route::get('orders', 'user\UserController@orders');
|
||||||
|
Route::get('orders/view/{ck}', 'user\UserController@orderDetails');
|
||||||
|
|
||||||
|
// My Designs
|
||||||
|
Route::get('my-designs', 'user\UserController@myDesigns');
|
||||||
|
Route::get('my-designs/view/{id}', 'user\UserController@viewDesign');
|
||||||
|
Route::post('my-designs/update', 'user\UserController@updateDesignDetails');
|
||||||
|
Route::get('my-designs/sell-design/{designCode}', 'user\UserController@sellDesign');
|
||||||
|
Route::post('my-designs/addstoreitem', 'user\UserController@saveNewStoreItem');
|
||||||
|
Route::get('my-designs/buy-design/{designCode}', 'user\UserController@buyDesign');
|
||||||
|
|
||||||
|
// Store Management
|
||||||
|
Route::get('store', 'user\UserController@store');
|
||||||
|
Route::get('store-items', 'user\UserController@storeItems');
|
||||||
|
Route::get('store-items/item/{url}', 'user\UserController@viewStoreItem');
|
||||||
|
Route::post('store-items/update', 'user\UserController@storeItemUpdate');
|
||||||
|
Route::get('store-items/add-item', 'user\UserController@addStoreItem');
|
||||||
|
Route::post('store-items/save-new-item', 'user\UserController@saveNewItem');
|
||||||
|
Route::post('store-items/save-new-item-image', 'user\UserController@saveNewItemImage');
|
||||||
|
Route::get('store-items/re-arrange', 'user\UserController@itemStoreReArrange');
|
||||||
|
Route::post('store-items/delete', 'user\UserController@deleteStoreItem');
|
||||||
|
|
||||||
|
// Store Settings
|
||||||
|
Route::get('store-settings', 'user\UserController@storeSetting');
|
||||||
|
Route::post('store-settings/update', 'user\UserController@storeSettingUpdate');
|
||||||
|
|
||||||
|
// Store Orders
|
||||||
|
Route::get('store-orders', 'user\UserController@storeOrders');
|
||||||
|
|
||||||
|
// Email Verification
|
||||||
|
Route::get('email-verify', 'user\UserController@emailVerify');
|
||||||
|
Route::post('post/resend-verification', 'user\UserController@resendVericationCode');
|
||||||
|
Route::post('post/verify-code', 'user\UserController@verifyCode');
|
||||||
|
|
||||||
|
// AJAX Routes
|
||||||
|
Route::post('update-active-thumbnail', 'user\UserController@updateActiveThumbnail');
|
||||||
|
Route::post('post/save-thumbnail-ordering', 'user\UserController@saveThumbnailOrdering');
|
||||||
|
Route::post('post/save-item-ordering', 'user\UserController@saveItemOrdering');
|
||||||
|
Route::post('post/show-store-order-details', 'user\UserController@showStoreOrderDetails');
|
||||||
|
Route::post('post/delete-image-thumb', 'user\UserController@deleteImageThumb');
|
||||||
|
|
||||||
|
// Announcement
|
||||||
|
Route::get('announcement', 'user\UserController@announcementIndex');
|
||||||
|
Route::post('announcement/updateSave', 'user\UserController@announcementUpdateSave');
|
||||||
|
Route::post('announcement/status/update', 'user\UserController@announcementUpdateStatus');
|
||||||
|
});
|
||||||
|
|
||||||
|
// PayPal Routes (Protected by auth middleware)
|
||||||
|
Route::group(['middleware' => 'auth'], function () {
|
||||||
|
Route::get('payPremium', 'paypal\PaypalController@payPremium')->name('payPremium');
|
||||||
|
Route::get('getCheckout', 'paypal\PaypalController@getCheckout')->name('getCheckout');
|
||||||
|
Route::get('getDone', 'paypal\PaypalController@getDone')->name('getDone');
|
||||||
|
Route::get('getCancel', 'paypal\PaypalController@getCancel')->name('getCancel');
|
||||||
|
Route::get('getDoneTest', 'paypal\PaypalController@getDoneTest')->name('getDoneTest');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Admin Routes (Protected by admin middleware)
|
||||||
|
Route::group(['middleware' => 'admin', 'prefix' => 'admin'], function () {
|
||||||
|
Route::get('/', function () {
|
||||||
|
return view('sub_pages.index');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Sports Management
|
||||||
|
Route::get('sports', 'SportsController@displayAllSports');
|
||||||
|
Route::get('sports/add', 'SportsController@displayAddSportPage');
|
||||||
|
Route::post('sports/save', 'SportsController@saveNewSports');
|
||||||
|
Route::get('sports/edit/{sportsname}', 'SportsController@sportsDetails');
|
||||||
|
Route::post('sports/update', 'SportsController@updateSports');
|
||||||
|
Route::get('sports/sportsname', 'SportsController@selectSportsName');
|
||||||
|
|
||||||
|
// Templates Management
|
||||||
|
Route::get('templates', 'TemplatesController@displayTemplates');
|
||||||
|
Route::post('templates/id/{id}', 'TemplatesController@getTemplates');
|
||||||
|
Route::get('templates/add', 'TemplatesController@displayAddTemplatePage');
|
||||||
|
Route::get('templates/type', 'TemplatesController@getTemplateTypes');
|
||||||
|
Route::get('templates/getlastid', 'TemplatesController@getLastId');
|
||||||
|
Route::post('templates/save', 'TemplatesController@saveNewTemplates');
|
||||||
|
Route::get('templates/edit/{tempcode}', 'TemplatesController@displayEditTemplatePage');
|
||||||
|
Route::post('templates/update', 'TemplatesController@updateTemplate');
|
||||||
|
Route::get('templates/edit/{tempcode}/p-add', 'PrintPatternController@displayAddPrintTemplatePage');
|
||||||
|
|
||||||
|
// Patterns Management
|
||||||
|
Route::get('pattern/get', 'PatternsController@getPatterns');
|
||||||
|
Route::post('pattern/get/withvalue', 'PatternsController@getPatternsWithPostValue');
|
||||||
|
|
||||||
|
// Print Template
|
||||||
|
Route::post('print-template/save', 'PrintPatternController@savePrintPattern');
|
||||||
|
});
|
||||||
|
|
||||||
|
// Cliparts Routes
|
||||||
|
Route::get('cliparts/index', 'cliparts\ClipartsController@index');
|
||||||
23
test-key.php
Normal file
23
test-key.php
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
require __DIR__.'/vendor/autoload.php';
|
||||||
|
|
||||||
|
$app = require_once __DIR__.'/bootstrap/app.php';
|
||||||
|
|
||||||
|
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
|
||||||
|
|
||||||
|
try {
|
||||||
|
echo "APP_KEY from env: " . env('APP_KEY') . "\n";
|
||||||
|
echo "APP_CIPHER from config: " . config('app.cipher') . "\n";
|
||||||
|
echo "Key starts with base64: " . (strpos(env('APP_KEY'), 'base64:') === 0 ? 'YES' : 'NO') . "\n";
|
||||||
|
|
||||||
|
$key = env('APP_KEY');
|
||||||
|
if (strpos($key, 'base64:') === 0) {
|
||||||
|
$decoded = base64_decode(substr($key, 7));
|
||||||
|
echo "Decoded key length: " . strlen($decoded) . " bytes\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
} catch (Exception $e) {
|
||||||
|
echo "Error: " . $e->getMessage() . "\n";
|
||||||
|
echo "File: " . $e->getFile() . ":" . $e->getLine() . "\n";
|
||||||
|
}
|
||||||
88
test-laravel-5.5.sh
Executable file
88
test-laravel-5.5.sh
Executable file
@@ -0,0 +1,88 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Test Laravel 5.5 upgrade in Docker container
|
||||||
|
|
||||||
|
echo "========================================="
|
||||||
|
echo "Laravel 5.5 Upgrade Test Script"
|
||||||
|
echo "========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Colors
|
||||||
|
GREEN='\033[0;32m'
|
||||||
|
RED='\033[0;31m'
|
||||||
|
YELLOW='\033[1;33m'
|
||||||
|
NC='\033[0m' # No Color
|
||||||
|
|
||||||
|
# Build the container
|
||||||
|
echo -e "${YELLOW}Step 1: Building Docker container with PHP 7.0...${NC}"
|
||||||
|
docker compose -f docker-compose.local.yml build app
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo -e "${RED}✗ Docker build failed${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ Docker build successful${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Start the container
|
||||||
|
echo -e "${YELLOW}Step 2: Starting container...${NC}"
|
||||||
|
docker compose -f docker-compose.local.yml up -d app
|
||||||
|
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo -e "${RED}✗ Failed to start container${NC}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo -e "${GREEN}✓ Container started${NC}"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Wait for container to be ready
|
||||||
|
echo "Waiting for container to be ready..."
|
||||||
|
sleep 5
|
||||||
|
|
||||||
|
# Check PHP version
|
||||||
|
echo -e "${YELLOW}Step 3: Verifying PHP version...${NC}"
|
||||||
|
PHP_VERSION=$(docker compose -f docker-compose.local.yml exec -T app php -v | head -1)
|
||||||
|
echo "PHP Version: $PHP_VERSION"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check Laravel version
|
||||||
|
echo -e "${YELLOW}Step 4: Verifying Laravel installation...${NC}"
|
||||||
|
LARAVEL_VERSION=$(docker compose -f docker-compose.local.yml exec -T app php artisan --version)
|
||||||
|
echo "Laravel Version: $LARAVEL_VERSION"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Test route:list
|
||||||
|
echo -e "${YELLOW}Step 5: Testing route:list command...${NC}"
|
||||||
|
docker compose -f docker-compose.local.yml exec -T app php artisan route:list 2>&1 | head -20
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check for errors in logs
|
||||||
|
echo -e "${YELLOW}Step 6: Checking for errors...${NC}"
|
||||||
|
docker compose -f docker-compose.local.yml logs app | grep -i error | tail -10
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Final status
|
||||||
|
echo "========================================="
|
||||||
|
if docker compose -f docker-compose.local.yml exec -T app php artisan list > /dev/null 2>&1; then
|
||||||
|
echo -e "${GREEN}✓ Laravel 5.5 upgrade successful!${NC}"
|
||||||
|
echo -e "${GREEN} All artisan commands are working${NC}"
|
||||||
|
echo ""
|
||||||
|
echo "Next steps:"
|
||||||
|
echo " 1. Test the application: http://localhost:8080"
|
||||||
|
echo " 2. Check database migrations"
|
||||||
|
echo " 3. Test authentication flow"
|
||||||
|
echo " 4. Verify designer functionality"
|
||||||
|
else
|
||||||
|
echo -e "${RED}✗ Some issues detected${NC}"
|
||||||
|
echo "Check the logs above for details"
|
||||||
|
fi
|
||||||
|
echo "========================================="
|
||||||
|
|
||||||
|
# Keep container running
|
||||||
|
echo ""
|
||||||
|
echo "Container is running. Access it with:"
|
||||||
|
echo " docker compose -f docker-compose.local.yml exec app bash"
|
||||||
|
echo ""
|
||||||
|
echo "Stop with:"
|
||||||
|
echo " docker compose -f docker-compose.local.yml down"
|
||||||
99
test-upgrade.sh
Executable file
99
test-upgrade.sh
Executable file
@@ -0,0 +1,99 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Quick functionality test script for Laravel upgrade
|
||||||
|
# Run this after each upgrade step to verify core features
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
CONTAINER_NAME="crewsportswear_app_local"
|
||||||
|
BASE_URL="http://localhost:8082"
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo "Laravel Upgrade - Functionality Tests"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Check if container is running
|
||||||
|
if ! docker ps | grep -q "$CONTAINER_NAME"; then
|
||||||
|
echo "❌ Container $CONTAINER_NAME is not running"
|
||||||
|
echo " Start it with: docker compose -f docker-compose.local.yml up -d"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✓ Container is running"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Test 1: Artisan commands
|
||||||
|
echo "Test 1: Artisan Commands"
|
||||||
|
echo "------------------------"
|
||||||
|
docker exec $CONTAINER_NAME php artisan --version || { echo "❌ Artisan failed"; exit 1; }
|
||||||
|
echo "✓ Artisan working"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Test 2: Route list
|
||||||
|
echo "Test 2: Route Discovery"
|
||||||
|
echo "------------------------"
|
||||||
|
docker exec $CONTAINER_NAME php artisan route:list | head -5 || echo "⚠️ Route list not available (normal for Laravel 5.0-5.2)"
|
||||||
|
echo "✓ Route system loaded"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Test 3: Database connection
|
||||||
|
echo "Test 3: Database Connection"
|
||||||
|
echo "----------------------------"
|
||||||
|
docker exec $CONTAINER_NAME php -r "require 'vendor/autoload.php'; \$app = require_once 'bootstrap/app.php'; \$app->make('Illuminate\Contracts\Console\Kernel')->bootstrap(); try { DB::connection()->getPdo(); echo 'DB Connected\n'; } catch(Exception \$e) { echo 'DB Error: ' . \$e->getMessage() . '\n'; exit(1); }" || { echo "❌ Database connection failed"; exit 1; }
|
||||||
|
echo "✓ Database connected"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Test 4: HTTP Response (if app is running)
|
||||||
|
echo "Test 4: HTTP Response"
|
||||||
|
echo "----------------------"
|
||||||
|
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" $BASE_URL 2>/dev/null || echo "000")
|
||||||
|
if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "302" ]; then
|
||||||
|
echo "✓ HTTP server responding (Status: $HTTP_CODE)"
|
||||||
|
elif [ "$HTTP_CODE" = "500" ]; then
|
||||||
|
echo "⚠️ Server error (500) - Check logs"
|
||||||
|
else
|
||||||
|
echo "⚠️ Unexpected response: $HTTP_CODE"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Test 5: View compilation
|
||||||
|
echo "Test 5: View Compilation"
|
||||||
|
echo "-------------------------"
|
||||||
|
docker exec $CONTAINER_NAME php artisan view:clear || echo "⚠️ View clear unavailable"
|
||||||
|
echo "✓ Views can be cleared"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Test 6: Cache operations
|
||||||
|
echo "Test 6: Cache System"
|
||||||
|
echo "---------------------"
|
||||||
|
docker exec $CONTAINER_NAME php artisan cache:clear || { echo "❌ Cache clear failed"; exit 1; }
|
||||||
|
echo "✓ Cache system working"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Test 7: Config cache (optional)
|
||||||
|
echo "Test 7: Config System"
|
||||||
|
echo "----------------------"
|
||||||
|
docker exec $CONTAINER_NAME php artisan config:clear || echo "⚠️ Config clear unavailable"
|
||||||
|
echo "✓ Config system accessible"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Show recent logs
|
||||||
|
echo "Test 8: Error Logs"
|
||||||
|
echo "-------------------"
|
||||||
|
docker exec $CONTAINER_NAME sh -c "tail -20 /var/www/html/storage/logs/laravel.log 2>/dev/null || echo 'No log file yet (expected on fresh install)'"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo "✓ Basic functionality tests passed!"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
echo "Manual tests needed:"
|
||||||
|
echo " 1. Visit $BASE_URL in browser"
|
||||||
|
echo " 2. Test user registration/login"
|
||||||
|
echo " 3. Test sports category pages"
|
||||||
|
echo " 4. Test designer tool"
|
||||||
|
echo " 5. Test cart functionality"
|
||||||
|
echo ""
|
||||||
|
echo "View logs: docker logs $CONTAINER_NAME"
|
||||||
|
echo "Access shell: docker exec -it $CONTAINER_NAME bash"
|
||||||
|
echo ""
|
||||||
Reference in New Issue
Block a user