Compare commits
110 Commits
feature/la
...
feat/teams
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
391df3bb41 | ||
|
|
a29bca1931 | ||
|
|
bc5da01735 | ||
|
|
914e276026 | ||
|
|
2e44012b8c | ||
|
|
0fe2e2bae6 | ||
|
|
c6518e81c9 | ||
|
|
289e11f3c5 | ||
| 8eef632ebb | |||
| ef88a6b69b | |||
|
|
a410208c62 | ||
|
|
d4a6028599 | ||
|
|
4888f93eac | ||
|
|
49921a26a9 | ||
|
|
3b6e0ec447 | ||
|
|
c16203110b | ||
|
|
60fcf08cbc | ||
|
|
701a433174 | ||
|
|
47b354d8b7 | ||
|
|
dfdb48920d | ||
|
|
3dac8ee685 | ||
|
|
09974721f3 | ||
|
|
8215ad8337 | ||
|
|
368ac50729 | ||
|
|
8f094ee89c | ||
|
|
0551cb078f | ||
|
|
26620fc043 | ||
|
|
f10d6daa6f | ||
|
|
ab0d370225 | ||
|
|
ee7b52feb2 | ||
|
|
4cb77e9312 | ||
|
|
43e66c7ac4 | ||
|
|
685a49cf57 | ||
|
|
f6617f6d70 | ||
|
|
7c6108e0a7 | ||
|
|
b8aa48a0bb | ||
|
|
8fc0b1076a | ||
|
|
71e1fca6fe | ||
|
|
8dc23e4e67 | ||
|
|
729d0e72e6 | ||
|
|
0b8856d3a0 | ||
|
|
6aa0587a69 | ||
|
|
08c274f5bd | ||
|
|
148df27117 | ||
|
|
e552037e2c | ||
|
|
7011b28542 | ||
|
|
2ac9cb6420 | ||
|
|
9c403b7207 | ||
|
|
11960d6bad | ||
|
|
25f80cb16f | ||
|
|
72773a517a | ||
|
|
d1f5d38480 | ||
|
|
f5f1693f55 | ||
|
|
39165cc7f9 | ||
|
|
20b4e06ee7 | ||
|
|
18e11ac3d0 | ||
|
|
0013b2a025 | ||
|
|
acf9c2e931 | ||
|
|
c144810352 | ||
|
|
b1ed52f7a6 | ||
|
|
70b250a64e | ||
|
|
1eb7e6632f | ||
|
|
98e7652e6b | ||
|
|
852593ecfb | ||
|
|
43de35a66c | ||
|
|
ad57e218af | ||
|
|
d2a20c4831 | ||
|
|
36ad67a37a | ||
|
|
6c55194c9a | ||
|
|
77ee1b9ccc | ||
|
|
6cc68cd56b | ||
|
|
3e328b83a4 | ||
|
|
d82832043c | ||
|
|
da89856e95 | ||
|
|
bf88584dcd | ||
|
|
3eb4078d19 | ||
|
|
5918eded8c | ||
|
|
02361ca64e | ||
|
|
1ca40ce1d7 | ||
|
|
59e52125f7 | ||
|
|
bb139cb0df | ||
|
|
bca94e54cc | ||
|
|
e57209bc64 | ||
|
|
5eeefa5587 | ||
|
|
80094cfdf0 | ||
|
|
587819be9a | ||
|
|
67b52fcc1a | ||
|
|
f7b402fe7a | ||
|
|
8408695473 | ||
|
|
99f89a968b | ||
|
|
3f96f82090 | ||
|
|
942af1f0a8 | ||
|
|
4610fb526b | ||
|
|
c29936f6b9 | ||
|
|
7c12b0e2bf | ||
|
|
a5dab36a14 | ||
|
|
55f135f66c | ||
|
|
6631690f93 | ||
|
|
dd26b1dd4b | ||
|
|
155bc2ce53 | ||
|
|
ef81f0bf25 | ||
|
|
bf078c82bf | ||
|
|
2e29677b90 | ||
|
|
03ea4e84a2 | ||
|
|
3f8c116293 | ||
|
|
9bf1a888a6 | ||
|
|
542f2c64e0 | ||
|
|
1d4c9a5445 | ||
|
|
3698312664 | ||
|
|
a9145ea484 |
26
.env.local
Normal file
26
.env.local
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
# 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,6 +1,26 @@
|
|||||||
# Local Development MinIO Configuration
|
# Local Development Configuration
|
||||||
# Copy to .env.local and update with your MinIO credentials
|
# Copy to .env.local and fill in your values.
|
||||||
|
|
||||||
# MinIO credentials (get from your production server)
|
# ── MinIO credentials ─────────────────────────────────────────────────────────
|
||||||
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,3 +1,14 @@
|
|||||||
/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,30 +1,41 @@
|
|||||||
# Use PHP 7.4 with Apache for Laravel 6.x
|
# Use PHP 7.2 with Apache (mcrypt available via PECL, compatible with Laravel 5.0)
|
||||||
FROM php:7.4-apache
|
FROM php:7.2-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 \
|
RUN apt-get update && apt-get install -y --allow-unauthenticated \
|
||||||
git \
|
git \
|
||||||
curl \
|
curl \
|
||||||
libpng-dev \
|
libpng-dev \
|
||||||
libonig-dev \
|
|
||||||
libxml2-dev \
|
libxml2-dev \
|
||||||
libzip-dev \
|
libmcrypt-dev \
|
||||||
zip \
|
zip \
|
||||||
unzip \
|
unzip \
|
||||||
libfreetype6-dev \
|
libfreetype6-dev \
|
||||||
libjpeg62-turbo-dev \
|
libjpeg62-turbo-dev \
|
||||||
openssh-client \
|
openssh-client \
|
||||||
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
|
libzip-dev \
|
||||||
|
&& 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 PHP extensions (mcrypt removed - not available in PHP 7.4)
|
# Install mcrypt via PECL (removed from core in PHP 7.2)
|
||||||
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath zip
|
RUN pecl install mcrypt-1.0.4 && docker-php-ext-enable mcrypt
|
||||||
|
|
||||||
|
# Suppress E_DEPRECATED so PECL mcrypt functions don't trigger ErrorException in Laravel 5.0
|
||||||
|
RUN echo "error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT" > /usr/local/etc/php/conf.d/suppress-deprecated.ini
|
||||||
|
|
||||||
|
# Install PHP extensions
|
||||||
|
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath tokenizer zip
|
||||||
|
|
||||||
# Enable Apache mod_rewrite
|
# Enable Apache mod_rewrite
|
||||||
RUN a2enmod rewrite
|
RUN a2enmod rewrite
|
||||||
|
|
||||||
# Install Composer (version 2.x for Laravel 6.x)
|
# Install Composer 2.2 (LTS version supporting PHP 7.2+)
|
||||||
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
|
COPY --from=composer:2.2 /usr/bin/composer /usr/bin/composer
|
||||||
|
|
||||||
# Set working directory
|
# Set working directory
|
||||||
WORKDIR /var/www/html
|
WORKDIR /var/www/html
|
||||||
@@ -47,17 +58,16 @@ 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
|
# Install PHP dependencies (--no-plugins skips kylekatarnls/update-helper which is Composer 1 only)
|
||||||
# Note: composer install will be run via docker-entrypoint.sh or manually
|
RUN composer install --no-dev --no-interaction --prefer-dist --no-plugins
|
||||||
# to avoid build-time network timeouts
|
|
||||||
# RUN composer install --no-dev --no-interaction --prefer-dist --optimize-autoloader
|
|
||||||
|
|
||||||
# Generate application key (will be done at runtime)
|
# Generate application key
|
||||||
# RUN php artisan key:generate || true
|
RUN php artisan key:generate || true
|
||||||
|
|
||||||
# Cache Laravel configuration and routes (will be done at runtime)
|
# Run Laravel 5.0 optimization
|
||||||
# RUN php artisan config:cache || true
|
RUN php artisan clear-compiled && php artisan optimize
|
||||||
# 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
Normal file
17
Makefile
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
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
175
UPGRADE_NOTES.md
@@ -1,175 +0,0 @@
|
|||||||
# 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,25 +1,17 @@
|
|||||||
<?php
|
<?php namespace App\Exceptions;
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
class Handler extends ExceptionHandler
|
class Handler extends ExceptionHandler {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* A list of the exception types that are not reported.
|
* A list of the exception types that should not be reported.
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $dontReport = [
|
protected $dontReport = [
|
||||||
\Illuminate\Auth\AuthenticationException::class,
|
'Symfony\Component\HttpKernel\Exception\HttpException'
|
||||||
\Illuminate\Auth\Access\AuthorizationException::class,
|
|
||||||
\Symfony\Component\HttpKernel\Exception\HttpException::class,
|
|
||||||
\Illuminate\Database\Eloquent\ModelNotFoundException::class,
|
|
||||||
\Illuminate\Session\TokenMismatchException::class,
|
|
||||||
\Illuminate\Validation\ValidationException::class,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -27,38 +19,30 @@ class Handler extends ExceptionHandler
|
|||||||
*
|
*
|
||||||
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
|
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
|
||||||
*
|
*
|
||||||
* @param \Exception $exception
|
* @param \Exception $e
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function report(Exception $exception)
|
public function report($e)
|
||||||
{
|
{
|
||||||
parent::report($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.
|
* Render an exception into an HTTP response.
|
||||||
*
|
*
|
||||||
* @param \Illuminate\Http\Request $request
|
* @param \Illuminate\Http\Request $request
|
||||||
* @param \Exception $exception
|
* @param mixed $e
|
||||||
* @return \Illuminate\Http\Response
|
* @return \Illuminate\Http\Response
|
||||||
*/
|
*/
|
||||||
public function render($request, Exception $exception)
|
public function render($request, $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::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,32 +1,40 @@
|
|||||||
<?php namespace App\Http\Controllers\Auth;
|
<?php namespace App\Http\Controllers\Auth;
|
||||||
|
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use Illuminate\Foundation\Auth\AuthenticatesUsers;
|
use Illuminate\Contracts\Auth\Guard;
|
||||||
|
use Illuminate\Contracts\Auth\Registrar;
|
||||||
|
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
|
||||||
|
|
||||||
class AuthController extends Controller {
|
class AuthController extends Controller {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Login Controller
|
| Registration & Login Controller
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
|
||||||
| This controller handles authenticating users for the application.
|
| This controller handles the registration of new users, as well as the
|
||||||
|
| authentication of existing users. By default, this controller uses
|
||||||
|
| a simple trait to add these behaviors. Why don't you explore it?
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use AuthenticatesUsers;
|
use AuthenticatesAndRegistersUsers;
|
||||||
|
|
||||||
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()
|
public function __construct(Guard $auth, Registrar $registrar)
|
||||||
{
|
{
|
||||||
$this->middleware('guest')->except('logout');
|
$this->auth = $auth;
|
||||||
|
$this->registrar = $registrar;
|
||||||
|
|
||||||
|
$this->middleware('guest', ['except' => 'getLogout']);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,68 +0,0 @@
|
|||||||
<?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,12 +1,11 @@
|
|||||||
<?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 AuthorizesRequests, DispatchesJobs, ValidatesRequests;
|
use DispatchesCommands, ValidatesRequests;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ class MainController extends Controller {
|
|||||||
$categoryids = array();
|
$categoryids = array();
|
||||||
|
|
||||||
foreach($data as $row){
|
foreach($data as $row){
|
||||||
$categoryids[] = (string)$row->Category;
|
$categoryids[] = $row->Category;
|
||||||
}
|
}
|
||||||
|
|
||||||
$array_sports = $m->selectSportsByURL($url);
|
$array_sports = $m->selectSportsByURL($url);
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ 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;
|
||||||
|
|
||||||
@@ -46,7 +47,7 @@ class PrintPatternController extends Controller {
|
|||||||
$NewImageName = $templateSize.'.'.$imageExt;
|
$NewImageName = $templateSize.'.'.$imageExt;
|
||||||
|
|
||||||
|
|
||||||
$thumbnail = "uniform-templates/".$templatecode."/".$templateType."/SIZES/" . $NewImageName;
|
$thumbnail = "uploads/images/uniform-templates/".$templatecode."/".$templateType."/SIZES/" . $NewImageName;
|
||||||
|
|
||||||
$data = array(
|
$data = array(
|
||||||
'TemplateCode' => $templatecode,
|
'TemplateCode' => $templatecode,
|
||||||
@@ -58,9 +59,7 @@ class PrintPatternController extends Controller {
|
|||||||
$i = $m->insertPrintPattern($data);
|
$i = $m->insertPrintPattern($data);
|
||||||
//var_dump($data);
|
//var_dump($data);
|
||||||
if($i){
|
if($i){
|
||||||
$r = $request->file('preview_print_template')->move(
|
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templatecode.'/'.$templateType.'/SIZES/'.$NewImageName, file_get_contents($request->file('preview_print_template')->getRealPath()));
|
||||||
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,6 +4,7 @@ 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;
|
||||||
@@ -48,7 +49,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 url('public') . "/" . $row->Thumbnail ?>" alt="Sports" height="400px;" class="img img-responsive product-center" /></a>
|
<a href=""><img src="<?php echo minio_url($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>
|
||||||
@@ -129,15 +130,13 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
|
|
||||||
if($i){
|
if($i){
|
||||||
$request->file('tempateImage')->move(
|
Storage::disk('minio')->put('images/templates/thumbnail/' . $NewImageName, file_get_contents($request->file('tempateImage')->getRealPath()));
|
||||||
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 = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
//var_dump($svgThumbnail);
|
//var_dump($svgThumbnail);
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'TemplateCode' => $templateCode,
|
'TemplateCode' => $templateCode,
|
||||||
@@ -149,16 +148,14 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->insertTempaltePaths($Templatedata);
|
$i = $m->insertTempaltePaths($Templatedata);
|
||||||
if($i){
|
if($i){
|
||||||
$request->file('svgJerseyFront')->move(
|
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgJerseyFront')->getRealPath()));
|
||||||
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 = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'TemplateCode' => $templateCode,
|
'TemplateCode' => $templateCode,
|
||||||
@@ -170,16 +167,14 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->insertTempaltePaths($Templatedata);
|
$i = $m->insertTempaltePaths($Templatedata);
|
||||||
if($i){
|
if($i){
|
||||||
$request->file('svgJerseyBack')->move(
|
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgJerseyBack')->getRealPath()));
|
||||||
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 = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'TemplateCode' => $templateCode,
|
'TemplateCode' => $templateCode,
|
||||||
@@ -191,16 +186,14 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->insertTempaltePaths($Templatedata);
|
$i = $m->insertTempaltePaths($Templatedata);
|
||||||
if($i){
|
if($i){
|
||||||
$request->file('svgShortRight')->move(
|
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgShortRight')->getRealPath()));
|
||||||
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 = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'TemplateCode' => $templateCode,
|
'TemplateCode' => $templateCode,
|
||||||
@@ -212,9 +205,7 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->insertTempaltePaths($Templatedata);
|
$i = $m->insertTempaltePaths($Templatedata);
|
||||||
if($i){
|
if($i){
|
||||||
$request->file('svgShortLeft')->move(
|
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgShortLeft')->getRealPath()));
|
||||||
base_path() . '/public/images/uniform-templates/'.$templateCode. '/DISPLAY' , $svgName
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,9 +261,7 @@ class TemplatesController extends Controller {
|
|||||||
'PatternId' => $getSkins
|
'PatternId' => $getSkins
|
||||||
);
|
);
|
||||||
|
|
||||||
$request->file('tempateImage')->move(
|
Storage::disk('minio')->put('images/templates/thumbnail/' . $NewImageName, file_get_contents($request->file('tempateImage')->getRealPath()));
|
||||||
base_path() . '/public/images/templates/thumbnail', $NewImageName
|
|
||||||
);
|
|
||||||
|
|
||||||
}else{
|
}else{
|
||||||
|
|
||||||
@@ -298,7 +287,7 @@ class TemplatesController extends Controller {
|
|||||||
//echo 'meron jerset front';
|
//echo 'meron jerset front';
|
||||||
|
|
||||||
$svgName = $request->file('svgJerseyFront')->getClientOriginalName();
|
$svgName = $request->file('svgJerseyFront')->getClientOriginalName();
|
||||||
$svgThumbnail = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'Type' => 'Jersey',
|
'Type' => 'Jersey',
|
||||||
@@ -308,9 +297,7 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgJerseyFront']);
|
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgJerseyFront']);
|
||||||
if($i){
|
if($i){
|
||||||
$request->file('svgJerseyFront')->move(
|
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgJerseyFront')->getRealPath()));
|
||||||
base_path() . '/public/images/uniform-templates/'.$templateCode. '/DISPLAY' , $svgName
|
|
||||||
);
|
|
||||||
//echo 'image move success';
|
//echo 'image move success';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -318,7 +305,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 = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'Type' => 'Jersey',
|
'Type' => 'Jersey',
|
||||||
@@ -327,16 +314,13 @@ 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 = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'Type' => 'Shorts',
|
'Type' => 'Shorts',
|
||||||
@@ -346,15 +330,13 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgShortRight']);
|
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgShortRight']);
|
||||||
if($i){
|
if($i){
|
||||||
$request->file('svgShortRight')->move(
|
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgShortRight')->getRealPath()));
|
||||||
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 = "uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
$svgThumbnail = "uploads/images/uniform-templates/".$templateCode."/DISPLAY/".$svgName;
|
||||||
|
|
||||||
$Templatedata = array(
|
$Templatedata = array(
|
||||||
'Type' => 'Shorts',
|
'Type' => 'Shorts',
|
||||||
@@ -364,9 +346,7 @@ class TemplatesController extends Controller {
|
|||||||
|
|
||||||
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgShortLeft']);
|
$i = $m->updateTemplatePaths($Templatedata, $post['id_svgShortLeft']);
|
||||||
if($i){
|
if($i){
|
||||||
$request->file('svgShortLeft')->move(
|
Storage::disk('minio')->put('uploads/images/uniform-templates/'.$templateCode.'/DISPLAY/'.$svgName, file_get_contents($request->file('svgShortLeft')->getRealPath()));
|
||||||
base_path() . '/public/images/uniform-templates/'.$templateCode. '/DISPLAY' , $svgName
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
46
app/Http/Controllers/TestEmailController.php
Normal file
46
app/Http/Controllers/TestEmailController.php
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
<?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->StoreId;
|
$defId = $grouped_item[0]->StoreId;
|
||||||
} else {
|
} else {
|
||||||
$defId = 0;
|
$defId = 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -761,10 +761,7 @@ class UserController extends Controller
|
|||||||
);
|
);
|
||||||
|
|
||||||
$u = $UserModel->insertNewProductThumbnails($thumbs);
|
$u = $UserModel->insertNewProductThumbnails($thumbs);
|
||||||
// var_dump($thumbs);
|
Storage::disk('minio')->put('images/' . $thumbnail, file_get_contents($request->file('imgupload')[$i]->getRealPath()));
|
||||||
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));
|
||||||
@@ -808,9 +805,7 @@ class UserController extends Controller
|
|||||||
);
|
);
|
||||||
|
|
||||||
$u = $UserModel->insertNewProductThumbnails($thumbs);
|
$u = $UserModel->insertNewProductThumbnails($thumbs);
|
||||||
Storage::disk('sftp')->put($thumbnail, fopen($request->file('upload_images')[$i], 'r+')); //live
|
Storage::disk('minio')->put('images/' . $thumbnail, file_get_contents($request->file('upload_images')[$i]->getRealPath()));
|
||||||
//Storage::disk('localdir')->put($thumbnail, fopen($request->file('upload_images')[$i], 'r+'));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -826,9 +821,8 @@ class UserController extends Controller
|
|||||||
$id = $request->thumb_id;
|
$id = $request->thumb_id;
|
||||||
$UserModel = new UserModel;
|
$UserModel = new UserModel;
|
||||||
|
|
||||||
$storagePath = Storage::disk('sftp')->getDriver()->getAdapter()->getPathPrefix();
|
if (Storage::disk('minio')->exists('images/' . $file)) {
|
||||||
if (file_exists($storagePath . $file)) {
|
Storage::disk('minio')->delete('images/' . $file);
|
||||||
unlink($storagePath . $file);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$i = $UserModel->deleteImageThumb('Id', $id);
|
$i = $UserModel->deleteImageThumb('Id', $id);
|
||||||
@@ -973,11 +967,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('uploads')->put('/teamstore/' . $orig_store_url . '/' . $store_logo_name, fopen($request->file('store_logo'), 'r+'));
|
Storage::disk('minio')->put('uploads/images/teamstore/' . $orig_store_url . '/' . $store_logo_name, file_get_contents($request->file('store_logo')->getRealPath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($request->file('store_banner') != null) {
|
if ($request->file('store_banner') != null) {
|
||||||
Storage::disk('uploads')->put('/teamstore/' . $orig_store_url . '/' . $store_banner_name, fopen($request->file('store_banner'), 'r+'));
|
Storage::disk('minio')->put('uploads/images/teamstore/' . $orig_store_url . '/' . $store_banner_name, file_get_contents($request->file('store_banner')->getRealPath()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json(array(
|
return response()->json(array(
|
||||||
|
|||||||
@@ -10,31 +10,12 @@ class Kernel extends HttpKernel {
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $middleware = [
|
protected $middleware = [
|
||||||
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
|
'Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode',
|
||||||
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
|
'Illuminate\Cookie\Middleware\EncryptCookies',
|
||||||
\App\Http\Middleware\TrimStrings::class,
|
'Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse',
|
||||||
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
|
'Illuminate\Session\Middleware\StartSession',
|
||||||
];
|
'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',
|
|
||||||
],
|
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -43,17 +24,14 @@ class Kernel extends HttpKernel {
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $routeMiddleware = [
|
protected $routeMiddleware = [
|
||||||
'auth' => \App\Http\Middleware\Authenticate::class,
|
'auth' => 'App\Http\Middleware\Authenticate',
|
||||||
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
|
'auth.basic' => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
|
||||||
'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
|
'guest' => 'App\Http\Middleware\RedirectIfAuthenticated',
|
||||||
'can' => \Illuminate\Auth\Middleware\Authorize::class,
|
'teamstoresession' => 'App\Http\Middleware\CheckTeamStorePassword',
|
||||||
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
|
'admin' => '\App\Http\Middleware\IsAdmin',
|
||||||
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
|
'normaluser' => '\App\Http\Middleware\IsUser',
|
||||||
'teamstoresession' => \App\Http\Middleware\CheckTeamStorePassword::class,
|
'isAuthorized' => '\App\Http\Middleware\isAuthorized',
|
||||||
'admin' => \App\Http\Middleware\IsAdmin::class,
|
'cors' => 'App\Http\Middleware\Cors',
|
||||||
'normaluser' => \App\Http\Middleware\IsUser::class,
|
|
||||||
'isAuthorized' => \App\Http\Middleware\isAuthorized::class,
|
|
||||||
'cors' => \App\Http\Middleware\Cors::class,
|
|
||||||
];
|
];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,18 +0,0 @@
|
|||||||
<?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,6 +41,10 @@ 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)->first();
|
$i = DB::table('sports')->where('URL', '=', $url)->get();
|
||||||
$id = $i->Id;
|
$id = $i[0]->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)->first();
|
$i = DB::table('sports')->where('URL', '=', $url)->get();
|
||||||
$id = $i->Id;
|
$id = $i[0]->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')
|
||||||
->first();
|
->get();
|
||||||
return $i;
|
return $i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@ 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 {
|
||||||
|
|
||||||
@@ -27,6 +29,21 @@ 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);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -40,6 +57,10 @@ 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,20 +1,24 @@
|
|||||||
<?php
|
<?php namespace App\Providers;
|
||||||
|
|
||||||
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()
|
public function boot(Dispatcher $dispatcher)
|
||||||
{
|
{
|
||||||
// Command bus mapping removed in Laravel 5.5+
|
$dispatcher->mapUsing(function($command)
|
||||||
// Commands are now auto-discovered
|
{
|
||||||
|
return Dispatcher::simpleMapping(
|
||||||
|
$command, 'App\Commands', 'App\Handlers\Commands'
|
||||||
|
);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -26,4 +30,5 @@ class BusServiceProvider extends ServiceProvider
|
|||||||
{
|
{
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,11 +19,12 @@ 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()
|
public function boot(DispatcherContract $events)
|
||||||
{
|
{
|
||||||
parent::boot();
|
parent::boot($events);
|
||||||
|
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,12 @@
|
|||||||
<?php
|
<?php namespace App\Providers;
|
||||||
|
|
||||||
namespace App\Providers;
|
use Illuminate\Routing\Router;
|
||||||
|
|
||||||
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.
|
* This namespace is applied to the controller routes in your routes file.
|
||||||
*
|
*
|
||||||
* In addition, it is set as the URL generator's root namespace.
|
* In addition, it is set as the URL generator's root namespace.
|
||||||
*
|
*
|
||||||
@@ -19,51 +17,28 @@ class RouteServiceProvider extends ServiceProvider
|
|||||||
/**
|
/**
|
||||||
* Define your route model bindings, pattern filters, etc.
|
* Define your route model bindings, pattern filters, etc.
|
||||||
*
|
*
|
||||||
|
* @param \Illuminate\Routing\Router $router
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function boot()
|
public function boot(Router $router)
|
||||||
{
|
{
|
||||||
parent::boot();
|
parent::boot($router);
|
||||||
|
|
||||||
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Define the routes for the application.
|
* Define the routes for the application.
|
||||||
*
|
*
|
||||||
|
* @param \Illuminate\Routing\Router $router
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
public function map()
|
public function map(Router $router)
|
||||||
{
|
{
|
||||||
$this->mapApiRoutes();
|
$router->group(['namespace' => $this->namespace], function($router)
|
||||||
|
{
|
||||||
$this->mapWebRoutes();
|
require app_path('Http/routes.php');
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Define the "web" routes for the application.
|
|
||||||
*
|
|
||||||
* These routes all receive session state, CSRF protection, etc.
|
|
||||||
*
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected function mapWebRoutes()
|
|
||||||
{
|
|
||||||
Route::middleware('web')
|
|
||||||
->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
16
bootstrap/cache/packages.php
vendored
@@ -1,16 +0,0 @@
|
|||||||
<?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
187
bootstrap/cache/services.php
vendored
@@ -1,187 +0,0 @@
|
|||||||
<?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,24 +5,21 @@
|
|||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"type": "project",
|
"type": "project",
|
||||||
"require": {
|
"require": {
|
||||||
"php": "^7.2",
|
"laravel/framework": "5.0.*",
|
||||||
"laravel/framework": "^6.0",
|
"webpatser/laravel-uuid": "^2.0",
|
||||||
"laravel/helpers": "^1.1",
|
|
||||||
"laravel/tinker": "^2.0",
|
|
||||||
"webpatser/laravel-uuid": "^3.0",
|
|
||||||
"netshell/paypal": "dev-master",
|
"netshell/paypal": "dev-master",
|
||||||
"guzzlehttp/guzzle": "^6.3",
|
"guzzlehttp/guzzle": "~5.0",
|
||||||
"google/recaptcha": "~1.1",
|
"google/recaptcha": "~1.1",
|
||||||
"spatie/laravel-analytics": "^3.0",
|
"spatie/laravel-analytics": "^1.4",
|
||||||
"league/flysystem-sftp": "^1.0",
|
"league/flysystem-sftp": "^1.0",
|
||||||
"aws/aws-sdk-php": "~3.0"
|
"league/flysystem-aws-s3-v3": "~1.0",
|
||||||
|
"aws/aws-sdk-php": "~3.0",
|
||||||
|
"psr/http-message": "^1.0",
|
||||||
|
"guzzlehttp/psr7": "^1.4"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"facade/ignition": "^1.4",
|
"phpunit/phpunit": "~4.0",
|
||||||
"fzaninotto/faker": "^1.4",
|
"phpspec/phpspec": "~2.1"
|
||||||
"mockery/mockery": "^1.0",
|
|
||||||
"nunomaduro/collision": "^3.0",
|
|
||||||
"phpunit/phpunit": "^8.0"
|
|
||||||
},
|
},
|
||||||
|
|
||||||
"autoload": {
|
"autoload": {
|
||||||
@@ -42,21 +39,20 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"post-autoload-dump": [
|
"post-install-cmd": [
|
||||||
"Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
|
"php artisan clear-compiled",
|
||||||
"@php artisan package:discover --ansi"
|
"php artisan optimize"
|
||||||
],
|
],
|
||||||
"post-root-package-install": [
|
"post-update-cmd": [
|
||||||
"@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
|
"php artisan clear-compiled",
|
||||||
|
"php artisan optimize"
|
||||||
],
|
],
|
||||||
"post-create-project-cmd": [
|
"post-create-project-cmd": [
|
||||||
"@php artisan key:generate --ansi"
|
"php -r \"copy('.env.example', '.env');\"",
|
||||||
|
"php artisan key:generate"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
"config": {
|
"config": {
|
||||||
"preferred-install": "dist",
|
"preferred-install": "dist"
|
||||||
"allow-plugins": {
|
|
||||||
"kylekatarnls/update-helper": true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
4556
composer.lock
generated
Normal file
4556
composer.lock
generated
Normal file
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' => 'AES-256-CBC',
|
'cipher' => MCRYPT_RIJNDAEL_128,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
@@ -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', // Removed in Laravel 5.3+
|
'Illuminate\Routing\ControllerServiceProvider',
|
||||||
'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', // Commented out - version 2.x needs reconfiguration
|
'Spatie\LaravelAnalytics\LaravelAnalyticsServiceProvider',
|
||||||
|
|
||||||
],
|
],
|
||||||
|
|
||||||
|
|||||||
@@ -4,59 +4,64 @@ return [
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Authentication Defaults
|
| Default Authentication Driver
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| 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"
|
||||||
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'defaults' => [
|
|
||||||
'guard' => 'web',
|
|
||||||
'passwords' => 'users',
|
|
||||||
],
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| Authentication Guards
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
'guards' => [
|
|
||||||
'web' => [
|
|
||||||
'driver' => 'session',
|
|
||||||
'provider' => 'users',
|
|
||||||
],
|
|
||||||
|
|
||||||
'api' => [
|
|
||||||
'driver' => 'token',
|
|
||||||
'provider' => 'users',
|
|
||||||
'hash' => false,
|
|
||||||
],
|
|
||||||
],
|
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| User Providers
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
'providers' => [
|
|
||||||
'users' => [
|
|
||||||
'driver' => 'eloquent',
|
'driver' => 'eloquent',
|
||||||
'model' => App\User::class,
|
|
||||||
],
|
|
||||||
],
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
| Resetting Passwords
|
| Authentication Model
|
||||||
|--------------------------------------------------------------------------
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| 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.
|
||||||
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
'passwords' => [
|
'model' => 'App\User',
|
||||||
'users' => [
|
|
||||||
'provider' => 'users',
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Authentication Table
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| 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',
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| Password Reset Settings
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
|
|
||||||
|
| 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' => [
|
||||||
|
'email' => 'emails.password',
|
||||||
'table' => 'password_resets',
|
'table' => 'password_resets',
|
||||||
'expire' => 60,
|
// 'expire' => 60,
|
||||||
],
|
|
||||||
],
|
],
|
||||||
|
|
||||||
];
|
];
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ return [
|
|||||||
'port' => 22,
|
'port' => 22,
|
||||||
'username' => 'root',
|
'username' => 'root',
|
||||||
'password' => '',
|
'password' => '',
|
||||||
'privateKey' => '/var/www/html/_key/instance2/root.ppk',
|
'privateKey' => '/var/keys/root.ppk',
|
||||||
'root' => '/var/www/html/images',
|
'root' => '/var/www/html/images',
|
||||||
'timeout' => 10
|
'timeout' => 10
|
||||||
],
|
],
|
||||||
@@ -88,7 +88,7 @@ return [
|
|||||||
],
|
],
|
||||||
|
|
||||||
'minio' => [
|
'minio' => [
|
||||||
'driver' => 's3',
|
'driver' => 'minio',
|
||||||
'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,6 +18,7 @@ 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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,32 +0,0 @@
|
|||||||
<?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');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
<?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,6 +31,7 @@ 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,3 +1,19 @@
|
|||||||
|
# ─────────────────────────────────────────────────────────────────────────────
|
||||||
|
# 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
|
||||||
@@ -27,15 +43,9 @@ 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_HOST=db
|
- DB_PORT=${DB_PORT:-3306}
|
||||||
- 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/
|
||||||
@@ -58,15 +68,65 @@ 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
|
||||||
@@ -89,3 +149,4 @@ networks:
|
|||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
db_data:
|
db_data:
|
||||||
|
vendor_local:
|
||||||
|
|||||||
@@ -28,9 +28,18 @@ 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,5 +13,11 @@ 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 "$@"
|
||||||
|
|||||||
90
public/designer/js/centering_guidelines.js
Normal file
90
public/designer/js/centering_guidelines.js
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
/**
|
||||||
|
* 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('/login') }}">Login</a></li>
|
<li><a href="{{ url('/auth/login') }}">Login</a></li>
|
||||||
<li><a href="{{ url('/register') }}">Register</a></li>
|
<li><a href="{{ url('/auth/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>
|
||||||
|
|||||||
@@ -48,7 +48,7 @@
|
|||||||
<div class="col-xs-12">
|
<div class="col-xs-12">
|
||||||
<hr />
|
<hr />
|
||||||
<p class="text-center">Don't have an account? Register Now!</p>
|
<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>
|
<a href="{{ url('/auth/register') }}" type="submit" id="btn-login" class="btn btn-primary btn-block">Register</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -125,7 +125,7 @@
|
|||||||
<div class="col-xs-12">
|
<div class="col-xs-12">
|
||||||
<hr />
|
<hr />
|
||||||
<p class="text-center">Have already an account?</p>
|
<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>
|
<a href="{{ url('/auth/login') }}" type="submit" id="btn-login" class="btn btn-success btn-block">Login here</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -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="https://rawgit.com/fabricjs/fabric.js/master/lib/centering_guidelines.js"></script>
|
<script src="{{asset('/designer/js/centering_guidelines.js')}}"></script>
|
||||||
<script src="https://rawgit.com/fabricjs/fabric.js/master/lib/aligning_guidelines.js"></script>
|
<script src="{{asset('/designer/js/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="{{ config('site_config.images_url') }}/{{ $img->Image }}">
|
<img style="height: 200px; overflow: hidden; object-fit: contain;" src="{{ minio_url('images/' . $img->Image) }}">
|
||||||
@endif
|
@endif
|
||||||
@endforeach
|
@endforeach
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
23
resources/views/emails/test.blade.php
Normal file
23
resources/views/emails/test.blade.php
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
<!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>
|
||||||
@@ -50,10 +50,10 @@
|
|||||||
</li>
|
</li>
|
||||||
@else
|
@else
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ url('/login') }}" title="Login">Sign in</a>
|
<a href="{{ url('/auth/login') }}" title="Login">Sign in</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="{{ url('/register') }}" title="Register">Register</a>
|
<a href="{{ url('/auth/register') }}" title="Register">Register</a>
|
||||||
</li>
|
</li>
|
||||||
@endif
|
@endif
|
||||||
|
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@if($row && count($row) > 0)
|
@if(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" >
|
||||||
@@ -138,7 +138,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="{{ config('site_config.images_url') }}/{{ $img->Image }}">
|
<img class="previewImage" src="{{ minio_url('images/' . $img->Image) }}">
|
||||||
@endif
|
@endif
|
||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -64,7 +64,7 @@
|
|||||||
<table class="table">
|
<table class="table">
|
||||||
|
|
||||||
<tr>
|
<tr>
|
||||||
<td rowspan="2" class="text-center"><img class="previewImage" src="http://{{ config('site_config.images_url') }}/{{ $item->Image }} "></td>
|
<td rowspan="2" class="text-center"><img class="previewImage" src="{{ minio_url('images/' . $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,14 +8,8 @@
|
|||||||
<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">
|
<li class="active"> {{ $array_sports[0]->SportsName }} </li>
|
||||||
@if($array_sports && $array_sports->count() > 0)
|
|
||||||
{!! $array_sports->first()->SportsName !!}
|
|
||||||
@else
|
|
||||||
Category
|
|
||||||
@endif
|
|
||||||
</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -24,12 +18,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 ?? 'default.png')) }}" alt="{{ $r->Category ?? 'Category' }}" class="image" />
|
<img src="{{ minio_url('uploads/images/sports-category/' . $r->Thumbnail) }}" alt="{{ $r->Category }}" class="image" />
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
<h3 class="sports-title">{{ $r->Category ?? 'Unknown' }}</h3>
|
<h3 class="sports-title">{{ $r->Category }}</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,14 +7,17 @@
|
|||||||
@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: 40px;
|
margin-top: 34px;
|
||||||
margin-bottom: 40px;
|
margin-bottom: 24px;
|
||||||
|
|
||||||
}
|
}
|
||||||
/* h2:after {
|
/* h2:after {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
@@ -41,6 +44,15 @@
|
|||||||
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;
|
||||||
@@ -51,19 +63,107 @@
|
|||||||
border-bottom: 2px solid #4B8E4B;
|
border-bottom: 2px solid #4B8E4B;
|
||||||
}
|
}
|
||||||
.thumbnail{
|
.thumbnail{
|
||||||
/* opacity:0.70; */
|
|
||||||
-webkit-transition: all 0.5s;
|
-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;
|
||||||
}
|
}
|
||||||
.thumbnail>img{
|
.products-grid {
|
||||||
height:201.84px;
|
margin-top: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.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{
|
||||||
@@ -127,6 +227,164 @@
|
|||||||
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">
|
||||||
@@ -147,19 +405,99 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<h2>FEATURED PRODUCTS</h2>
|
<h2 class="featured-title">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>
|
<p><b>Please read:</b></p>
|
||||||
@@ -172,58 +510,172 @@
|
|||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@else
|
|
||||||
<div class="col-md-12">
|
|
||||||
<div class="alert alert-warning">
|
|
||||||
<p><b>Please read:</b></p>
|
|
||||||
1. Items purchased are made on demand. Orders will be shipped based on dates set by your store administrator.<br>
|
|
||||||
2. Store payments are processed through PayPal. A PayPal account is not required to make a purchase.<br>
|
|
||||||
@if($store_array[0]->Id == 222)
|
|
||||||
3. Orders will be batch processed on a monthly basis, please allow 4-6 weeks for delivery.<br>
|
|
||||||
@else
|
|
||||||
3. Orders will be batch processed on a weekly basis, please allow 2-3 weeks for delivery.<br>
|
|
||||||
@endif
|
|
||||||
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>
|
|
||||||
5. Expect shipping delays due to COVID-19.<br>
|
|
||||||
6. All sales are final. No returns or exchanges will be accepted.<br><br>
|
|
||||||
|
|
||||||
<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>
|
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
<!-- BEGIN PRODUCTS -->
|
|
||||||
|
|
||||||
@foreach($product_array as $i => $product)
|
{{-- ── Product grid ── --}}
|
||||||
@if($product->PrivacyStatus == "public")
|
<div class="row products-grid">
|
||||||
@foreach($thumbnails as $t => $thumb)
|
<div class="col-md-12 text-center" v-if="filtered.length === 0">
|
||||||
@if($thumb['product_id'] == $product->Id)
|
<p class="empty-state">No products found in this category.</p>
|
||||||
@define $storeFolder = $thumb['folder']
|
</div>
|
||||||
@define $filename = $thumb['thumb']
|
<div class="col-md-3 col-sm-6 product-col" v-for="p in filtered" :key="p.id">
|
||||||
@endif
|
<div class="product-card">
|
||||||
@endforeach
|
<a :href="productUrl(p)" class="product-image-link">
|
||||||
|
<img class="product-image" :src="imgUrl(p)" :alt="p.name">
|
||||||
<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>
|
</a>
|
||||||
<h4 class="text-center product-name-holder">{{ $product->ProductName }}</h4>
|
<div class="product-card-body">
|
||||||
<hr class="line">
|
<h4 class="text-center product-name-holder">@{{ p.name }}</h4>
|
||||||
<div class="row">
|
<div class="product-card-footer">
|
||||||
<div class="col-md-7 col-sm-7">
|
<p class="price">@{{ p.price }} <small class="price-currency">@{{ store.currency }}</small></p>
|
||||||
<p class="price">{{ $product->ProductPrice }} <small style="font-size: 15px;"> {{ $store_array[0]->StoreCurrency }}</small></p>
|
<a :href="productUrl(p)" class="btn btn-success btn-view-details">View Details</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</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>{{-- /ts-app --}}
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
@endif
|
|
||||||
@endforeach
|
|
||||||
<!-- END PRODUCTS -->
|
|
||||||
|
|
||||||
</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,6 +7,45 @@
|
|||||||
@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;
|
||||||
@@ -30,7 +69,8 @@
|
|||||||
box-shadow: 0px 0px 10px #4bc6ff;
|
box-shadow: 0px 0px 10px #4bc6ff;
|
||||||
} */
|
} */
|
||||||
.line{
|
.line{
|
||||||
margin-bottom: 5px;
|
margin: 14px 0;
|
||||||
|
border-color: #e5e7eb;
|
||||||
}
|
}
|
||||||
@media screen and (max-width: 770px) {
|
@media screen and (max-width: 770px) {
|
||||||
.right{
|
.right{
|
||||||
@@ -117,18 +157,45 @@
|
|||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.carousel-control.left {
|
#myCarousel {
|
||||||
margin-left: -35px;
|
position: relative;
|
||||||
margin-top: 7px;
|
width: 100%;
|
||||||
}
|
|
||||||
|
|
||||||
.carousel-control.right {
|
|
||||||
margin-right: -35px;
|
|
||||||
margin-top: 7px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.carousel-control {
|
.carousel-control {
|
||||||
width: 0%;
|
width: 34px;
|
||||||
|
height: 34px;
|
||||||
|
top: 50%;
|
||||||
|
margin-top: -17px;
|
||||||
|
opacity: 1;
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.carousel-control.left {
|
||||||
|
left: -18px;
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.carousel-control.right {
|
||||||
|
right: -18px;
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.carousel-control .glyphicon {
|
||||||
|
width: 34px;
|
||||||
|
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,
|
||||||
@@ -139,11 +206,127 @@
|
|||||||
|
|
||||||
.hide-bullets {
|
.hide-bullets {
|
||||||
list-style:none;
|
list-style:none;
|
||||||
margin-left: -40px;
|
margin-left: 0;
|
||||||
margin-top:20px;
|
margin-top: 0;
|
||||||
|
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: 40px;
|
margin-top: 24px;
|
||||||
}
|
}
|
||||||
.roster-input{
|
.roster-input{
|
||||||
border-radius: 0px;
|
border-radius: 0px;
|
||||||
@@ -208,12 +391,49 @@
|
|||||||
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">
|
<div class="container product-page">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<nav aria-label="breadcrumb">
|
<nav aria-label="breadcrumb" class="product-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>
|
||||||
@@ -224,23 +444,23 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
|
|
||||||
<div class="col-md-5 col-sm-5">
|
<div class="col-md-5 col-sm-5">
|
||||||
<div class="row">
|
<div class="main-gallery-card">
|
||||||
<div class="col-sm-12" id="carousel-bounding-box">
|
<div 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 style="height:400px;" src="{{ config('site_config.images_url') }}/{{ $thumbnail->Image }}">
|
<img class="main-product-image" src="{{ minio_url('images/' . $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 style="height:400px;" src="{{ config('site_config.images_url') }}/{{ $thumbnail->Image }}">
|
<img class="main-product-image" src="{{ minio_url('images/' . $thumbnail->Image) }}">
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
@endif
|
@endif
|
||||||
@@ -248,7 +468,6 @@
|
|||||||
@endforeach
|
@endforeach
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Carousel nav -->
|
|
||||||
<a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
|
<a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev">
|
||||||
<span class="glyphicon glyphicon-chevron-left"></span>
|
<span class="glyphicon glyphicon-chevron-left"></span>
|
||||||
</a>
|
</a>
|
||||||
@@ -257,35 +476,30 @@
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- </div> -->
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<hr class="line">
|
<hr class="line">
|
||||||
|
|
||||||
<div class="row">
|
<ul class="hide-bullets row">
|
||||||
<div class="col-md-12">
|
|
||||||
<ul class="hide-bullets">
|
|
||||||
@define $j = 0
|
@define $j = 0
|
||||||
@foreach($thumbnails_array as $thumbnail)
|
@foreach($thumbnails_array as $thumbnail)
|
||||||
<li class="col-sm-3 col-xs-3">
|
<li class="col-sm-3 col-xs-3">
|
||||||
<a class="thumbnail a_thumbnail {{ $thumbnail->ImageClass }}" id="carousel-selector-{{ $j }}">
|
<a class="thumbnail a_thumbnail {{ $thumbnail->ImageClass }}" id="carousel-selector-{{ $j }}">
|
||||||
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ config('site_config.images_url') }}/{{ $thumbnail->Image }}"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $thumbnail->Image) }}"/>
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
@define $j++
|
@define $j++
|
||||||
@endforeach
|
@endforeach
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-md-7 col-sm-7">
|
<div class="col-md-7 col-sm-7">
|
||||||
<div class="panel panel-default">
|
<div class="product-info-card">
|
||||||
<div class="panel-heading">
|
<h1 class="product-title">{{ $product_array[0]->ProductName }}</h1>
|
||||||
<h1>{{ $product_array[0]->ProductName }}</h1> <p class="price">{{ $product_array[0]->ProductPrice }} <small> {{ $store_array[0]->StoreCurrency }} </small></p>
|
<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">
|
||||||
@@ -300,13 +514,18 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="description-card">
|
||||||
|
<h3 class="description-title">Description</h3>
|
||||||
|
<p class="description-text">{{ $product_array[0]->ProductDescription }}</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="spacer-top"></div>
|
<div class="spacer-top"></div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
<ul class="nav nav-tabs" role="tablist">
|
<ul class="nav nav-tabs" role="tablist">
|
||||||
<li role="presentation" class="active"><a href="#productDescription" aria-controls="productDescription" role="tab" data-toggle="tab">Description</a></li>
|
<li role="presentation" class="active"><a href="#productDescription" aria-controls="productDescription" role="tab" data-toggle="tab">More Details</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
<!-- Tab panes -->
|
|
||||||
<div class="tab-content">
|
<div class="tab-content">
|
||||||
<div role="tabpanel" class="tab-pane active" id="productDescription">
|
<div role="tabpanel" class="tab-pane active" id="productDescription">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -320,7 +539,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
</div> <!-- container -->
|
</div> <!-- container -->
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,64 +2,188 @@
|
|||||||
@section('content')
|
@section('content')
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
a.thumbnail>img {
|
body {
|
||||||
/* height: 250px; */
|
background: #f4f6f8;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hide-bullets {
|
.store-page {
|
||||||
list-style:none;
|
padding-top: 14px;
|
||||||
margin-left: -40px;
|
padding-bottom: 26px;
|
||||||
margin-top:20px;
|
|
||||||
position: relative;
|
|
||||||
}
|
}
|
||||||
.thumbnail{
|
|
||||||
border: none;
|
.store-header {
|
||||||
display: unset;
|
margin-bottom: 14px;
|
||||||
background-color: transparent;
|
|
||||||
}
|
}
|
||||||
.li-custom{
|
|
||||||
padding:10px;
|
.store-title {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 24px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: #111827;
|
||||||
}
|
}
|
||||||
.store-logo{
|
|
||||||
/* height: 250px;
|
.store-subtitle {
|
||||||
width: 250px;
|
margin: 6px 0 0;
|
||||||
|
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;
|
||||||
object-fit: contain; */
|
height: 100%;
|
||||||
/* cursor: pointer; */
|
transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.store-card:hover {
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
a.thumbnail>img{
|
|
||||||
height: 150px
|
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
<div class="container">
|
<div class="container store-page">
|
||||||
<div class="row">
|
<div class="row store-header">
|
||||||
<div class="col-lg-12">
|
<div class="col-lg-12">
|
||||||
<h2 style="font-size: 20px; font-weight: bold; ">TEAM STORES</h2>
|
<h2 class="store-title">Team Stores</h2>
|
||||||
<hr>
|
<p class="store-subtitle">Browse and open your team store.</p>
|
||||||
</div>
|
</div>
|
||||||
</div><!-- /row -->
|
</div>
|
||||||
|
|
||||||
|
<div class="store-toolbar">
|
||||||
|
<form role="search" id="frm_search_store">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<!-- <div class="col-sm-12"> -->
|
<div class="col-md-8 col-sm-7">
|
||||||
<!-- <div class="well"> -->
|
<label>Search Store</label>
|
||||||
<form class="form-horizontal" role="search" id="frm_search_store">
|
|
||||||
<div class="col-lg-7">
|
|
||||||
<div class="form-group">
|
|
||||||
<div class="col-sm-12">
|
|
||||||
<label>Seach Store</label>
|
|
||||||
<div class="input-group">
|
<div class="input-group">
|
||||||
<input type="text" class="form-control" placeholder="Search Store" value="{{ $keyword }}" name="q">
|
<input type="text" class="form-control" placeholder="Search store" value="{{ $keyword }}" name="q">
|
||||||
<div class="input-group-btn">
|
<div class="input-group-btn">
|
||||||
<button class="btn btn-default" type="submit"><i class="fa fa-search"></i></button>
|
<button class="btn btn-default" type="submit"><i class="fa fa-search"></i></button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<div class="col-md-4 col-sm-5">
|
||||||
</div>
|
<label>Sort by</label>
|
||||||
<div class="col-lg-5">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-7 control-label hidden-xs"> </label>
|
|
||||||
<div class="col-sm-5">
|
|
||||||
<label>Sort by:</label>
|
|
||||||
<select class="form-control" name="s" id="select_sort_stores">
|
<select class="form-control" name="s" id="select_sort_stores">
|
||||||
<option @if($filter == "al-asc") selected @endif value="al-asc">Store Name A → Z</option>
|
<option @if($filter == "al-asc") selected @endif value="al-asc">Store Name A → Z</option>
|
||||||
<option @if($filter == "al-desc") selected @endif value="al-desc">Store Name Z → A</option>
|
<option @if($filter == "al-desc") selected @endif value="al-desc">Store Name Z → A</option>
|
||||||
@@ -68,42 +192,47 @@
|
|||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
<div class="clearfix"></div>
|
|
||||||
<!-- </div> -->
|
|
||||||
<!-- </div> -->
|
|
||||||
</div>
|
</div>
|
||||||
<div class="row" id="slider-thumbs">
|
|
||||||
<!-- Bottom switcher of slider -->
|
<div id="slider-thumbs">
|
||||||
<ul class="hide-bullets">
|
<ul class="store-grid row">
|
||||||
@foreach ($stores_array as $store)
|
@foreach ($stores_array as $store)
|
||||||
<li class="li-custom col-lg-3 col-md-3 col-sm-4 col-xs-12">
|
<li class="col-lg-3 col-md-4 col-sm-6 col-xs-12">
|
||||||
<div style="border: 1px solid #dddddd; padding: 5px;">
|
<div class="store-card">
|
||||||
@if($store->Password != null )
|
@if($store->Password != null)
|
||||||
<a class="thumbnail password-protected" href="#" data-store-id="{{ $store->Id }}" data-store-url="{{ $store->StoreUrl }}">
|
<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) }}">
|
<img class="store-logo" src="{{ minio_url('uploads/images/teamstore/' . $store->ImageFolder . '/' . $store->StoreLogo) }}">
|
||||||
|
</div>
|
||||||
</a>
|
</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>
|
<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>
|
||||||
@else
|
@else
|
||||||
<a class="thumbnail" href="{{ url('teamstore') . '/' . $store->StoreUrl }}">
|
<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) }}">
|
<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>
|
</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
|
@endif
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@endforeach
|
@endforeach
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
|
||||||
|
<div class="row store-pagination">
|
||||||
<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><!-- /container -->
|
</div>
|
||||||
|
|
||||||
|
|
||||||
<div id="team-store-login" class="modal fade" role="dialog">
|
<div id="team-store-login" class="modal fade" role="dialog">
|
||||||
|
|||||||
56
resources/views/test-email.blade.php
Normal file
56
resources/views/test-email.blade.php
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
@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="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png" alt="{{ $row->DesignName }}" id="main-thumbnail" class="img img-responsive">
|
<img src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-{{ strtolower($row1->Side) }}-thumbnail.png"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png" alt="{{ $row->DesignName }}" >
|
<img src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') . '/images/' . $array_thumbnail_display[0]->Image }}">
|
<img class="previewImage" id="active_thumbnail" src="{{ minio_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="{{ config('site_config.images_url') }}/{{ $img->Image }}">
|
<img class="previewImage" src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png" alt="{{ $row->DesignName }}" id="main-thumbnail" class="img img-responsive">
|
<img src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-{{ strtolower($row1->Side) }}-thumbnail.png"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $filename . '?t=' . time() }}" alt="{{ $product->ProductName }}" >
|
<img style="height:200px" src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $filename . '?t=' . time() }}" alt="{{ $product->ProductName }}" >
|
<img style="height:200px" src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png" alt="{{ $row->DesignName }}" id="main-thumbnail" class="img img-responsive">
|
<img src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-front-thumbnail.png"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $row->DesignCode }}-{{ strtolower($row1->Side) }}-thumbnail.png"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $thumbnail->Image . '?t=' . time() }}" id="main-thumbnail">
|
<img style="height:400px" src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $thumbnail->Image . '?t=' . time() }}"/>
|
<img class="img img-responsive product-center image-thumbnails" style="height: 59.45px;" src="{{ minio_url('images/' . $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="{{ config('site_config.images_url') }}/{{ $thumbnail->Image . '?t=' . time() }}"/></td>
|
<td><img class="img img-responsive product-center" style="height: 59.45px;" src="{{ minio_url('images/' . $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>
|
||||||
|
|||||||
@@ -1,22 +0,0 @@
|
|||||||
<?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
190
routes/web.php
@@ -1,190 +0,0 @@
|
|||||||
<?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
23
test-key.php
@@ -1,23 +0,0 @@
|
|||||||
<?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";
|
|
||||||
}
|
|
||||||
@@ -1,88 +0,0 @@
|
|||||||
#!/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"
|
|
||||||
@@ -1,99 +0,0 @@
|
|||||||
#!/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